J'essaie de paralléliser une boucle qui calcule un produit scalaire en Fortran avec OpenMP.
- Code: Tout sélectionner
program bsp
implicit none
integer :: i, tnr, omp_get_thread_num
integer, parameter :: n = 10000
real(8), dimension(n) :: a,b
real(8) :: c
a=1
b=1
call omp_set_num_threads( 2 )
c = 0
!$omp parallel private( i )
!$omp do
do i = 1, n
c = c + a(i)*b(i)
!tnr = omp_get_thread_num() ! Aktuelle Threadnummer
!write( *, * ) 'Thread', tnr, ':', c
end do
!$omp end do
!$omp end parallel
print*, c
end program bsp
Ensuite, je compile "gfortran -fopenmp -o bsp bsp.f90" et j'exécute.
Je fais le produit scalaire de deux vecteurs a et b de taille n qui contiennent que des 1. Donc je devrais avoir au final c = n. Or, j'obtiens toujours un résultat différent.
Si maintenant, je décomment les lignes
!tnr = omp_get_thread_num()
!write( *, *) 'Thread', tnr, ':', c
Alors ça me donne le bon résultat.
Je débute avec OpenMP et je pense pas avoir vraiment compris comment ça marche. J'ai vraiment aucune idée pourquoi le fait de décommenter ces deux lignes fait que j'obtiens le bon résultat et non plus un résultat aléatoire oscillant autour de n/2.