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 :

openMP sur do


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 84
    Par défaut openMP sur do
    Bonjour
    je dois // en openMP cette boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            do i=1,nar
                do j=1,nbc
                    c(i,j)=0.
                    do k=1,nac
                        c(i,j)=c(i,j)+a(i,k)*b(k,j)
                    enddo
                enddo
           enddo
    Vous me proposeriez quoi ?
    Cordialement

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 152
    Par défaut
    Un produit matriciel en somme que tu peux paralléliser de plusieurs façons :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    !$ OMP PARALLEL DEFAULT(SHARED)
            !$ OMP DO
            do i=1,nar
                do j=1,nbc
                    c(i,j)=0.
                    do k=1,nac
                        c(i,j)=c(i,j)+a(i,k)*b(k,j)
                    enddo
                enddo
           enddo
           !$OMP END DO
    !$OMP END PARALLEL
    Ou :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            do i=1,nar
               !$ OMP PARALLEL DEFAULT(SHARED)
               !$ OMP DO
                do j=1,nbc
                    c(i,j)=0.
                    do k=1,nac
                        c(i,j)=c(i,j)+a(i,k)*b(k,j)
                    enddo
                enddo
               !$OMP END DO
               !$OMP END PARALLEL
           enddo
    Ou :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            do i=1,nar
                do j=1,nbc
                    c(i,j)=0.
                   !$ OMP PARALLEL DEFAULT(SHARED)
                   !$ OMP DO
                    do k=1,nac
                        c(i,j)=c(i,j)+a(i,k)*b(k,j)
                    enddo
                   !$OMP END DO
                   !$OMP END PARALLEL
                enddo
           enddo
    La meilleur façon est la première (une seule création de région parallèle).
    La seconde n'est pas optimisée (création nar fois de la région parallèle),
    La troisième est la pire (création nbc*nar fois de la région parallèle) --> surcoût monumental si les matrices sont grandes.
    De plus, pourquoi ne pas vectoriser un peut ton expression ? Tu gagnerais en temps de calcul, en faisant tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    c=0
    !$ OMP PARALLEL DEFAULT(SHARED)
            !$ OMP DO
            do i=1,nar
                do j=1,nbc
                       c(i,j)=sum(a(i,1:nac)*b(1:nac,j))
                enddo
           enddo
           !$OMP END DO
    !$OMP END PARALLEL
    Ou, si tu n'aimes pas la fonction sum/dsum :

    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
     
    !Déclarer un vecteur TMP de taille nac
    c=0
    !$ OMP PARALLEL DEFAULT(SHARED), PRIVATE(TMP)
            !$ OMP DO
            do i=1,nar
                do j=1,nbc
                       TMP=a(i,1:nac)*b(1:nac,j)
                       do k=1,nac
                              c(i,j)=c(i,j)+TMP(k)
                       end do
                enddo
           enddo
           !$OMP END DO
    !$OMP END PARALLEL
    En avoir répondu à ta question,

    Marlan

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 84
    Par défaut
    Merci pour votre aide

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 26/05/2015, 03h40
  2. Réponses: 1
    Dernier message: 26/02/2015, 12h22
  3. Tutoriel sur OpenMP
    Par ncheboi dans le forum Threads & Processus
    Réponses: 3
    Dernier message: 31/01/2011, 17h07
  4. [Kylix] Kylix embarqué sur PDA ?
    Par Anonymous dans le forum NoSQL
    Réponses: 10
    Dernier message: 29/11/2002, 13h59
  5. F.A.Q, Doc, cours, tutoriels sur JBuilder
    Par Ricky81 dans le forum JBuilder
    Réponses: 0
    Dernier message: 14/03/2002, 15h28

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