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 :

question de débutant concernant la parallélisation


Sujet :

Threads & Processus C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Octobre 2016
    Messages : 8
    Points : 3
    Points
    3
    Par défaut question de débutant concernant la parallélisation
    Bonjour à tous,

    Je souhaiterais paralléliser mes calculs mais je ne sais pas trop comment m'y prendre. Si vous avez quelques suggestions je suis preneur. Voilà en quelques mots mon "problème" :


    Je crée N objets du même type et fonctionnant "indépendamment".

    ces objets ont entre autres une méthode X qui prend en argument un tableau de double et renvoie un double.

    Ensuite j'ai deux boucles for imbriquées

    J'ai une boucle itérative (le nombre d'itérations est très grand),

    dans cette boucle pour chaque objet N j'appelle la méthode X, récupère tous les résultats puis à partir du lot de résultats je redéfinis les tableaux de doubles qui vont servir d'entrée aux appels de cette même méthode X dans l'itération suivante etc...

    Comme tout prends du temps, j'aimerais paralléliser les appels de la méthode X dans la boucle itérative. Je souhaiterais creer les objets une fois pour toute (la création prend du temps) mais je ne sais pas trop si c'est faisable et comment m'y prendre pour paralléliser au mieux en utilisant tous les coeurs de mon pc.

    Voilà voilà... merci d'avance pour votre éventuelle aide. Je peux préciser certaines choses si besoin!

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 958
    Points
    32 958
    Billets dans le blog
    4
    Par défaut
    Salut,

    je ne l'ai perosnnellement jamais utilisé mais à chaque fois le nom de OpenMp revient : http://bisqwit.iki.fi/story/howto/op...opConstructFor
    Sinon, tu peux créer tes thread toi-même.
    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.

  3. #3
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Je n'ai pas saisi grand chose à ton algorithme, pourrais-tu le détailler en pseudo-code ? Quelles données sont lues ? Quelles données sont modifiées ?

    Comme il semble s'agir de calcul scientifique, OpenMP semble indiqué en effet.

  4. #4
    Candidat au Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Octobre 2016
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    pour simplifier je vais supposer que la méthode X prend en argument juste un double et renvoie un double.

    On suppose que j'ai :

    un tableau T de dimension N de pointeurs vers des objets (complexes) qui ont été préalablement créés et initialisés (ces objets ne partagent rien)

    ces objets ont une méthode X qui prend en argument un double et renvoie un double (après de longs calculs qui vont lire et modifier quelques petites choses de l'objet)

    un tableau E de dimension N de doubles préalablement initialisés.

    un tableau S de dimension N de doubles.

    dans mon main j'ai quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for(int i=0;i<nbIter;i++){
     
    for(int p=0;p<N;p++){ // c'est cette boucle que j'aimerais paralléliser. 
     
    S[p] = T[p]->X(E[p])
     
    }
     
    // ici je réactualise les valeurs de E en fonction des valeurs de S (le problème n'est pas là mais je dois attendre que tous les calculs précédents soient terminés)
     
    }

    Difficile d'expliquer mon problème en quelques mots...

  5. #5
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Puisque les calculs sont indépendants alors l'opération semble effectivement parallélisable. L'idée est simple et consiste à répartir équitablement sur K threads les valeurs de l'intervalle [0..N[ où résident les adresses de tes tableaux. OpenMP peut faire cela pour toi en quelques lignes, quelque chose du style de :

    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
    for(int i=0;i<nbIter;i++) {
        #pragma omp parallel
        {
            #pragma omp for
            for(int p=0;p<N;p++)
                S[p] = T[p]->X(E[p])
     
            #pragma omp barrier
     
            #pragma omp for
            {
                // ici je réactualise les valeurs de E en fonction des valeurs de S (le problème n'est pas là mais je dois attendre que tous les calculs précédents soient terminés)
            }
        }
    }

  6. #6
    Candidat au Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Octobre 2016
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Ok, merci, je vais tester ca dans l'apres-midi. Juste une petite question sur la gestion de la mémoire :

    la methode X lit et modifie beaucoup les attributs de l'objet. Ceci ne risque pas de limiter la qualité de la parallélisation ? la lecture et l'écriture dans la mémoire n'est pas limitante lorsque plusieurs coeurs travaillent en parallèle ?

  7. #7
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Si, tout-à-fait. Mais tu ne peux pas en prévoir l'impact a priori, tu dois programmer, puis mesurer, puis corriger, puis mesurer..

  8. #8
    Candidat au Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Octobre 2016
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    ok, je vais voir ca. Et on ne peux pas dans ce cas avoir des mémoires fonctionnant indépendamment ? chaque thread serait associé à un "coeur" qui gèrerait sa propre mémoire (et donc avec parallélisation de l'écriture/lecture) ? Ainsi je dispatch une fois pour toute mes N objets -- threads sur les K coeurs de mon ordi et ensuite c'est comme si j'avais K ordi qui travaillent et communiquent à chaque pas de temps (question certainement bête!)

  9. #9
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    La mémoire cache du processeur est là pour ça. Mais fais déjà les mesures, tu sauras s'il y a effectivement un goulot d'étranglement à ce niveau.

Discussions similaires

  1. [Continuum] Questions de débutant concernant la planification
    Par Invité dans le forum Intégration Continue
    Réponses: 1
    Dernier message: 13/04/2011, 15h02
  2. question de débutant sur les objets
    Par boucher_emilie dans le forum ASP
    Réponses: 3
    Dernier message: 06/08/2004, 11h51
  3. [MFC] Quelques questions de débutant...
    Par Sephi dans le forum MFC
    Réponses: 4
    Dernier message: 20/02/2004, 18h25
  4. Questions de débutant
    Par J-P-B dans le forum XMLRAD
    Réponses: 12
    Dernier message: 24/07/2003, 16h19
  5. [HyperFile] 2 questions de débutant
    Par khan dans le forum HyperFileSQL
    Réponses: 2
    Dernier message: 30/04/2002, 00h18

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