Weitergehende Direktiven

$\bullet$ 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


next up previous
Peter Junglas
12/23/1998