| ! { dg-do run } |
| REAL FUNCTION WORK1(I) |
| INTEGER I |
| WORK1 = 1.0 * I |
| RETURN |
| END FUNCTION WORK1 |
| |
| REAL FUNCTION WORK2(I) |
| INTEGER I |
| WORK2 = 2.0 * I |
| RETURN |
| END FUNCTION WORK2 |
| |
| SUBROUTINE SUBA16(X, Y, INDEX, N) |
| REAL X(*), Y(*) |
| INTEGER INDEX(*), N |
| INTEGER I |
| !$OMP PARALLEL DO SHARED(X, Y, INDEX, N) |
| DO I=1,N |
| !$OMP ATOMIC |
| X(INDEX(I)) = X(INDEX(I)) + WORK1(I) |
| Y(I) = Y(I) + WORK2(I) |
| ENDDO |
| END SUBROUTINE SUBA16 |
| |
| PROGRAM A16 |
| REAL X(1000), Y(10000) |
| INTEGER INDEX(10000) |
| INTEGER I |
| DO I=1,10000 |
| INDEX(I) = MOD(I, 1000) + 1 |
| Y(I) = 0.0 |
| ENDDO |
| DO I = 1,1000 |
| X(I) = 0.0 |
| ENDDO |
| CALL SUBA16(X, Y, INDEX, 10000) |
| DO I = 1,10 |
| PRINT *, "X(", I, ") = ", X(I), ", Y(", I, ") = ", Y(I) |
| ENDDO |
| END PROGRAM A16 |