57 lines
1.5 KiB
Fortran
57 lines
1.5 KiB
Fortran
C******************************************************************************
|
|
C FILE: omp_workshare2.f
|
|
C DESCRIPTION:
|
|
C OpenMP Example - Sections Work-sharing - Fortran Version
|
|
C In this example, the OpenMP SECTION directive is used to assign
|
|
C different array operations to threads that execute a SECTION. Each
|
|
C thread receives its own copy of the result array to work with.
|
|
C AUTHOR: Blaise Barney 5/99
|
|
C LAST REVISED: 01/09/04
|
|
C******************************************************************************
|
|
|
|
PROGRAM WORKSHARE2
|
|
|
|
INTEGER N, I, NTHREADS, TID, OMP_GET_NUM_THREADS,
|
|
+ OMP_GET_THREAD_NUM
|
|
PARAMETER (N=50)
|
|
REAL A(N), B(N), C(N)
|
|
|
|
! Some initializations
|
|
DO I = 1, N
|
|
A(I) = I * 1.0
|
|
B(I) = A(I)
|
|
ENDDO
|
|
|
|
!$OMP PARALLEL SHARED(A,B,NTHREADS), PRIVATE(C,I,TID)
|
|
TID = OMP_GET_THREAD_NUM()
|
|
IF (TID .EQ. 0) THEN
|
|
NTHREADS = OMP_GET_NUM_THREADS()
|
|
PRINT *, 'Number of threads =', NTHREADS
|
|
END IF
|
|
PRINT *, 'Thread',TID,' starting...'
|
|
|
|
!$OMP SECTIONS
|
|
|
|
!$OMP SECTION
|
|
PRINT *, 'Thread',TID,' doing section 1'
|
|
DO I = 1, N
|
|
C(I) = A(I) + B(I)
|
|
WRITE(*,100) TID,I,C(I)
|
|
100 FORMAT(' Thread',I2,': C(',I2,')=',F8.2)
|
|
ENDDO
|
|
|
|
!$OMP SECTION
|
|
PRINT *, 'Thread',TID,' doing section 2'
|
|
DO I = 1+N/2, N
|
|
C(I) = A(I) * B(I)
|
|
WRITE(*,100) TID,I,C(I)
|
|
ENDDO
|
|
|
|
!$OMP END SECTIONS NOWAIT
|
|
|
|
PRINT *, 'Thread',TID,' done.'
|
|
|
|
!$OMP END PARALLEL
|
|
|
|
END
|