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 :

OpenMP reduction en C++


Sujet :

Threads & Processus C++

  1. #1
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut OpenMP reduction en C++
    Bonjour,

    Dans un code C++, j'essaye d'utiliser la direction d'openMP 3.0 REDUCTION sur une variable de type tableau ou de type pointeur et cela me génére un erreur à la compilation:

    "'bb' has invalid type for 'reduction'"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      N=100;
      double bb[100];
      #pragma omp parallel for reduction(+:bb) 
      for (int i=0;i<N;i++) {
         bb[i]++;
      }
    Normallement depuis openMP 2.0 on peut faire des reduction sur tableau, ou alors il y a quelquechose qui m'echape.

  2. #2
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    bb[i]++ n'est pas une reduction.

  3. #3
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    ??

    Si je fais ce qui suit sur 4 processeurs j'obtient bien 100

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      N=100;
      double bb;
      #pragma omp parallel for reduction(+:bb) 
      for (int i=0;i<N;i++) {
         bb++;
      }
     
      printf("%d\n",bb)

  4. #4
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    bb++ deja c'est pas bb[i]++

    Une reduction comme son nom l'indique passe de N dimension a N-1 ce qui n'est pas le cas de ton code.

  5. #5
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Passer de bb++ à bb[i]++ était l'objet de ma question!
    Es-tu sure de bien saisir la directive "Reduction" de openMP. Son role est de paralléliser par reduction une operation comme l'addition par example. C'est bien ce que je fais ici.

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Réduction = par exemple somme des bb, pas bb[i]++ !

  7. #7
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    Citation Envoyé par uriotcea Voir le message
    Passer de bb++ à bb[i]++ était l'objet de ma question!
    Es-tu sure de bien saisir la directive "Reduction" de openMP. Son role est de paralléliser par reduction une operation comme l'addition par example. C'est bien ce que je fais ici.
    Non, la reduction serait de faire la somme de bb[i]. la tu incrementes chaque bb[i] separement.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685

  9. #9
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Extrait du cours ci-dessous au chapitre "reduction"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     !$OMP PARALLEL
       !$OMP DO REDUCTION(+:s) REDUCTION(*:p,r)
        do i = 1, n
          s = s + 1
          p = p * 2
          r = r * 3
        end do
       !$OMP END DO
     !$OMP END PARALLEL
    A fin, c'est certain s=N; Je ne sais pas pourquoi ca semble choquer tout le monde, je fais ca depuis des années et ca fonctionne trés bien !!!!

  10. #10
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    relis avec le doigt. Si tu fait

    for(i=0;i<100;i++) bb[i]++;

    tu fais un +1 sur chaque case du tableau, y a pas de reduction.
    Lire c'est bien, comprendre c'est mieux.

  11. #11
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Dit tu te la joue là!
    Evidement que je veux faire +1 à chaque case du tableau.
    Lit bien ma question initiale avec ton doigt aussi si c'est nécessaire.

  12. #12
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    non.

    Si tu veux faire a[i]++, ce n'est pas une reduction, c'ets une boucle parallele normale.

  13. #13
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Bon mon example est peu etre trop minimaliste alors voici ce que je veux faire et qui ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #pragma omp parallel for reduction(+:tab,tabp) private(p,power)
      for (int i=0;i<100000;i++) {
        power=cord[i]*kpower;
        p=(unsigned int)(k*(cord[i]-min));
        tab[p]++;
        tabp[p]+=power;
      }
    Et voici ce que je suis obligé de faire pour que ca fonctionne

    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
     
       int pp;
    #pragma omp parallel for private(p,pp,power)
      for (int i=0;i<100000;i++) {
        pp=omp_get_thread_num();
     
        power=cord[i]*kpower;
        p=(unsigned int)(k*(cord[i]-min));
        new_tab[pp][p]++;
        new_tabp[pp][p]+=power;
      }
     
      // J'effectue la reduction moi meme
      for (int j=0;j<omp_get_max_threads();j++) {
        tab[i]+=new_tab[j][i];
        tabp[i]+=new_tabp[j][i];
      }

  14. #14
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Citation Envoyé par uriotcea Voir le message
    Bon mon example est peu etre trop minimaliste alors voici ce que je veux faire et qui ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #pragma omp parallel for reduction(+:tab,tabp) private(p,power)
      for (int i=0;i<100000;i++) {
        power=cord[i]*kpower;
        p=(unsigned int)(k*(cord[i]-min));
        tab[p]++;
        tabp[p]+=power;
      }
    Et voici ce que je suis obligé de faire pour que ca fonctionne

    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
     
       int pp;
    #pragma omp parallel for private(p,pp,power)
      for (int i=0;i<100000;i++) {
        pp=omp_get_thread_num();
     
        power=cord[i]*kpower;
        p=(unsigned int)(k*(cord[i]-min));
        new_tab[pp][p]++;
        new_tabp[pp][p]+=power;
      }
     
      // J'effectue la reduction moi meme
      for (int j=0;j<omp_get_max_threads();j++) {
        for (int i=0;i<step;i++) {
          tab[i]+=new_tab[j][i];
          tabp[i]+=new_tabp[j][i];
        }
      }

  15. #15
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par uriotcea Voir le message
    Bon mon example est peu etre trop minimaliste alors voici ce que je veux faire et qui ne fonctionne pas
    Ca n'a strictement rien à voir avec ce que tu nous a montré...
    Le problème, c'est que tu fais ta réduction sur tab et non sur tab[p], donc utilises une variable intermédiaire, ça ira mieux.

  16. #16
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Ce que j'ai intialement montré, générait une erreur de compilation que je ne savais et ne sais toujours pas resoudre. c'était le but de l'example. La discution a un peu divergé sur le font plutot que sur la forme.

    maitenant je ne vois pas trop ce que tu entends par passer par une variable intermediére.

  17. #17
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Tu fais une réduction sur tab[p], mais je ne sais pas si c'est exprimable dans OpenMP. Donc crées une variable temporaire tabp sur laquelle tu fais ta réduction, et tu feras à la sortie de ta boucle OpenMP un tab[p] = tabp.

  18. #18
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Oui, c'est ce que j'ai fini par faire.
    J'ai aussi fini par comprendre que dans openMP 3.0 la reduction sur tableau etait possible en fortran mais pas en C. Cette possibilité semble arriver avec la derniére mouture, la 3.1 je crois.
    Merci de vos remarques et commentaires à tous.

  19. #19
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par uriotcea Voir le message
    J'ai aussi fini par comprendre que dans openMP 3.0 la reduction sur tableau etait possible en fortran mais pas en C.
    l'exemple fortran que tu donne n'utilise pas de tableau
    Normalement la réduction c'est uniquement pour des type primitif et une opération simple.
    Aprés tu peut utiliser une section critique pour faire la reduction. Un truc genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #pragma omp parallel 
    {
        //definition des variables propre à un thread
     
        #pragma omp for 
        for (int i=0;i<100000;i++) {
             //code de la boucle
        }
        pragma omp critical
        {
           //code de reduction
        }
    }

  20. #20
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    L'example que j'ai donnée en C sur un tableau qui ne compile pas fonctionne bien en fortran ou la reduction est valide sur le tableau. C'est ce que j'observe et c'est également indiqué dans les specif openMP 3.0 (voir ci-dessous

    pour le C
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Aggregate types (including arrays), pointer types and reference types may not appear
    in a reduction clause
    Pour le fortran
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    An original list item with the ALLOCATABLE attribute must be in the allocated state
    at entry to the construct containing the reduction clause. Additionally, the list item
    must not be deallocated and/or allocated within the region.

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

Discussions similaires

  1. Tentative de reduction de temps de calcul avec openMP: ECHEC
    Par Naneba dans le forum Threads & Processus
    Réponses: 8
    Dernier message: 20/02/2014, 14h08
  2. Probleme de reduction de fenetre
    Par gilles641 dans le forum API, COM et SDKs
    Réponses: 16
    Dernier message: 30/08/2005, 08h04
  3. reduction de fenetre
    Par bou3 dans le forum Windows
    Réponses: 2
    Dernier message: 22/06/2005, 10h46
  4. Fonction de reduction???
    Par zigg dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 03/11/2004, 13h59
  5. [QUICK REPORT] DESACTIVER LE BOUTON DE REDUCTION
    Par freud dans le forum Bases de données
    Réponses: 11
    Dernier message: 26/07/2004, 00h43

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