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

C++ Discussion :

parall�liser un code en C++ ?


Sujet :

C++

  1. #1
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2010
    Messages
    2 051
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 2 051
    Par d�faut parall�liser un code en C++ ?
    Bonjour tous,
    une fois de plus je sollicite votre aide...

    j'ai entendu parler vaguement de "parall�lisation" pour diminuer les temps de calcul et je voudrais appliquer cela � un programme que j'ai r�alis� j'ai r�alis� en C++.
    ==> le probl�me: de parall�lisation je ne connais que le nom je ne sais pas comment appliquer cela, de plus je suis un "gros d�butant en programmation" j'aurais besoin de quelques pistes....

    1�) mon programme:
    - il r�cup�re les donn�es d'un fichier texte et classe cela dans 400000 vectors o� il y a environ 1000 donn�es pour chacun.

    - une fois que cela est r�cup�r� on lance une fonction qui fait un certain calcul (qui dure au maximum 1min) pour chaque vector et on enregistre les resultats dans un vector de 400000lignes.

    2�) ce que je voudrais faire

    je voudrais faire deux choses en parall�le: r�cup�rer les donn�es et lancer les calculs car je pense que le temps de r�cup�ration de toutes ces donn�es doit �tre long (cette partie du programme n'est pas achev�e) et je voudrais d�s que j'ai un vector lancer le calcul mais tout en continuant en tache de font � r�cuper les autres vectors.


    3�) questions:
    - es ce possible de faire avec n'importe quel langage de programmation? et donc avec le c++?
    - avez vous des pistes/liens qui explique comment faire ou pouvez vous me donner des pistes ou des exemples sur des cas simples?

    Merci d'avance pour votre aide


  2. #2
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    D�veloppeur C
    Inscrit en
    Ao�t 2004
    Messages
    2 366
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur C

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 2 366
    Par d�faut
    Ce que tu veux faire est un programme multi-thread.
    1 thread pour l'acquisition
    1 thread pour le calcul

    Comme tout programme multi-thread il faut g�rer la synchro entre les threads.
    Il y a plein d'exemple sur le Net, et il y a s�rement un cours sur ce site.

    Tu peux d�velopper en .NET (VB.NET, C#), C/C++, Java ... pour faire �a.

  3. #3
    Membre chevronn� Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    D�tails du profil
    Informations personnelles :
    �ge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Par d�faut
    Bonjour!

    Avant de chercher � parral�liser, il faut se poser la question suivante: "Mon programme n�cessite-t-il plusieurs processus?"

    A savoir: est-il n�cessaire reprendre ton programme (parral�liser est souvent tr�s lourd den terme de refactoring) ou des optimisations pourraient suffire?

    Sinon, beaucoup de langages sont parral�lisables (java, C, C++, python...), certains ne le sont pas (VBA).

    Pour faire �a, il faut bien comprendre ce qu'est un processus, et un processus l�ger (thread). Tu peux t'orienter vers boost::thread ou libpthread (plus orient� fonctionnel je crois).

    Il faut isoler les traitement. Sur le papier, tu regardes � quel moment tu peux d�clencher quel traitement. Il faut �tre s�r qu'un thread ne va pas tout bloquer (un autre l'attend) et que les variables sont correctement prot�g�es (oui, il y a un espace m�moire commun avec les processus l�gers, � toi de le g�rer).

    Les principaux danger avec les threads sont:
    * Les goulots: tu pensais am�liorer ton programme, mais il met 4 fois plus de temps � cause d'un thread qui fait goulot).

    * Ce que j'appelle le faux threading: au final tu as une succession de thread qui d�pendent de leur p�re, tu n'as rien parral�lis� (dans certains cas �a peut �tre le but recherch�, mais assez rarement)

    * Les interblocages: l� c'est un art.. Il faut prot�ger les ressources partag�es entre les threads. Il faut � tout prix �tre s�r que quand un thread veut acc�der � une ressource (lecteur CD.. Fichier), il est le seul � le faire pour �viter qu'un petit mariole aille modifier les donn�es que tu es en train de lire.

    Renseigne toi sur les s�maphores, les files de messages et les moniteur pour voir les diff�rentes probl�matiques et leurs solutions.

    Dans ton cas, il y a plusieurs approches..

    * Un processus lit les lignes du fichier, et � mesure que les objets sont disponibles, un autre processus effectue le calcul.

    * Plusieurs processus lisent des blocs du fichier (par exemple un processus lit 10 lignes et les traite, et tu mets plusieurs processus :p ). A mon avis une de splus int�ressante.

    * Un processus lit le fichier et plusieurs s'occupent du calcul

    * Plusieurs lisent le fichier et un seul fait le calcul

    * Plusieurs lisent le fichier et plusieurs font les calculs (� mon avis une des plus mauvaise..)

    Et il y en a d'autres...

  4. #4
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2010
    Messages
    2 051
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 2 051
    Par d�faut
    merci d'avoir pris le temps de r�pondre

    Citation Envoy� par fregolo52 Voir le message
    Ce que tu veux faire est un programme multi-thread.
    1 thread pour l'acquisition
    1 thread pour le calcul
    merci d�j� je viens d'apprendre deux nouveaux mots

    Citation Envoy� par fregolo52 Voir le message
    Comme tout programme multi-thread il faut g�rer la synchro entre les threads.
    oui, cela je ne pense que ca ne doit pas �tre trop compliqu� en utilsant des mot clef du type "pause" et "stop" dans le programme lorsqu'un des thread est fini...
    ce qui m'inquiete plus est comment lancer telle tache sur tel processeur ou autre et qu'elles sont les mots clefs et fonction pour faire cela...

    Citation Envoy� par fregolo52 Voir le message
    Il y a plein d'exemple sur le Net, et il y a s�rement un cours sur ce site.
    Tu peux d�velopper en .NET (VB.NET, C#), C/C++, Java ... pour faire �a.
    je d�j� regard� avec les mots clefs que tu m'as donn� et il y a effectivement beaucoup plus de r�ponses!

  5. #5
    Membre chevronn� Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    D�tails du profil
    Informations personnelles :
    �ge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Par d�faut
    En g�n�ral, il est plus prudent de laisser le scheduleur attribuer les threads aux diff�rents processeurs. Dans 99% des cas, on ne peut que r�gler l'affinit� avec un processeur, le scheduleur va le prendre en compte et essayer de complaire � tes attentes, mais c'est sans garanties.

    C'est un peu plus compliqu� que pause et start, mais c'est �a (mot clef: yield)

    Et pour prot�ger une ressource, c'est P() et V() (en g�n�ral, je crois que �a vient d'une convention hongroise un truc du genre..).


    edit:
    Les noms canoniques P et V venez des initiales de Hollandais mots. V stands pour verhogen, ou � augmentation �. Plusieurs explications ont �t� donn�es pour P (y compris passeer pour le � passage �, probeer � essai �, et pakken le � encavateur �), mais en fait le Dijkstra a �crit qu'il a pr�vu P pour se tenir pour pr�par� valise mot prolaag,[1] abr�viation verlagen de te de probeer, ou � essayer-et-diminuez � [1][2] (A moins ambigu, et une traduction en anglais plus pr�cise et seraient � essai�- diminution ".)

  6. #6
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    D�veloppeur C
    Inscrit en
    Ao�t 2004
    Messages
    2 366
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur C

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 2 366
    Par d�faut
    Eh oui !! Le plus compliqu� dans une recherche c'est d'avoir les bons mots cl�s !!

  7. #7
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2010
    Messages
    2 051
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 2 051
    Par d�faut
    salut seeme, merci pour cette reponse tr�s complete
    Citation Envoy� par seeme Voir le message
    Avant de chercher � parral�liser, il faut se poser la question suivante: "Mon programme n�cessite-t-il plusieurs processus?"
    je n'ai pas bien compris: tu veux dire que si la lecture prends 30sec et les calculs 30min ca sert � rien de parall�liser, c'est cela ou j'ai mal compris ce que tu voulais dire?

    Citation Envoy� par seeme Voir le message
    A savoir: est-il n�cessaire reprendre ton programme (parral�liser est souvent tr�s lourd den terme de refactoring) ou des optimisations pourraient suffire?
    mon programme n'est pas tr�s long et assez modulable donc pas de probl�me de ce cot� l�. cot� optimisation je ne peux pas faire beaucoup mieux je pense car il est vraiment classique.


    Citation Envoy� par seeme Voir le message
    Sinon, beaucoup de langages sont parral�lisables (java, C, C++, python...), certains ne le sont pas (VBA).
    ok, moi j'utilise C/C++ mais j'aurais peut etre quelque chose � faire en fortran plus tard. est il parall�lisable?

    Citation Envoy� par seeme Voir le message
    Pour faire �a, il faut bien comprendre ce qu'est un processus, et un processus l�ger (thread). Tu peux t'orienter vers boost::thread ou libpthread (plus orient� fonctionnel je crois).
    Il faut isoler les traitement. Sur le papier, tu regardes � quel moment tu peux d�clencher quel traitement. Il faut �tre s�r qu'un thread ne va pas tout bloquer (un autre l'attend) et que les variables sont correctement prot�g�es (oui, il y a un espace m�moire commun avec les processus l�gers, � toi de le g�rer).
    Les principaux danger avec les threads sont:
    * Les goulots: tu pensais am�liorer ton programme, mais il met 4 fois plus de temps � cause d'un thread qui fait goulot).
    * Ce que j'appelle le faux threading: au final tu as une succession de thread qui d�pendent de leur p�re, tu n'as rien parral�lis� (dans certains cas �a peut �tre le but recherch�, mais assez rarement)
    * Les interblocages: l� c'est un art.. Il faut prot�ger les ressources partag�es entre les threads. Il faut � tout prix �tre s�r que quand un thread veut acc�der � une ressource (lecteur CD.. Fichier), il est le seul � le faire pour �viter qu'un petit mariole aille modifier les donn�es que tu es en train de lire.
    Rensegne toi sur les s�maphores, les files de messages et les moniteur pour voir les diff�rentes probl�matiques et leurs solutions.
    Dans ton cas, il y a plusieurs approches..
    * Un processus lit les lignes du fichier, et � mesure que les objets sont disponibles, un autre processus effectue le calcul.
    * Plusieurs processus lisent des blocs du fichier (par exemple un processus lit 10 lignes et les traite, et tu mets plusieurs processus :p ). A mon avis une de splus int�ressante.
    * Un processus lit le fichier et plusieurs s'occupent du calcul
    * Plusieurs lisent le fichier et un seul fait le calcul
    * Plusieurs lisent le fichier et plusieurs font les calculs (� mon avis une des plus mauvaise..)
    Et il y en a d'autres...
    je vais regarder tous cela, merci pour ces pistes

    Citation Envoy� par seeme Voir le message
    En g�n�ral, il est plus prudent de laisser le scheduleur attribuer les threads aux diff�rents processeurs. Dans 99% des cas, on ne peut que r�gler l'affinit� avec un processeur, le scheduleur va le prendre en compte et essayer de complaire � tes attentes, mais c'est sans garanties.
    C'est un peu plus compliqu� que pause et start, mais c'est �a (mot clef: yield)
    Et pour prot�ger une ressource, c'est P() et V() (en g�n�ral, je crois que �a vient d'une convention hongroise un truc du genre..).
    d'accord, merci pour ces infos

  8. #8
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    D�veloppeur C
    Inscrit en
    Ao�t 2004
    Messages
    2 366
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur C

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 2 366
    Par d�faut
    Citation Envoy� par seeme Voir le message
    * Ce que j'appelle le faux threading: au final tu as une succession de thread qui d�pendent de leur p�re, tu n'as rien parral�lis� (dans certains cas �a peut �tre le but recherch�, mais assez rarement)
    Ca reste quand m�me le plus simple. Tu fais plusieurs threads dans un m�me processus. Ca �vite les contraintes multi-processus, il y en aura d�j� avec avec les synchros et les inter-blocage !!

    salut seeme, merci pour cette reponse tr�s complete

    Envoy� par seeme
    Avant de chercher � parral�liser, il faut se poser la question suivante: "Mon programme n�cessite-t-il plusieurs processus?"
    je n'ai pas bien compris: tu veux dire que si la lecture prends 30sec et les calculs 30min ca sert � rien de parall�liser, c'est cela ou j'ai mal compris ce que tu voulais dire?
    En effet, ca ne sert � rien (� part pour apprendre), sauf si tu peux parall�liser la partie calcul.

  9. #9
    Membre chevronn� Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    D�tails du profil
    Informations personnelles :
    �ge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Par d�faut
    En fait mes 2 premi�res remarques viennent d'experience sur un forum de d�butants. La plupart cherchaient � parral�liser l� o� en fait un peu de logique permettait de passer par exemple de O(e^n) � O(n).

    Mais is tu as de l'experience et que tu sais que ton code est bien comme �a et que les gains en optimisation seront minimes, ne t'angoisse pas et regarde le multi thread

    Je ne connais pas fortran mais une recherche rapide sur google montre qu'il existe des lib et des backends avec pthread par exemple. Donc oui, �a doit �tr e possible.

  10. #10
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2010
    Messages
    2 051
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 2 051
    Par d�faut
    Citation Envoy� par fregolo52 Voir le message
    En effet, ca ne sert � rien (� part pour apprendre), sauf si tu peux parall�liser la partie calcul.
    - tu as raison rien que pour apprendre qu'es ce que parall�liser je pense que je vais essayer.

    - par contre pour l'utilit� je ne sais pas trop car je n'ai pas la notion du temps de calcul pour lire toutes ces donn�es (et comme je ne les ai pas encore je ne peux pas faire le test)

  11. #11
    Membre chevronn� Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    D�tails du profil
    Informations personnelles :
    �ge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Par d�faut
    Je pense que c'ets le calcul qui va prendre le plus de temps. Et l� �a devient clairement plus complexe (d�pendant de la nature de ton calcul). Il faut essayer de d�couper ton calcul en �tapes qui ne soient pas d�pendantent.

    Donc si tu as disons 3 �tapes A, B, C avec A et B ind�pendant, et C qui d�pend de A et de B, tu peux essayer de parral�liser le calcul de A et de B avec C qui attent les r�sultats des 2 autres.

    Note: fait attention � ne pas tomber dans le pi�ge de l'attente active...

  12. #12
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2010
    Messages
    2 051
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 2 051
    Par d�faut
    Citation Envoy� par seeme Voir le message
    Mais is tu as de l'experience et que tu sais que ton code est bien comme �a et que les gains en optimisation seront minimes, ne t'angoisse pas et regarde le multi thread
    en fait je n'ai pas beaucoup d'exp�rience en C++ (quasiment =0) mais comme mon programme est tr�s court je ne pense pas que je peux optimiser grand chose.
    la seule chose qui prend du temps est la gestion du pas de calcul et cela je vais essayer de l'optimiser au mieux.

    Citation Envoy� par seeme Voir le message
    Je pense que c'ets le calcul qui va prendre le plus de temps. Et l� �a devient clairement plus complexe (d�pendant de la nature de ton calcul). Il faut essayer de d�couper ton calcul en �tapes qui ne soient pas d�pendantent.
    le calcul n'est pas parallelisable car j'ai 3 �tapes totalement d�pendantes...

    Citation Envoy� par seeme Voir le message
    Note: fait attention � ne pas tomber dans le pi�ge de l'attente active...
    qu'es ce que c'est que cela?

  13. #13
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    Je dirais que si tu veux parall�liser simplement et efficacement, il ne faut pas parler thread, ni semaphore (les P et V), ni rien de ces routines bas niveau et complexes � utiliser.

    D�j�, il faut se poser la question : Est-ce que mes calculs sont ind�pendant les uns des autres. Ici, �a a l'air d'�tre le cas : Chaque vecteur peut �tre trait� � part des autres, et en parall�le (sauf l'�criture du r�sultat final, mais l� aussi, comme on �crit dans des cases diff�rentes, si le vecteru a �t� pr� allou�, pas de soucis).

    Ensuite, prendre une biblioth�que adapt�e, comme Intel TBB (libre), ou PPL de microsoft. Ou une extention au C++ comme OpenMP.

    Et alors, tout ce que tu auras � faire est de remplacer ta boucle principale par une version parall�le de cette boucle.
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  14. #14
    Membre chevronn� Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    D�tails du profil
    Informations personnelles :
    �ge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Par d�faut
    J'avoue que j'ai appris uniquement en bas niveau et n'ai pas encore eu besoin d'aller plus haut niveau.

    L'attente active, c'est par exemple un

    while(!continuer){}
    avec continuer un booleen � l'�tape n-1. Ici on attend que l'�tape pr�c�dente soit termin�e, mais c'est une mani�re � �viter (tu manges des cycles CPU � ne rien faire), il existe d'autres moyens.

    Les seules fois o� j'ai d� faire de l'attente active c'�tait en ASM sur un processeur ARM (et encore, la plupart du temps on peut s'en tirer avec les interuptions.. mais bon c'est un autre sujet :p )

  15. #15
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2010
    Messages
    2 051
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 2 051
    Par d�faut
    salut loic,

    Citation Envoy� par JolyLoic Voir le message
    Je dirais que si tu veux parall�liser simplement et efficacement, il ne faut pas parler thread, ni semaphore (les P et V), ni rien de ces routines bas niveau et complexes � utiliser.
    ca m'interesse beaucoup tout cela, car plus c'est facile mieux c'est.

    Citation Envoy� par JolyLoic Voir le message
    D�j�, il faut se poser la question : Est-ce que mes calculs sont ind�pendant les uns des autres. Ici, �a a l'air d'�tre le cas : Chaque vecteur peut �tre trait� � part des autres, et en parall�le (sauf l'�criture du r�sultat final, mais l� aussi, comme on �crit dans des cases diff�rentes, si le vecteru a �t� pr� allou�, pas de soucis).
    oui c'est bien cela mon cas.

    Citation Envoy� par JolyLoic Voir le message
    Ensuite, prendre une biblioth�que adapt�e, comme Intel TBB (libre), ou PPL de microsoft. Ou une extention au C++ comme OpenMP.
    Et alors, tout ce que tu auras � faire est de remplacer ta boucle principale par une version parall�le de cette boucle.
    quand je serais en train de mettre tout cela en place, si je n'y arrive pas je pense que je vous relancerez pour un coup de main

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

Discussions similaires

  1. Parall�lisation de code
    Par cecile38 dans le forum G�n�ral Java
    R�ponses: 6
    Dernier message: 22/03/2012, 12h06
  2. [Oracle 10g] Parall�liser du code PL/SQL
    Par Yoh dans le forum Oracle
    R�ponses: 3
    Dernier message: 06/05/2011, 12h07
  3. Outils pour parall�liser du code Java
    Par LGnord dans le forum EDI et Outils pour Java
    R�ponses: 3
    Dernier message: 12/07/2010, 10h01
  4. Parall�liser un morceau de code
    Par yann_m dans le forum Fortran
    R�ponses: 7
    Dernier message: 09/10/2007, 12h48
  5. Parall�lisation de code Java sur plusieurs machines
    Par Jester dans le forum API standards et tierces
    R�ponses: 8
    Dernier message: 05/12/2006, 12h01

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