xref: /openbsd-src/gnu/gcc/libgomp/testsuite/libgomp.fortran/appendix-a/a.16.1.f90 (revision 404b540a9034ac75a6199ad1a32d1bbc7a0d4210)
1*404b540aSrobert! { dg-do run }
2*404b540aSrobert        REAL FUNCTION WORK1(I)
3*404b540aSrobert            INTEGER I
4*404b540aSrobert            WORK1 = 1.0 * I
5*404b540aSrobert            RETURN
6*404b540aSrobert        END FUNCTION WORK1
7*404b540aSrobert
8*404b540aSrobert        REAL FUNCTION WORK2(I)
9*404b540aSrobert            INTEGER I
10*404b540aSrobert            WORK2 = 2.0 * I
11*404b540aSrobert            RETURN
12*404b540aSrobert        END FUNCTION WORK2
13*404b540aSrobert
14*404b540aSrobert        SUBROUTINE SUBA16(X, Y, INDEX, N)
15*404b540aSrobert        REAL X(*), Y(*)
16*404b540aSrobert        INTEGER INDEX(*), N
17*404b540aSrobert        INTEGER I
18*404b540aSrobert!$OMP PARALLEL DO SHARED(X, Y, INDEX, N)
19*404b540aSrobert          DO I=1,N
20*404b540aSrobert!$OMP ATOMIC
21*404b540aSrobert              X(INDEX(I)) = X(INDEX(I)) + WORK1(I)
22*404b540aSrobert            Y(I) = Y(I) + WORK2(I)
23*404b540aSrobert          ENDDO
24*404b540aSrobert      END SUBROUTINE SUBA16
25*404b540aSrobert
26*404b540aSrobert      PROGRAM A16
27*404b540aSrobert        REAL X(1000), Y(10000)
28*404b540aSrobert        INTEGER INDEX(10000)
29*404b540aSrobert        INTEGER I
30*404b540aSrobert        DO I=1,10000
31*404b540aSrobert          INDEX(I) = MOD(I, 1000) + 1
32*404b540aSrobert          Y(I) = 0.0
33*404b540aSrobert        ENDDO
34*404b540aSrobert        DO I = 1,1000
35*404b540aSrobert          X(I) = 0.0
36*404b540aSrobert        ENDDO
37*404b540aSrobert        CALL SUBA16(X, Y, INDEX, 10000)
38*404b540aSrobert        DO I = 1,10
39*404b540aSrobert          PRINT *, "X(", I, ") = ", X(I), ", Y(", I, ") = ", Y(I)
40*404b540aSrobert        ENDDO
41*404b540aSrobert      END PROGRAM A16
42