1! { dg-do run }
2! { dg-additional-options "-cpp -w" }
3
4program reduction
5  implicit none
6
7  integer, parameter    :: n = 100, n2 = 1000, chunksize = 10
8  integer               :: i, gs1, gs2, ws1, ws2, vs1, vs2, cs1, cs2, hs1, hs2
9  integer               :: j, red, vred
10
11  gs1 = 0
12  gs2 = 0
13  ws1 = 0
14  ws2 = 0
15  vs1 = 0
16  vs2 = 0
17  cs1 = 0
18  cs2 = 0
19  hs1 = 0
20  hs2 = 0
21
22  !$acc parallel num_gangs (1000)
23  !$acc loop reduction(+:gs1, gs2) gang
24  do i = 1, n
25     gs1 = gs1 + 1
26     gs2 = gs2 + 2
27  end do
28  !$acc end parallel
29
30  !$acc parallel num_workers (4) vector_length (32)
31  !$acc loop reduction(+:ws1, ws2) worker
32  do i = 1, n
33     ws1 = ws1 + 1
34     ws2 = ws2 + 2
35  end do
36  !$acc end parallel
37
38  !$acc parallel vector_length (32)
39  !$acc loop reduction(+:vs1, vs2) vector
40  do i = 1, n
41     vs1 = vs1 + 1
42     vs2 = vs2 + 2
43  end do
44  !$acc end parallel
45
46  !$acc parallel num_gangs(8) num_workers(4) vector_length(32)
47  !$acc loop reduction(+:cs1, cs2) gang worker vector
48  do i = 1, n
49     cs1 = cs1 + 1
50     cs2 = cs2 + 2
51  end do
52  !$acc end parallel
53
54  ! Verify the results on the host
55  do i = 1, n
56     hs1 = hs1 + 1
57     hs2 = hs2 + 2
58  end do
59
60  if (gs1 .ne. hs1) STOP 1
61  if (gs2 .ne. hs2) STOP 2
62
63  if (ws1 .ne. hs1) STOP 3
64  if (ws2 .ne. hs2) STOP 4
65
66  if (vs1 .ne. hs1) STOP 5
67  if (vs2 .ne. hs2) STOP 6
68
69  if (cs1 .ne. hs1) STOP 7
70  if (cs2 .ne. hs2) STOP 8
71
72  ! Nested reductions.
73
74  red = 0
75  vred = 0
76
77  !$acc parallel num_gangs(10) vector_length(32)
78  !$acc loop reduction(+:red) gang
79  do i = 1, n/chunksize
80     !$acc loop reduction(+:red) vector
81     do j = 1, chunksize
82        red = red + chunksize
83     end do
84  end do
85  !$acc end parallel
86
87  do i = 1, n/chunksize
88     do j = 1, chunksize
89        vred = vred + chunksize
90     end do
91  end do
92
93  if (red .ne. vred) STOP 9
94end program reduction
95