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++

Vue hybride

membreComplexe12 paralléliser un code en C++ ? 10/01/2011, 11h36
fregolo52 Ce que tu veux faire est un... 10/01/2011, 11h47
membreComplexe12 :ccool: merci d'avoir pris le... 10/01/2011, 11h57
seeme En général, il est plus... 10/01/2011, 12h03
seeme En fait mes 2 premières... 10/01/2011, 12h13
fregolo52 Eh oui !! Le plus compliqué... 10/01/2011, 12h06
seeme Bonjour! Avant de chercher... 10/01/2011, 11h56
membreComplexe12 salut seeme, merci pour cette... 10/01/2011, 12h06
fregolo52 Ca reste quand même le plus... 10/01/2011, 12h12
membreComplexe12 - tu as raison rien que pour... 10/01/2011, 12h16
seeme Je pense que c'ets le calcul... 10/01/2011, 12h21
Message précédent Message précédent   Message suivant Message suivant
  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 é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!

  4. #4
    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 ".)

  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 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.

  6. #6
    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?

  7. #7
    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 !!

  8. #8
    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...

  9. #9
    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

  10. #10
    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.

  11. #11
    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)

  12. #12
    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...

+ 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