| C****************************************************************************** |
| C FILE: omp_workshare1.f |
| C DESCRIPTION: |
| C OpenMP Example - Loop Work-sharing - Fortran Version |
| C In this example, the iterations of a loop are scheduled dynamically |
| C across the team of threads. A thread will perform CHUNK iterations |
| C at a time before being scheduled for the next CHUNK of work. |
| C AUTHOR: Blaise Barney 5/99 |
| C LAST REVISED: 01/09/04 |
| C****************************************************************************** |
| |
| PROGRAM WORKSHARE1 |
| |
| INTEGER NTHREADS, TID, OMP_GET_NUM_THREADS, |
| + OMP_GET_THREAD_NUM, N, CHUNKSIZE, CHUNK, I |
| PARAMETER (N=100) |
| PARAMETER (CHUNKSIZE=10) |
| REAL A(N), B(N), C(N) |
| |
| ! Some initializations |
| DO I = 1, N |
| A(I) = I * 1.0 |
| B(I) = A(I) |
| ENDDO |
| CHUNK = CHUNKSIZE |
| |
| !$OMP PARALLEL SHARED(A,B,C,NTHREADS,CHUNK) PRIVATE(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 DO SCHEDULE(DYNAMIC,CHUNK) |
| DO I = 1, N |
| C(I) = A(I) + B(I) |
| WRITE(*,100) TID,I,C(I) |
| 100 FORMAT(' Thread',I2,': C(',I3,')=',F8.2) |
| ENDDO |
| !$OMP END DO NOWAIT |
| |
| PRINT *, 'Thread',TID,' done.' |
| |
| !$OMP END PARALLEL |
| |
| END |