IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

Parallélisation d'un appel à "new"


Sujet :

SDL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 68
    Points : 41
    Points
    41
    Par défaut Parallélisation d'un appel à "new"
    Re bonjour tous le monde, c'est encore moi.
    La on tombe de haut la parallélisation semble échouer à cause des "new"

    quand on fait des 100 000 new string
    avec 1 thread ça prend 104 ms sur un QuadCore

    et maintenant le plus étrange
    quand on fait des 400 000 string *s = new string(""),
    avec 4 threads sur un QuadCore, ça prend 900 ms par thread !!! (chaque thread faisant 100000 new)

    une création de variable (string s = "" se parallélise sans problème.

    Est-ce que quelqu'un déjà eut ce type de problème ? Quels solutions ? (à part ne pas utiliser les "new")

    voici le code d'exemple, évidement vous ne pourrais pas voir le problème si vous n'avez pas au minimum un dual-core.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #include "stdafx.h"
    #ifdef WIN32
    #pragma comment(lib, "../SDL-1.2.11/lib/SDL.lib")
    #pragma comment(lib, "../SDL-1.2.11/lib/SDLmain.lib")
    #endif
     
    #include "../SDL-1.2.11/include/SDL.h"
    #include <string>
    #include <iostream>
     
    using namespace std;
    int InstanceString( void *data )
    {
    	int countS = 0;
    	Uint32 lastDt=SDL_GetTicks(), dtS;
    	while (true)
    	{
    		//string *s = new string(); delete s;	//ne se parallélise pas
    		for (int i =0; i < 30; i++) string s = ""; //fonctionne correctement
     
    		countS++;
    		if (countS%100000 ==0)
    		{
    			dtS = SDL_GetTicks();
    			cout << "\n" << dtS - lastDt;
    			lastDt = dtS;
    		}
    	}
    	return 0;
    }
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	SDL_CreateThread( InstanceString, (void*)NULL);
    	SDL_CreateThread( InstanceString, (void*)NULL);
    	SDL_CreateThread( InstanceString, (void*)NULL);
    	SDL_CreateThread( InstanceString, (void*)NULL);//*/
    	int inte;
    	cin >> inte;
    }

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    J'imagine que les allocations de mémoire sont thread-safe, et qu'à chaque new les 3 autres threads sont mis en attente, ce qui pourrait expliquer la chute de performances.
    Ce n'est qu'une hypothèse.

  3. #3
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Laurent Gomila
    J'imagine que les allocations de mémoire sont thread-safe, et qu'à chaque new les 3 autres threads sont mis en attente, ce qui pourrait expliquer la chute de performances.
    Ce n'est qu'une hypothèse.
    Exact, la solution à adopter est encore une fois logique :

    - Soit mettre la création des strings comme section critique et donc chaque thread entrera une fois pour créer ses strings et ensuite aura sa propre mémoire

    - Soit chaque thread alloue un grand bloc mémoire dans lequel il travaille seul et tu t'occupes de la gestion mémoire

    - Soit le thread principale joue le rôle de maître, alloue tout au départ et distribue.

    Jc

  4. #4
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    De plus ce n'est jamais bon de faire 400 000 allocation mémoire, si on cherche à faire quelque chose de performant !

    Donc finalement es ce que new est un "vrai" problème ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 68
    Points : 41
    Points
    41
    Par défaut
    merci pour votre reactivité
    c'est bien ce que je pensais le new est thread safe mais ils ont vraiment fait ca comme des cochons ...

    Citation Envoyé par fearyourself
    Exact, la solution à adopter est encore une fois logique :

    - Soit mettre la création des strings comme section critique et donc chaque thread entrera une fois pour créer ses strings et ensuite aura sa propre mémoire
    j'ai deja esseyer les resultat sont meilleur mais franchement pas terrible, mais meilleur que sans, c'est deja implementé

    - Soit chaque thread alloue un grand bloc mémoire dans lequel il travaille seul et tu t'occupes de la gestion mémoire
    bonne idée mais dans notre cas comme les objets alloués vont être integré dans une structure commune aux threads ça deviendrait un peu compliquer...

    - Soit le thread principale joue le rôle de maître, alloue tout au départ et distribue.
    Jc
    difficile car le maitre ne sais pas les besoins des esclaves ...


    la direction actuelle est de reutiliser les objets obsoletes au lieu de les crees
    et de mettre en section critique la creation s'il y a besoin

    merci de confirmer mes soupcons
    c'est tout de meme fou que la synchro soit si mal faite ...

    Ls

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    la direction actuelle est de reutiliser les objets obsoletes au lieu de les crees
    Dans ce cas tu devrais utiliser une stratégie de type pool. Genre en utilisant boost::pool (c'est qu'une idée, j'ai jamais vraiment fait).

    c'est tout de meme fou que la synchro soit si mal faite ...
    Ben là je crois que c'est à toi de faire en sorte qu'elle soit meilleure, rien n'est magique

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 68
    Points : 41
    Points
    41
    Par défaut
    j'ai fait un vecteur pour faire mon pool
    et je le protege par une zone critique bon ca ne marche pas encore je verais ca demain

  8. #8
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Citation Envoyé par Lsong
    merci de confirmer mes soupcons
    c'est tout de meme fou que la synchro soit si mal faite ...
    Le "tas" est partagé entre tous les threads et ne fait aucune supposition sur l'endroit d'où tu dois allouer, libérer la mémoire. Encore heureux qu'il soit thread safe ! Et le programmeur a tout de meme quelques responsabilités..

    une création de variable (string s = "" ) se parallélise sans problème.
    Si tu dois faire beaucoup de "petites" allocations locales (dont la durée de vie n'excede pas le scope de la fonction), rien ne vaut la pile : la pile est par thread (donc thread safe sans synchro) et l'allocation est ultra rapide puisqu'il s'agit d'ajouter deux nombres.

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 68
    Points : 41
    Points
    41
    Par défaut
    ça ne me dérange pas que le tas soit thread safe, mais je ne pensais pas que ça soit 4 fois plus long de faire des new ... les section critique font mieux ...
    bon je me replonge dans l'histoire

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo