1! { dg-do run }
2
3program asyncwait
4  integer, parameter :: N = 64
5  real, allocatable :: a(:), b(:), c(:), d(:), e(:)
6  integer i
7
8  allocate (a(N))
9  allocate (b(N))
10  allocate (c(N))
11  allocate (d(N))
12  allocate (e(N))
13
14  a(:) = 3.0
15  b(:) = 0.0
16
17  !$acc data copy (a(1:N)) copy (b(1:N))
18
19  !$acc parallel async
20  !$acc loop
21  do i = 1, N
22     b(i) = a(i)
23  end do
24  !$acc end parallel
25
26  !$acc wait
27  !$acc end data
28
29  do i = 1, N
30     if (a(i) .ne. 3.0) STOP 1
31     if (b(i) .ne. 3.0) STOP 2
32  end do
33
34  a(:) = 2.0
35  b(:) = 0.0
36
37  !$acc data copy (a(1:N)) copy (b(1:N))
38
39  !$acc parallel async (1)
40  !$acc loop
41  do i = 1, N
42     b(i) = a(i)
43  end do
44  !$acc end parallel
45
46  !$acc wait (1)
47  !$acc end data
48
49  do i = 1, N
50     if (a(i) .ne. 2.0) STOP 3
51     if (b(i) .ne. 2.0) STOP 4
52  end do
53
54  a(:) = 3.0
55  b(:) = 0.0
56  c(:) = 0.0
57  d(:) = 0.0
58
59  !$acc data copy (a(1:N)) copy (b(1:N)) copy (c(1:N)) copy (d(1:N))
60
61  !$acc parallel async (1)
62  do i = 1, N
63     b(i) = (a(i) * a(i) * a(i)) / a(i)
64  end do
65  !$acc end parallel
66
67  !$acc parallel async (1)
68  do i = 1, N
69     c(i) = (a(i) * 4) / a(i)
70  end do
71  !$acc end parallel
72
73  !$acc parallel async (1)
74  !$acc loop
75  do i = 1, N
76     d(i) = ((a(i) * a(i) + a(i)) / a(i)) - a(i)
77  end do
78  !$acc end parallel
79
80  !$acc wait (1)
81  !$acc end data
82
83  do i = 1, N
84     if (a(i) .ne. 3.0) STOP 5
85     if (b(i) .ne. 9.0) STOP 6
86     if (c(i) .ne. 4.0) STOP 7
87     if (d(i) .ne. 1.0) STOP 8
88  end do
89
90  a(:) = 2.0
91  b(:) = 0.0
92  c(:) = 0.0
93  d(:) = 0.0
94  e(:) = 0.0
95
96  !$acc data copy (a(1:N), b(1:N), c(1:N), d(1:N), e(1:N))
97
98  !$acc parallel async (1)
99  do i = 1, N
100     b(i) = (a(i) * a(i) * a(i)) / a(i)
101  end do
102  !$acc end parallel
103
104  !$acc parallel async (1)
105  !$acc loop
106  do i = 1, N
107     c(i) = (a(i) * 4) / a(i)
108  end do
109  !$acc end parallel
110
111  !$acc parallel async (1)
112  !$acc loop
113  do i = 1, N
114     d(i) = ((a(i) * a(i) + a(i)) / a(i)) - a(i)
115  end do
116  !$acc end parallel
117
118  !$acc parallel wait (1) async (1)
119  !$acc loop
120  do i = 1, N
121     e(i) = a(i) + b(i) + c(i) + d(i)
122  end do
123  !$acc end parallel
124
125  !$acc wait (1)
126  !$acc end data
127
128  do i = 1, N
129     if (a(i) .ne. 2.0) STOP 9
130     if (b(i) .ne. 4.0) STOP 10
131     if (c(i) .ne. 4.0) STOP 11
132     if (d(i) .ne. 1.0) STOP 12
133     if (e(i) .ne. 11.0) STOP 13
134  end do
135
136  a(:) = 3.0
137  b(:) = 0.0
138
139  !$acc data copy (a(1:N)) copy (b(1:N))
140
141  !$acc kernels async
142  !$acc loop
143  do i = 1, N
144     b(i) = a(i)
145  end do
146  !$acc end kernels
147
148  !$acc wait
149  !$acc end data
150
151  do i = 1, N
152     if (a(i) .ne. 3.0) STOP 14
153     if (b(i) .ne. 3.0) STOP 15
154  end do
155
156  a(:) = 2.0
157  b(:) = 0.0
158
159  !$acc data copy (a(1:N)) copy (b(1:N))
160
161  !$acc kernels async (1)
162  !$acc loop
163  do i = 1, N
164     b(i) = a(i)
165  end do
166  !$acc end kernels
167
168  !$acc wait (1)
169  !$acc end data
170
171  do i = 1, N
172     if (a(i) .ne. 2.0) STOP 16
173     if (b(i) .ne. 2.0) STOP 17
174  end do
175
176  a(:) = 3.0
177  b(:) = 0.0
178  c(:) = 0.0
179  d(:) = 0.0
180
181  !$acc data copy (a(1:N)) copy (b(1:N)) copy (c(1:N)) copy (d(1:N))
182
183  !$acc kernels async (1)
184  do i = 1, N
185     b(i) = (a(i) * a(i) * a(i)) / a(i)
186  end do
187  !$acc end kernels
188
189  !$acc kernels async (1)
190  do i = 1, N
191     c(i) = (a(i) * 4) / a(i)
192  end do
193  !$acc end kernels
194
195  !$acc kernels async (1)
196  !$acc loop
197  do i = 1, N
198     d(i) = ((a(i) * a(i) + a(i)) / a(i)) - a(i)
199  end do
200  !$acc end kernels
201
202  !$acc wait (1)
203  !$acc end data
204
205  do i = 1, N
206     if (a(i) .ne. 3.0) STOP 18
207     if (b(i) .ne. 9.0) STOP 19
208     if (c(i) .ne. 4.0) STOP 20
209     if (d(i) .ne. 1.0) STOP 21
210  end do
211
212  a(:) = 2.0
213  b(:) = 0.0
214  c(:) = 0.0
215  d(:) = 0.0
216  e(:) = 0.0
217
218  !$acc data copy (a(1:N), b(1:N), c(1:N), d(1:N), e(1:N))
219
220  !$acc kernels async (1)
221  do i = 1, N
222     b(i) = (a(i) * a(i) * a(i)) / a(i)
223  end do
224  !$acc end kernels
225
226  !$acc kernels async (1)
227  !$acc loop
228  do i = 1, N
229     c(i) = (a(i) * 4) / a(i)
230  end do
231  !$acc end kernels
232
233  !$acc kernels async (1)
234  !$acc loop
235  do i = 1, N
236     d(i) = ((a(i) * a(i) + a(i)) / a(i)) - a(i)
237  end do
238  !$acc end kernels
239
240  !$acc kernels wait (1) async (1)
241  !$acc loop
242  do i = 1, N
243     e(i) = a(i) + b(i) + c(i) + d(i)
244  end do
245  !$acc end kernels
246
247  !$acc wait (1)
248  !$acc end data
249
250  do i = 1, N
251     if (a(i) .ne. 2.0) STOP 22
252     if (b(i) .ne. 4.0) STOP 23
253     if (c(i) .ne. 4.0) STOP 24
254     if (d(i) .ne. 1.0) STOP 25
255     if (e(i) .ne. 11.0) STOP 26
256  end do
257end program asyncwait
258