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

Fortran Discussion :

Paralleliser 5 boucles imbriquées avec OpenMP


Sujet :

Fortran

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Paralleliser 5 boucles imbriquées avec OpenMP
    Bonjour à tous,

    Dans un de nos programme nous avons ceci:
    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
     
          real    x(-nfx:nfx,-nfy+1:jma+nfy,-nfz+1:kma+nfz)
          real    y(1:jma+2,1:kma+2), a(-nfx:nfx,-nfy:nfy,-nfz:nfz)
    c
          integer i,j,k,i2,j2,k2
    c
          do k = 1,kma
            do j = 1,jma
              y(j+1,k+1) = 0.0
    c
              do k2 = -nfz,nfz
                do j2 = -nfy,nfy
                  do i2 = -nfx,nfx
                    y(j+1,k+1) = y(j+1,k+1) + x(i2,j+j2,k+k2)*a(i2,j2,k2)
                   enddo
                 enddo
              enddo
            enddo
          enddo
    Je voudrais paralléliser cette subroutine avec OpenMP. Je suis malheureusement totalement inculte avec OpenMP. J'ai lu qqs cours et programmer des boucles simples avec OpenMP ne me pose pas de problème. La compilation et l'execution non plus. Mais pour ces 5 boucles imbriquées je suis un peu perdu.

    Y aurait il des âmes charitables dans le coin pour m'aider? idées, suggestions?

    Merci d'avance,
    Bye

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 152
    Points : 191
    Points
    191
    Par défaut
    Bonjour,

    Premièrement, as-tu réellement besoin de ces 5 boucles ? Il est nécessaire d'optimiser avant de paralléliser, tu gagneras en lisibilité si tu peux t'affranchir de quelques boucles. Par exemple, la boucle sur i2 n'est pas utile.

    Ensuite, pour la parallélisation, l'optimal est toujours de chercher à paralléliser la boucle la plus externe, tant que cela est possible. Cela ne peut etre fait que s'il n'y a pas de dépendance en l'indice de boucle précédent et/ou suivant.

    Dans ton cas, si je reprends l'expression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    y(j+1,k+1) = y(j+1,k+1) + x(i2,j+j2,k+k2)*a(i2,j2,k2)
    on voit ici qu'on ne peut pas paralléliser (pas de façon triviale en tout cas) suivant l'indice j et k car une dépendance existe en j+1 et k+1.

    La première chose que l'on peut faire ici est de s'affranchir de la boucle sur i2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    y(j+1,k+1) = y(j+1,k+1) + sum(x(:,j+j2,k+k2)*a(:,j2,k2))
    Maintenant on peut paralléliser simplement :

    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
     
         do k = 1,kma
            do j = 1,jma
              y(j+1,k+1) = 0.0
              !$OMP PARRALEL DEFAULT(SHARED)
              !$OMP DO
              do k2 = -nfz,nfz
                do j2 = -nfy,nfy
                    y(j+1,k+1) = y(j+1,k+1) + sum(x(:,j+j2,k+k2)*a(:,j2,k2))
                 enddo
              enddo
             !$OMP END DO
             !$OMP END PARALLEL 
           enddo
          enddo
    En première approche, cette parallélisation devrait etre correcte.
    Cela étant dit, elle est loin d'être optimale puisque l'on créé jma*kma régions parallèles. Si ces deux variables sont grandes et que nfy et nfk sont petit, une chutte dramatique des performances est à prévoir (la performance
    peut etre pire que si tu n'utilisais qu'un seul processeur).

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Merci de ton aide!

    c'est malheureusement ce que je craignais (la dépendance sur j et k).

    Mais à ce sujet il y a qqch qui m'échappe:

    - à gauche de l'équation on a y(j+1,k+1) et à droite aussi. Donc ça ne pose pas de problème de dépendance. Pour un j+1 et un k+1 donné on utilise/modifie la même valeur du tableau.

    - à droite de l'équation on a x(,j+j2,k+k2). Le tableau x n'est pas modifié par une de ces boucles. Donc pour un j et un k donné on va tjs avoir la même valeur. Et là je n'arrive à pas à voir/comprendre s'il y a un pb de dépendance ou pas...


    Bonne journée

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 152
    Points : 191
    Points
    191
    Par défaut
    Tu devrais regarder du côté des fonctions REDUCTION d'openmp. Je pense que tu pourras peut etre trouver une solution de ce côté là.

    Bon courage et tiens nous au courant,

    Marlan

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 152
    Points : 191
    Points
    191
    Par défaut
    Ah oui, effectivement, j'ai confondu x et y

    En ce cas, la prallélisation peut s'écrire simplement :

    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
     
         !$OMP PARRALEL DEFAULT(SHARED)
         !$OMP DO
         do k = 1,kma
            do j = 1,jma
              y(j+1,k+1) = 0.0
              do k2 = -nfz,nfz
                do j2 = -nfy,nfy
                    y(j+1,k+1) = y(j+1,k+1) + sum(x(:,j+j2,k+k2)*a(:,j2,k2))
                 enddo
              enddo
           enddo
          enddo
          !$OMP END DO
          !$OMP END PARALLEL
    Car, comme tu le signales, il n'y a pas de dépendences suivant y.

Discussions similaires

  1. Boucle imbriquée avec 2 maps
    Par identifiant_bidon dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 03/07/2010, 23h34
  2. [Smarty] boucles imbriquées avec requêtes SQL, impossible à comprendre
    Par dexxter dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 18/05/2007, 23h52
  3. Boucle imbriquée avec for each et while
    Par guen dans le forum Access
    Réponses: 7
    Dernier message: 01/03/2007, 17h36
  4. [Débutant]Boucle imbriquée avec des bornes différentes
    Par Hayato dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 29/08/2005, 16h23
  5. [XSL]boucle imbriquée avec condition
    Par kor dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 11/01/2005, 14h19

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