Bonjour
je dois // en openMP cette boucle :
Vous me proposeriez quoi ?Code:
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
Cordialement
Version imprimable
Bonjour
je dois // en openMP cette boucle :
Vous me proposeriez quoi ?Code:
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
Cordialement
Un produit matriciel en somme que tu peux paralléliser de plusieurs façons :
Ou :Code:
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:
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
La meilleur façon est la première (une seule création de région parallèle).Code:
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 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 :
Ou, si tu n'aimes pas la fonction sum/dsum :Code:
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
En avoir répondu à ta question,Code:
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
Marlan
Merci pour votre aide