Проблема с общим блоком в параллельном программировании OpenMP
У меня есть несколько вопросов об использовании общих блоков в параллельном программировании на Фортране.
Мои подпрограммы имеют общие блоки. Должен ли я объявлять все общие блоки и потоки частного в параллельной области?
Как они передают информацию? Я хочу отдельные общие часы для каждого потока и хочу, чтобы они передавали информацию через конец параллельной области. Это здесь происходит?
мойFord
Подпрограмма изменяет некоторые переменные в общих блоках иCondact
подпрограмма перезаписывает их снова, но функция использует значения изCondact
подпрограмма. Копирует ли вторая подпрограмма и функция переменные из предыдущей подпрограммы для каждого потока?
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