1C****************************************************************************** 2C FILE: omp_workshare2.f 3C DESCRIPTION: 4C OpenMP Example - Sections Work-sharing - Fortran Version 5C In this example, the OpenMP SECTION directive is used to assign 6C different array operations to threads that execute a SECTION. Each 7C thread receives its own copy of the result array to work with. 8C AUTHOR: Blaise Barney 5/99 9C LAST REVISED: 01/09/04 10C****************************************************************************** 11 12 PROGRAM WORKSHARE2 13 14 INTEGER N, I, NTHREADS, TID, OMP_GET_NUM_THREADS, 15 + OMP_GET_THREAD_NUM 16 PARAMETER (N=50) 17 REAL A(N), B(N), C(N) 18 19! Some initializations 20 DO I = 1, N 21 A(I) = I * 1.0 22 B(I) = A(I) 23 ENDDO 24 25!$OMP PARALLEL SHARED(A,B,NTHREADS), PRIVATE(C,I,TID) 26 TID = OMP_GET_THREAD_NUM() 27 IF (TID .EQ. 0) THEN 28 NTHREADS = OMP_GET_NUM_THREADS() 29 PRINT *, 'Number of threads =', NTHREADS 30 END IF 31 PRINT *, 'Thread',TID,' starting...' 32 33!$OMP SECTIONS 34 35!$OMP SECTION 36 PRINT *, 'Thread',TID,' doing section 1' 37 DO I = 1, N 38 C(I) = A(I) + B(I) 39 WRITE(*,100) TID,I,C(I) 40 100 FORMAT(' Thread',I2,': C(',I2,')=',F8.2) 41 ENDDO 42 43!$OMP SECTION 44 PRINT *, 'Thread',TID,' doing section 2' 45 DO I = 1+N/2, N 46 C(I) = A(I) * B(I) 47 WRITE(*,100) TID,I,C(I) 48 ENDDO 49 50!$OMP END SECTIONS NOWAIT 51 52 PRINT *, 'Thread',TID,' done.' 53 54!$OMP END PARALLEL 55 56 END 57