Synchronisation
einfache Direktiven (critical sections, barriers)
Gate-Variablen (critical/ordered sections)
Synchronisations-Funktionen (lock_gate, unlock_gate)
! Overhead bedenken!
Beispiel für Critical Section
SUM = 0.0
C$DIR LOOP_PARALLEL
DO I = 1, N
A(I) = FUNC(A(I), I)
C$DIR CRITICAL_SECTION
SUM = SUM + A(I)
C$DIR END_CRITICAL_SECTION
ENDDO
Beispiel für Barrier
langsam:
DO T = 1, MAX
C$DIR LOOP_PARALLEL
DO I = 1, N
B(I) = F1(E,N,I)
ENDDO
C$DIR LOOP_PARALLEL
DO I = 1, N
E(I) = F2(B,N,I)
ENDDO
ENDDO
schnell:
C$DIR PARALLEL
DO T = 1, MAX
C$DIR LOOP_PARALLEL(DIST)
DO I = 1, N
B(I) = F1(E,N,I)
ENDDO
RC = WAIT_BARRIER(MY_BARRIER,
N_THREADS)
C$DIR LOOP_PARALLEL(DIST)
DO I = 1, N
E(I) = F2(B,N,I)
ENDDO
ENDDO
C$DIR END_PARALLEL
Beispiel:
C$DIR LOOP_PARALLEL(NODES)
DO I = 1, N
C$DIR LOOP_PARALLEL(THREADS)
DO J = 1, M
A(I,J) = B(I,J) + C(I,J)
ENDDO
ENDDO
analog für TASKS und PARALLEL-Bereiche