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

Threads & Processus C++ Discussion :

Performances d�grad�es en dehors des threads


Sujet :

Threads & Processus C++

  1. #1
    Membre confirm�
    Profil pro
    Enseignant
    Inscrit en
    Septembre 2011
    Messages
    43
    D�tails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : Enseignant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 43
    Par d�faut Performances d�grad�es en dehors des threads
    Bonjour,

    J'ai multi thread� certaines parties d'un programme d'astronomie que je maintiens et dont certaines boucles de calculs �taient faciles � parall�liser. (simple grosse boucle for avec � l'int�rieur des calculs ind�pendants) J'ai donc utilis� un thread pool pour cela, adapt� � mon processeur et c'est g�nial, la partie que j'ai thread� va plus vite c�d qu'il faut moins de temps d'ex�cution pour r�aliser la tache demand�e. (sur un 4 core, je gagne entre 30% et 40% de temps d'ex�cution) Et j'en suis tr�s content car c'�tait le but initial de mon travail.

    avant:

    Pour chaque frame
    - Fonction1
    - Fonction2
    - Fonction3
    - Fonction4
    - Fonction5
    - Fonction6
    - Fonction7
    - Fonction8
    - Fonction9
    - Fonction10
    Fin pour

    maintenant:

    Pour chaque frame
    - Fonction1
    - Fonction2 thread�e
    --- un thread
    --- un thread
    --- un thread
    --- un thread
    - Fonction3
    - Fonction4
    - Fonction5
    - Fonction6 thread�e
    --- un thread
    --- un thread
    --- un thread
    --- un thread
    - Fonction7
    - Fonction8
    - Fonction9 thread�e
    --- un thread
    --- un thread
    --- un thread
    --- un thread
    - Fonction10
    Fin pour





    J'ai environ 50 grosses fonctions et j'en ai parall�lis� 4. (forc�ment les plus gourmandes en temps)

    Sauf que j'ai remarqu� apr�s que tout le reste de mon programme mettait plus de temps � s'ex�cuter. Je veux dire par la que les parties non thread�es, qui ne sont pas pas du tout li�es � ma partie thread�e s'ex�cutent entre 5% � 60% moins vite...

    J'ai fais de nombreux tests de comparaison (50x, chacun, dans des conditions strict identiques) avant de vous �crire ce message. J'ai utilis� pour cela std::chrono afin de d�terminer le temps mis � l'ex�cution de toutes mes fonctions, thread�es ou non.

    Aussi je suis perdu. Je ne vous ait pas mis de code car il y en a trop � lire pour rentrer dans le projet.

    Est ce que ce que je vous d�cris peut exister (thread rapide mais reste devient plus lent) ou c'est moi qui ait fait une impl�mentation bancale ?

    Ce sympt�me, s'il existe, a-t-il un nom ? (que je puisse demander � Google de m'aider !)


    Merci pour votre aide !

    Cordialement

  2. #2
    Invit�
    Invit�(e)
    Par d�faut
    Citation Envoy� par tickyletroll Voir le message
    (simple grosse boucle for avec � l'int�rieur des calculs ind�pendants) J'ai donc utilis� un thread pool pour cela,
    Bonjour.
    A premi�re vue, pour parall�liser ce genre de boucles, il vaut mieux utiliser OpenMP, et �viter de terminer/recr�er les threads entre chaque section parall�le.

    Citation Envoy� par tickyletroll Voir le message
    et c'est g�nial, la partie que j'ai thread� va plus vite c�d qu'il faut moins de temps d'ex�cution pour r�aliser la tache demand�e. (sur un 4 core, je gagne entre 30% et 40% de temps d'ex�cution)
    Sur 4 coeurs, c'est un gain de 400% qui serait g�nial. 40% c'est plut�t tr�s mauvais (ou alors que le calcul ne se pr�te pas bien � la parall�lisation).
    Tu devrais peut-�tre poser ton probl�me sur la section "Programmation parall�le, calcul scientifique et de haute performance (HPC)" du forum.

  3. #3
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 505
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 505
    Par d�faut
    Utilisez un profiler pour voir o� et pourquoi les performances se d�gradent.

  4. #4
    Membre confirm�
    Profil pro
    Enseignant
    Inscrit en
    Septembre 2011
    Messages
    43
    D�tails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : Enseignant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 43
    Par d�faut
    Merci pour vos r�ponses.

    Je vais m'y atteler de ce pas.

    Cordialement,

  5. #5
    Membre confirm�
    Profil pro
    Enseignant
    Inscrit en
    Septembre 2011
    Messages
    43
    D�tails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : Enseignant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 43
    Par d�faut
    Je reviens vers vous.

    J'ai utilis� des debuggers mais je ne vois pas ce qui cloche. Je suis sous linux et j'ai utilis� Valgrind et perf.
    J'ai vu de nombreuses informations, mais rien que ne me parle suite � mon probl�me.
    En fait, je ne suis pas capable seul de trouver ce qui cloche.
    Avec quel outil (m�me texte) peut on voir ce qui se passe au niveau des core d'un CPU ?
    DE tous les rapports que j'ai, sur quoi dois je me focaliser ?

    J'ai alors thread� une autre fonction afin d'ex�cuter une autre boucle plus rapidement.
    (ce n'�tait pas une boucle de calcul math�matique)

    A nouveau m�mes sympt�mes:
    - la fonction thread�e voit sa dur�e d'ex�cution divis�e par deux.
    - les autres fonctions voient leur temps d�ex�cution rallong� de 15 � 300%.

    J'ai ex�cut� mon code sur diff�rentes machines.
    En mono thread et ensuite avec une grosse fonction coup�e en thread.

    Sur des AMD type AMD Athlon(tm) X4 740 socket FM2+ ou AM3+, le sympt�me d�crit est bien visible.

    Sur un INTEL i5-6500 c'est la catastrophe: les autres fonctions voient leur temps d�ex�cution rallong� de 300%.

    Mais ...

    Sur un INTEL i5-4460, c'est normal , je veux dire que la partie thread�e va deux fois plus vite, et les autres fonctions vont aussi vite que si j'avais lanc� mon programme en un bloc mono-thread. HOURA !
    Cela m'a �vit� de devenir compl�tement fou car je ne comprenais pas pourquoi en threadant une fonction toutes les autres se voyaient beaucoup ralentir. Un peu j'aurais compris mais beaucoup ... non

    J'ai lanc� de nombreux tests sur toutes mes machines avant de vous �crire.

    Je pensais que j'�tais entrain d'exploser le cache des CPU, les Intels ont 6Mb de cache chacun et les AMD 4Mb. Mais non, les 2 i5 ont un comportement bien distinct pour une m�me valeur de cache.

    Pouvez vous m'aider ?



    Cordialement,

  6. #6
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    D�marrer des threads c'est lent, on ne sait toujours pas si tu utilises une threadpool correctement ou non ni quel(s) m�canisme(s) de synchronisation tu utilises � la fin de tes threads.
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  7. #7
    Membre confirm�
    Profil pro
    Enseignant
    Inscrit en
    Septembre 2011
    Messages
    43
    D�tails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : Enseignant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 43
    Par d�faut
    Je me suis tourn� vers github et je me suis bas� sur le code suivant :
    https://github.com/progschj/ThreadPool

    J'ai investi dans ce livre: C++_Concurrency_in_Action

    Dans la classe cibl�e, j'ai une fonction de calcul computePosition qui traite chacun des �l�ments que contient la classe. Comme il n'y a aucun lien de traitement d'un �l�ment � un autre, que les �l�ments sont interchangeables, je me suis dit que d�couper cette boucle en la traitant avec des threads serait une id�e...

    J'ai donc transform� la fonction computePosition pour la rendre thread-safe et c'est cette fonction que j'appelle � travers une fonction wrapper afin de me conformer avec le code ThreadPool de Github.
    J'ai cr�e un mutex pour �viter que les threads �crivent � la sortie n'importe comment leur r�sultat dans un vector.

    Ce qui donne en particulier : (j'ai mis une version simplifi�e)

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    classe StarNavigator
    ...
    public:
            void computePosition(Vec3f pos);
    private:
    	static bool thread_wrapper(StarNavigator *a, unsigned int indice)
    		{return a->computeChunk(indice);};
     
    	bool computeChunk(unsigned int indice);
     
    	ThreadPool * pool=nullptr;
    	std::vector< std::future<bool> > results;
    Le constructeur cr�e artisanalement pour le moment le ThreadPool:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    pool = new ThreadPool(std::thread::hardware_concurrency());
    ma fonction computePosition est alors appel�e dans la boucle principale de mon programme, elle se comporte ainsi:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void StarNavigator::computePosition(Vec3f pos) 
    {
            ....
    	for(unsigned int i=0; i<nbPaquets; i++)
    		this->results.emplace_back( pool->enqueue( StarNavigator::thread_wrapper, this, i) );
     
    	for(auto && result: results)
    		result.get();
    	results.clear();
    }
    la fonction computeChunk r�alise un traitement du type:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void StarNavigator::computeChunk(unsigned int i) 
    {
            ....
            //série de calculs sur l'élément i en question
            //détermination de propriétés de l'objet
            //cela met un certain temps à être fait
            ....
            ....
            mutex.lock();
            ajout dans un vecteur de quelques valeurs
            mutex.unlock();
    }
    C'est artisanal mais cela fait son effet, la dur�e d'ex�cution de la fonction computePosition est bien plus courte avec l'utilisation des threads pour r�aliser la t�che qui lui est demand�e.
    J'ai aussi compar� les sorties de la classe avec les threads, elles correspondent (� la permutation pr�t des �l�ments du vecteur de sortie)


    Merci pour votre aide.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 0
    Dernier message: 22/04/2014, 17h15
  2. R�ponses: 3
    Dernier message: 20/08/2010, 13h11
  3. [reseaux] Gestion des threads en perl
    Par totox17 dans le forum Programmation et administration syst�me
    R�ponses: 2
    Dernier message: 28/11/2002, 09h40
  4. Programmer des threads
    Par haypo dans le forum C
    R�ponses: 6
    Dernier message: 02/07/2002, 13h53

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