3 ! { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting
4 ! aspects of that functionality.
11 integer, parameter :: n
= 10, ng
= 8, nw
= 4, vl
= 32
12 integer :: i
, vresult
, rg
, rw
, rv
, rc
13 logical :: lrg
, lrw
, lrv
, lrc
, lvresult
14 integer, dimension (n
) :: array
30 !$acc parallel num_gangs(ng) copy(rg)
31 !$acc loop reduction(+:rg) gang
37 !$acc parallel num_workers(nw) copy(rw)
38 !$acc loop reduction(+:rw) worker
44 !$acc parallel vector_length(vl) copy(rv)
45 !$acc loop reduction(+:rv) vector
51 !$acc parallel num_gangs(ng) num_workers(nw) vector_length(vl) copy(rc)
52 !$acc loop reduction(+:rc) gang worker vector
60 vresult
= vresult
+ array(i
)
63 if (rg
.ne
. vresult
) STOP 1
64 if (rw
.ne
. vresult
) STOP 2
65 if (rv
.ne
. vresult
) STOP 3
66 if (rc
.ne
. vresult
) STOP 4
78 !$acc parallel num_gangs(ng) copy(rg)
79 !$acc loop reduction(*:rg) gang
85 !$acc parallel num_workers(nw) copy(rw)
86 !$acc loop reduction(*:rw) worker
92 !$acc parallel vector_length(vl) copy(rv)
93 !$acc loop reduction(*:rv) vector
99 !$acc parallel num_gangs(ng) num_workers(nw) vector_length(vl) copy(rc)
100 !$acc loop reduction(*:rc) gang worker vector
108 vresult
= vresult
* array(i
)
111 if (rg
.ne
. vresult
) STOP 5
112 if (rw
.ne
. vresult
) STOP 6
113 if (rv
.ne
. vresult
) STOP 7
114 if (rc
.ne
. vresult
) STOP 8
126 !$acc parallel num_gangs(ng) copy(rg)
127 !$acc loop reduction(max:rg) gang
129 rg
= max (rg
, array(i
))
133 !$acc parallel num_workers(nw) copy(rw)
134 !$acc loop reduction(max:rw) worker
136 rw
= max (rw
, array(i
))
140 !$acc parallel vector_length(vl) copy(rv)
141 !$acc loop reduction(max:rv) vector
143 rv
= max (rv
, array(i
))
147 !$acc parallel num_gangs(ng) Num_workers(nw) vector_length(vl) copy(rc)
148 !$acc loop reduction(max:rc) gang worker vector
150 rc
= max (rc
, array(i
))
156 vresult
= max (vresult
, array(i
))
159 if (rg
.ne
. vresult
) STOP 9
160 if (rw
.ne
. vresult
) STOP 10
161 if (rv
.ne
. vresult
) STOP 11
162 if (rc
.ne
. vresult
) STOP 12
174 !$acc parallel num_gangs(ng) copy(rg)
175 !$acc loop reduction(min:rg) gang
177 rg
= min (rg
, array(i
))
181 !$acc parallel num_workers(nw) copy(rw)
182 !$acc loop reduction(min:rw) worker
184 rw
= min (rw
, array(i
))
188 !$acc parallel vector_length(vl) copy(rv)
189 !$acc loop reduction(min:rv) vector
191 rv
= min (rv
, array(i
))
195 !$acc parallel num_gangs(ng) num_workers(nw) vector_length(vl) copy(rc)
196 !$acc loop reduction(min:rc) gang worker vector
198 rc
= min (rc
, array(i
))
204 vresult
= min (vresult
, array(i
))
207 if (rg
.ne
. vresult
) STOP 13
208 if (rw
.ne
. vresult
) STOP 14
209 if (rv
.ne
. vresult
) STOP 15
210 if (rc
.ne
. vresult
) STOP 16
222 !$acc parallel num_gangs(ng) copy(rg)
223 !$acc loop reduction(iand:rg) gang
225 rg
= iand (rg
, array(i
))
229 !$acc parallel num_workers(nw) copy(rw)
230 !$acc loop reduction(iand:rw) worker
232 rw
= iand (rw
, array(i
))
236 !$acc parallel vector_length(vl) copy(rv)
237 !$acc loop reduction(iand:rv) vector
239 rv
= iand (rv
, array(i
))
243 !$acc parallel num_gangs(ng) num_workers(nw) vector_length(vl) copy(rc)
244 !$acc loop reduction(iand:rc) gang worker vector
246 rc
= iand (rc
, array(i
))
252 vresult
= iand (vresult
, array(i
))
255 if (rg
.ne
. vresult
) STOP 17
256 if (rw
.ne
. vresult
) STOP 18
257 if (rv
.ne
. vresult
) STOP 19
258 if (rc
.ne
. vresult
) STOP 20
270 !$acc parallel num_gangs(ng) copy(rg)
271 !$acc loop reduction(ior:rg) gang
273 rg
= ior (rg
, array(i
))
277 !$acc parallel num_workers(nw) copy(rw)
278 !$acc loop reduction(ior:rw) worker
280 rw
= ior (rw
, array(i
))
284 !$acc parallel vector_length(vl) copy(rv)
285 ! { dg-warning "region is vector partitioned but does not contain vector partitioned code" "" { target *-*-* } .-1 }
286 !$acc loop reduction(ior:rv) gang
288 rv
= ior (rv
, array(i
))
292 !$acc parallel num_gangs(ng) num_workers(nw) vector_length(vl) copy(rc)
293 !$acc loop reduction(ior:rc) gang worker vector
295 rc
= ior (rc
, array(i
))
301 vresult
= ior (vresult
, array(i
))
304 if (rg
.ne
. vresult
) STOP 21
305 if (rw
.ne
. vresult
) STOP 22
306 if (rv
.ne
. vresult
) STOP 23
307 if (rc
.ne
. vresult
) STOP 24
319 !$acc parallel num_gangs(ng) copy(rg)
320 !$acc loop reduction(ieor:rg) gang
322 rg
= ieor (rg
, array(i
))
326 !$acc parallel num_workers(nw) copy(rw)
327 !$acc loop reduction(ieor:rw) worker
329 rw
= ieor (rw
, array(i
))
333 !$acc parallel vector_length(vl) copy(rv)
334 !$acc loop reduction(ieor:rv) vector
336 rv
= ieor (rv
, array(i
))
340 !$acc parallel num_gangs(ng) num_workers(nw) vector_length(vl) copy(rc)
341 !$acc loop reduction(ieor:rc) gang worker vector
343 rc
= ieor (rc
, array(i
))
349 vresult
= ieor (vresult
, array(i
))
352 if (rg
.ne
. vresult
) STOP 25
353 if (rw
.ne
. vresult
) STOP 26
354 if (rv
.ne
. vresult
) STOP 27
355 if (rc
.ne
. vresult
) STOP 28
367 !$acc parallel num_gangs(ng) copy(lrg)
368 !$acc loop reduction(.and.:lrg) gang
370 lrg
= lrg
.and
. (array(i
) .ge
. 5)
374 !$acc parallel num_workers(nw) copy(lrw)
375 !$acc loop reduction(.and.:lrw) worker
377 lrw
= lrw
.and
. (array(i
) .ge
. 5)
381 !$acc parallel vector_length(vl) copy(lrv)
382 !$acc loop reduction(.and.:lrv) vector
384 lrv
= lrv
.and
. (array(i
) .ge
. 5)
388 !$acc parallel num_gangs(ng) num_workers(nw) vector_length(vl) copy(lrc)
389 !$acc loop reduction(.and.:lrc) gang worker vector
391 lrc
= lrc
.and
. (array(i
) .ge
. 5)
397 lvresult
= lvresult
.and
. (array(i
) .ge
. 5)
400 if (lrg
.neqv
. lvresult
) STOP 29
401 if (lrw
.neqv
. lvresult
) STOP 30
402 if (lrv
.neqv
. lvresult
) STOP 31
403 if (lrc
.neqv
. lvresult
) STOP 32
415 !$acc parallel num_gangs(ng) copy(lrg)
416 !$acc loop reduction(.or.:lrg) gang
418 lrg
= lrg
.or
. (array(i
) .ge
. 5)
422 !$acc parallel num_workers(nw) copy(lrw)
423 !$acc loop reduction(.or.:lrw) worker
425 lrw
= lrw
.or
. (array(i
) .ge
. 5)
429 !$acc parallel vector_length(vl) copy(lrv)
430 !$acc loop reduction(.or.:lrv) vector
432 lrv
= lrv
.or
. (array(i
) .ge
. 5)
436 !$acc parallel num_gangs(ng) num_workers(nw) vector_length(vl) copy(lrc)
437 !$acc loop reduction(.or.:lrc) gang worker vector
439 lrc
= lrc
.or
. (array(i
) .ge
. 5)
445 lvresult
= lvresult
.or
. (array(i
) .ge
. 5)
448 if (lrg
.neqv
. lvresult
) STOP 33
449 if (lrw
.neqv
. lvresult
) STOP 34
450 if (lrv
.neqv
. lvresult
) STOP 35
451 if (lrc
.neqv
. lvresult
) STOP 36
463 !$acc parallel num_gangs(ng) copy(lrg)
464 !$acc loop reduction(.eqv.:lrg) gang
466 lrg
= lrg
.eqv
. (array(i
) .ge
. 5)
470 !$acc parallel num_workers(nw) copy(lrw)
471 !$acc loop reduction(.eqv.:lrw) worker
473 lrw
= lrw
.eqv
. (array(i
) .ge
. 5)
477 !$acc parallel vector_length(vl) copy(lrv)
478 !$acc loop reduction(.eqv.:lrv) vector
480 lrv
= lrv
.eqv
. (array(i
) .ge
. 5)
484 !$acc parallel num_workers(nw) vector_length(vl) copy(lrc)
485 !$acc loop reduction(.eqv.:lrc) gang worker vector
487 lrc
= lrc
.eqv
. (array(i
) .ge
. 5)
493 lvresult
= lvresult
.eqv
. (array(i
) .ge
. 5)
496 if (lrg
.neqv
. lvresult
) STOP 37
497 if (lrw
.neqv
. lvresult
) STOP 38
498 if (lrv
.neqv
. lvresult
) STOP 39
499 if (lrc
.neqv
. lvresult
) STOP 40
502 ! '.neqv.' reductions
511 !$acc parallel num_gangs(ng) copy(lrg)
512 !$acc loop reduction(.neqv.:lrg) gang
514 lrg
= lrg
.neqv
. (array(i
) .ge
. 5)
518 !$acc parallel num_workers(nw) copy(lrw)
519 !$acc loop reduction(.neqv.:lrw) worker
521 lrw
= lrw
.neqv
. (array(i
) .ge
. 5)
525 !$acc parallel vector_length(vl) copy(lrv)
526 !$acc loop reduction(.neqv.:lrv) vector
528 lrv
= lrv
.neqv
. (array(i
) .ge
. 5)
532 !$acc parallel num_gangs(ng) num_workers(nw) vector_length(vl) copy(lrc)
533 !$acc loop reduction(.neqv.:lrc) gang worker vector
535 lrc
= lrc
.neqv
. (array(i
) .ge
. 5)
541 lvresult
= lvresult
.neqv
. (array(i
) .ge
. 5)
544 if (lrg
.neqv
. lvresult
) STOP 41
545 if (lrw
.neqv
. lvresult
) STOP 42
546 if (lrv
.neqv
. lvresult
) STOP 43
547 if (lrc
.neqv
. lvresult
) STOP 44
548 end program reduction_1