xref: /llvm-project/flang/test/Semantics/OpenACC/acc-kernels-loop.f90 (revision a87ca1bbd9a4f36b1edd3d3d3c4a662e05388f4e)
1! RUN: %python %S/../test_errors.py %s %flang -fopenacc
2
3! Check OpenACC clause validity for the following construct and directive:
4!   2.11 Kernels Loop
5
6program openacc_kernels_loop_validity
7
8  implicit none
9
10  type atype
11    real(8), dimension(10) :: arr
12    real(8) :: s
13  end type atype
14
15  integer :: i, j, b, gang_size, vector_size, worker_size
16  integer, parameter :: N = 256
17  integer, dimension(N) :: c
18  logical, dimension(N) :: d, e
19  integer :: async1
20  integer :: wait1, wait2
21  real :: reduction_r
22  logical :: reduction_l
23  real(8), dimension(N, N) :: aa, bb, cc
24  real(8), dimension(:), allocatable :: dd
25  real(8), pointer :: p
26  logical :: ifCondition = .TRUE.
27  type(atype) :: t
28  type(atype), dimension(10) :: ta
29
30  real(8), dimension(N) :: a, f, g, h
31
32  !$acc kernels loop
33  do i = 1, N
34    a(i) = 3.14
35  end do
36
37  !$acc kernels loop
38  do i = 1, N
39    a(i) = 3.14
40  end do
41  !$acc end kernels loop
42
43  !$acc kernels loop
44  do i = 1, N
45    a(i) = 3.14
46  end do
47  !$acc end kernels loop
48
49  !$acc kernels loop num_gangs(8)
50  do i = 1, N
51    a(i) = 3.14
52  end do
53
54  !$acc kernels loop num_gangs(gang_size)
55  do i = 1, N
56    a(i) = 3.14
57  end do
58
59  !$acc kernels loop num_gangs(8)
60  do i = 1, N
61    a(i) = 3.14
62  end do
63
64  !$acc kernels loop num_workers(worker_size)
65  do i = 1, N
66    a(i) = 3.14
67  end do
68
69  !$acc kernels loop num_workers(8)
70  do i = 1, N
71    a(i) = 3.14
72  end do
73
74  !$acc kernels loop vector_length(vector_size)
75  do i = 1, N
76    a(i) = 3.14
77  end do
78
79  !$acc kernels loop vector_length(128)
80  do i = 1, N
81    a(i) = 3.14
82  end do
83
84  !$acc kernels loop num_gangs(gang_size)
85  do i = 1, N
86    a(i) = 3.14
87  end do
88
89
90  !$acc kernels loop if(.TRUE.)
91  do i = 1, N
92    a(i) = 3.14
93  end do
94
95  !$acc kernels loop if(ifCondition)
96  do i = 1, N
97    a(i) = 3.14
98  end do
99
100  !$acc kernels loop
101  do i = 1, N
102    a(i) = 3.14
103  end do
104  !ERROR: Unmatched END SERIAL LOOP directive
105  !$acc end serial loop
106
107  !ERROR: Clause IF is not allowed after clause DEVICE_TYPE on the KERNELS LOOP directive
108  !$acc kernels loop device_type(*) if(.TRUE.)
109  do i = 1, N
110    a(i) = 3.14
111  end do
112  !$acc end kernels loop
113
114  !$acc kernels loop async
115  do i = 1, N
116    a(i) = 3.14
117  end do
118
119  !$acc kernels loop async(1)
120  do i = 1, N
121    a(i) = 3.14
122  end do
123
124  !$acc kernels loop async(async1)
125  do i = 1, N
126    a(i) = 3.14
127  end do
128
129  !$acc kernels loop wait(wait1)
130  do i = 1, N
131    a(i) = 3.14
132  end do
133
134  !$acc kernels loop wait(wait1, wait2)
135  do i = 1, N
136    a(i) = 3.14
137  end do
138
139  !$acc kernels loop wait(wait1) wait(wait2)
140  do i = 1, N
141    a(i) = 3.14
142  end do
143
144  !$acc kernels loop wait(1, 2) async(3)
145  do i = 1, N
146    a(i) = 3.14
147  end do
148
149  !$acc kernels loop wait(queues: 1, 2) async(3)
150  do i = 1, N
151    a(i) = 3.14
152  end do
153
154  !$acc kernels loop wait(devnum: 1: 1, 2) async(3)
155  do i = 1, N
156    a(i) = 3.14
157  end do
158
159  !$acc kernels loop wait(devnum: 1: queues: 1, 2) async(3)
160  do i = 1, N
161    a(i) = 3.14
162  end do
163
164  !$acc kernels loop num_gangs(8)
165  do i = 1, N
166    a(i) = 3.14
167  end do
168
169  !$acc kernels loop num_workers(8)
170  do i = 1, N
171    a(i) = 3.14
172  end do
173
174  !$acc kernels loop vector_length(128)
175  do i = 1, N
176    a(i) = 3.14
177  end do
178
179  !$acc kernels loop if(.true.)
180  do i = 1, N
181    a(i) = 3.14
182  end do
183
184  !$acc kernels loop if(ifCondition)
185  do i = 1, N
186    a(i) = 3.14
187  end do
188
189  !ERROR: At most one IF clause can appear on the KERNELS LOOP directive
190  !$acc kernels loop if(.true.) if(ifCondition)
191  do i = 1, N
192    a(i) = 3.14
193  end do
194
195  !$acc kernels loop self
196  do i = 1, N
197    a(i) = 3.14
198  end do
199
200  !$acc kernels loop self(.true.)
201  do i = 1, N
202    a(i) = 3.14
203  end do
204
205  !$acc kernels loop self(ifCondition)
206  do i = 1, N
207    a(i) = 3.14
208  end do
209
210  !$acc kernels loop copy(aa) copyin(bb) copyout(cc)
211  do i = 1, N
212    a(i) = 3.14
213  end do
214
215  !$acc kernels loop copy(aa, bb) copyout(zero: cc)
216  do i = 1, N
217    a(i) = 3.14
218  end do
219
220  !$acc kernels loop present(aa, bb) create(cc)
221  do i = 1, N
222    a(i) = 3.14
223  end do
224
225  !$acc kernels loop copyin(readonly: aa, bb) create(zero: cc)
226  do i = 1, N
227    a(i) = 3.14
228  end do
229
230  !$acc kernels loop deviceptr(aa, bb) no_create(cc)
231  do i = 1, N
232    a(i) = 3.14
233  end do
234
235  !ERROR: Argument `aa` on the ATTACH clause must be a variable or array with the POINTER or ALLOCATABLE attribute
236  !$acc kernels loop attach(aa, dd, p)
237  do i = 1, N
238    a(i) = 3.14
239  end do
240
241  !$acc kernels loop private(aa, bb, cc)
242  do i = 1, N
243    a(i) = 3.14
244  end do
245
246  !$acc kernels loop default(none)
247  do i = 1, N
248    a(i) = 3.14
249  end do
250
251  !$acc kernels loop default(present)
252  do i = 1, N
253    a(i) = 3.14
254  end do
255
256  !ERROR: At most one DEFAULT clause can appear on the KERNELS LOOP directive
257  !$acc kernels loop default(none) default(present)
258  do i = 1, N
259    a(i) = 3.14
260  end do
261
262  !$acc kernels loop device_type(*)
263  do i = 1, N
264    a(i) = 3.14
265  end do
266
267  !$acc kernels loop device_type(multicore)
268  do i = 1, N
269    a(i) = 3.14
270  end do
271
272  !$acc kernels loop device_type(host, multicore)
273  do i = 1, N
274    a(i) = 3.14
275  end do
276
277  !$acc kernels loop device_type(*) async wait num_gangs(8) num_workers(8) vector_length(128)
278  do i = 1, N
279    a(i) = 3.14
280  end do
281
282  !$acc kernels loop device_type(*) async
283  do i = 1, N
284    a(i) = 3.14
285  end do
286
287  !ERROR: Clause IF is not allowed after clause DEVICE_TYPE on the KERNELS LOOP directive
288  !$acc kernels loop device_type(*) if(.TRUE.)
289  do i = 1, N
290    a(i) = 3.14
291  end do
292
293  !$acc parallel loop
294  do i = 1, N
295    if(i == 10) cycle
296  end do
297
298end program openacc_kernels_loop_validity
299