Problema com o bloco comum na programação paralela do OpenMP
Eu tenho algumas perguntas sobre o uso de blocos comuns na programação paralela no Fortran.
Minhas sub-rotinas têm blocos comuns. Eu tenho que declarar todos os blocos comuns e threadprivate na região do paralelo?
Como eles passam informações? Eu quero um relógio comum separado para cada thread e quero que eles passem informações pelo final da região paralela. Isso acontece aqui?
MinhasFord
A sub-rotina altera algumas variáveis em blocos comuns eCondact
sub-rotina substitui sobre eles novamente, mas a função usa os valores deCondact
sub-rotina. A segunda sub-rotina e função copiam as variáveis da sub-rotina anterior para cada encadeamento?
program
...
! Loop which I want to parallelize
!$OMP parallel DO
!do I need to declear all common block and threadprivate them here?
I = 1, N
...
call FORD(i,j)
...
!$OMP END parallel DO
end program
subroutine FORD(i,j)
dimension zl(3),zg(3)
common /ellip/ b1,c1,f1,g1,h1,d1,
. b2,c2,f2,g2,h2,p2,q2,r2,d2
common /root/ root1,root2
!$OMP threadprivate (/ellip/,/root/)
!this subroutine rewrite values of b1, c1 and f1 variable.
CALL CONDACT(genflg,lapflg)
return
end subroutine
SUBROUTINE CONDACT(genflg,lapflg)
common /ellip/ b1,c1,f1,g1,h1,d1,b2,c2,f2,g2,h2,p2,q2,r2,d2
!$OMP threadprivate (/ellip/)
! this subroutine rewrite b1, c1 and f1 again
call function f(x)
RETURN
END
function f(x)
common /ellip/ b1,c1,f1,g1,h1,d1,
. b2,c2,f2,g2,h2,p2,q2,r2,d2
!$OMP threadprivate (/ellip/)
! here the function uses the value of b1, c1, f1 from CONDAT subroutine.
end