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 ENDDOanalog für TASKS und PARALLEL-Bereiche