8 integer, parameter :: n
= 10, ng
= 8, nw
= 4, vl
= 32
10 real :: vresult
, rg
, rw
, rv
, rc
11 complex, dimension (n
) :: array
27 !$acc parallel num_gangs(ng) copy(rg)
28 !$acc loop reduction(+:rg) gang
30 rg
= rg
+ REAL(array(i
))
34 !$acc parallel num_workers(nw) copy(rw)
35 !$acc loop reduction(+:rw) worker
37 rw
= rw
+ REAL(array(i
))
41 !$acc parallel vector_length(vl) copy(rv)
42 !$acc loop reduction(+:rv) vector
44 rv
= rv
+ REAL(array(i
))
48 !$acc parallel num_gangs(ng) num_workers(nw) vector_length(vl) copy(rc)
49 !$acc loop reduction(+:rc) gang worker vector
51 rc
= rc
+ REAL(array(i
))
57 vresult
= vresult
+ REAL(array(i
))
60 if (rg
.ne
. vresult
) STOP 1
61 if (rw
.ne
. vresult
) STOP 2
62 if (rv
.ne
. vresult
) STOP 3
63 if (rc
.ne
. vresult
) STOP 4
75 !$acc parallel num_gangs(ng) copy(rg)
76 !$acc loop reduction(*:rg) gang
78 rg
= rg
* REAL(array(i
))
82 !$acc parallel num_workers(nw) copy(rw)
83 !$acc loop reduction(*:rw) worker
85 rw
= rw
* REAL(array(i
))
89 !$acc parallel vector_length(vl) copy(rv)
90 !$acc loop reduction(*:rv) vector
92 rv
= rv
* REAL(array(i
))
96 !$acc parallel num_gangs(ng) num_workers(nw) vector_length(vl) copy(rc)
97 !$acc loop reduction(*:rc) gang worker vector
99 rc
= rc
* REAL(array(i
))
105 vresult
= vresult
* REAL(array(i
))
108 if (rg
.ne
. vresult
) STOP 5
109 if (rw
.ne
. vresult
) STOP 6
110 if (rv
.ne
. vresult
) STOP 7
111 if (rc
.ne
. vresult
) STOP 8
112 end program reduction_4