Issue with common block in der parallelen OpenMP-Programmierung

ch habe einige Fragen zur Verwendung von allgemeinen Blöcken bei der parallelen Programmierung in Fortra

Meine Unterprogramme haben gemeinsame Blöcke. Muss ich alle gemeinsamen Blöcke deklarieren und in der parallelen do-Region threadprivate?

Wie geben sie Informationen weiter? Ich möchte eine separate gemeinsame Uhr für jeden Thread und möchte, dass sie Informationen durch das Ende des parallelen Bereichs leiten. Passiert das hier?

MyFordnterprogramm @ ändert einige Variablen in gemeinsamen Blöcken undCondact -Unterprogramm überschreibt sie erneut, aber die Funktion verwendet die Werte vonCondact Unterprogramm. Kopieren das zweite Unterprogramm und die zweite Funktion die Variablen aus dem vorherigen Unterprogramm für jeden Thread?

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

Antworten auf die Frage(4)

Ihre Antwort auf die Frage