123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- 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
|