1! RUN: %python %S/../test_errors.py %s %flang -fopenacc 2 3! Check OpenACC clause validity for the following construct and directive: 4! 2.9 Loop 5 6program openacc_loop_validity 7 8 implicit none 9 10 type atype 11 real(8), dimension(10) :: arr 12 real(8) :: s 13 integer :: n 14 end type atype 15 16 integer :: i, j, k, b, gang_size, vector_size, worker_size 17 integer, parameter :: N = 256 18 integer, dimension(N) :: c 19 logical, dimension(N) :: d, e 20 integer :: async1 21 integer :: wait1, wait2 22 real :: reduction_r 23 logical :: reduction_l 24 real(8), dimension(N, N) :: aa, bb, cc 25 logical :: ifCondition = .TRUE. 26 type(atype) :: t 27 type(atype), dimension(10) :: ta 28 29 real(8), dimension(N) :: a, f, g, h 30 31 !$acc parallel 32 !$acc loop tile(2) 33 do i = 1, N 34 a(i) = 3.14 35 end do 36 !$acc end parallel 37 38 !$acc parallel device_type(*) num_gangs(2) 39 !$acc loop 40 do i = 1, N 41 a(i) = 3.14 42 end do 43 !$acc end parallel 44 45 !$acc parallel 46 !$acc loop seq 47 do i = 1, N 48 a(i) = 3.14 49 end do 50 !$acc end parallel 51 52 !$acc parallel 53 !$acc loop independent 54 do i = 1, N 55 a(i) = 3.14 56 end do 57 !$acc end parallel 58 59 !$acc parallel 60 !$acc loop auto 61 do i = 1, N 62 a(i) = 3.14 63 end do 64 !$acc end parallel 65 66 !$acc parallel 67 !ERROR: At most one VECTOR clause can appear on the LOOP directive or in group separated by the DEVICE_TYPE clause 68 !$acc loop vector vector(128) 69 do i = 1, N 70 a(i) = 3.14 71 end do 72 !$acc end parallel 73 74 !$acc parallel 75 !$acc loop vector 76 do i = 1, N 77 a(i) = 3.14 78 end do 79 !$acc end parallel 80 81 !$acc parallel 82 !$acc loop vector(10) 83 do i = 1, N 84 a(i) = 3.14 85 end do 86 !$acc end parallel 87 88 !$acc parallel 89 !$acc loop vector(vector_size) 90 do i = 1, N 91 a(i) = 3.14 92 end do 93 !$acc end parallel 94 95 !$acc parallel 96 !$acc loop vector(length: vector_size) 97 do i = 1, N 98 a(i) = 3.14 99 end do 100 !$acc end parallel 101 102 !$acc parallel 103 !ERROR: At most one WORKER clause can appear on the LOOP directive or in group separated by the DEVICE_TYPE clause 104 !$acc loop worker worker(10) 105 do i = 1, N 106 a(i) = 3.14 107 end do 108 !$acc end parallel 109 110 !$acc parallel 111 !$acc loop worker 112 do i = 1, N 113 a(i) = 3.14 114 end do 115 !$acc end parallel 116 117 !$acc parallel 118 !$acc loop worker(10) 119 do i = 1, N 120 a(i) = 3.14 121 end do 122 !$acc end parallel 123 124 !$acc parallel 125 !$acc loop worker(worker_size) 126 do i = 1, N 127 a(i) = 3.14 128 end do 129 !$acc end parallel 130 131 !$acc parallel 132 !$acc loop worker(num: worker_size) 133 do i = 1, N 134 a(i) = 3.14 135 end do 136 !$acc end parallel 137 138 !$acc parallel 139 !ERROR: At most one GANG clause can appear on the LOOP directive or in group separated by the DEVICE_TYPE clause 140 !$acc loop gang gang(gang_size) 141 do i = 1, N 142 a(i) = 3.14 143 end do 144 !$acc end parallel 145 146 !$acc loop gang device_type(default) gang(gang_size) 147 do i = 1, N 148 a(i) = 3.14 149 end do 150 151 !ERROR: At most one GANG clause can appear on the PARALLEL LOOP directive or in group separated by the DEVICE_TYPE clause 152 !$acc parallel loop gang gang(gang_size) 153 do i = 1, N 154 a(i) = 3.14 155 end do 156 157 !$acc parallel loop gang device_type(default) gang(gang_size) 158 do i = 1, N 159 a(i) = 3.14 160 end do 161 162 !$acc parallel 163 !$acc loop gang(gang_size) 164 do i = 1, N 165 a(i) = 3.14 166 end do 167 !$acc end parallel 168 169 !$acc parallel 170 !$acc loop gang(num: gang_size) 171 do i = 1, N 172 a(i) = 3.14 173 end do 174 !$acc end parallel 175 176 !$acc parallel 177 !$acc loop gang(gang_size, static:*) 178 do i = 1, N 179 a(i) = 3.14 180 end do 181 !$acc end parallel 182 183 !$acc parallel 184 !$acc loop gang(num: gang_size, static:*) 185 do i = 1, N 186 a(i) = 3.14 187 end do 188 !$acc end parallel 189 190 !$acc parallel 191 !$acc loop gang(num: gang_size, static: gang_size) 192 do i = 1, N 193 a(i) = 3.14 194 end do 195 !$acc end parallel 196 197 !$acc parallel 198 !$acc loop private(b, a(:)) 199 do i = 1, N 200 a(i) = b 201 end do 202 !$acc end parallel 203 204 !$acc parallel 205 !$acc loop tile(*) 206 do i = 1, N 207 a(i) = b 208 end do 209 !$acc end parallel 210 211 !$acc parallel 212 !$acc loop tile(2, 2) 213 do i = 1, N 214 do j = 1, N 215 a(i) = b 216 end do 217 end do 218 !$acc end parallel 219 220 !$acc parallel 221 !ERROR: The parameter of the COLLAPSE clause must be a constant positive integer expression 222 !$acc loop collapse(-1) 223 do i = 1, N 224 do j = 1, N 225 a(i) = 3.14 + j 226 end do 227 end do 228 !$acc end parallel 229 230 !$acc parallel 231 !ERROR: Clause PRIVATE is not allowed after clause DEVICE_TYPE on the LOOP directive 232 !$acc loop device_type(*) private(i) 233 do i = 1, N 234 a(i) = 3.14 235 end do 236 !$acc end parallel 237 238 !$acc parallel 239 !ERROR: Clause GANG is not allowed if clause SEQ appears on the LOOP directive 240 !$acc loop gang seq 241 do i = 1, N 242 a(i) = 3.14 243 end do 244 !$acc end parallel 245 246 !$acc parallel 247 !ERROR: Clause WORKER is not allowed if clause SEQ appears on the LOOP directive 248 !$acc loop worker seq 249 do i = 1, N 250 a(i) = 3.14 251 end do 252 !$acc end parallel 253 254 !$acc parallel 255 !ERROR: Clause VECTOR is not allowed if clause SEQ appears on the LOOP directive 256 !$acc loop vector seq 257 do i = 1, N 258 a(i) = 3.14 259 end do 260 !$acc end parallel 261 262 !ERROR: Clause IF is not allowed after clause DEVICE_TYPE on the PARALLEL directive 263 !$acc parallel device_type(*) if(.TRUE.) 264 !$acc loop 265 do i = 1, N 266 a(i) = 3.14 267 end do 268 !$acc end parallel 269 270 !$acc loop collapse(2) 271 do i = 1, N 272 !ERROR: Loop control is not present in the DO LOOP 273 do 274 a(i) = 3.14 275 end do 276 end do 277 278 !ERROR: The num argument is not allowed when dim is specified 279 !$acc loop gang(1, dim: 2) 280 do i = 1, N 281 end do 282 283 !$acc loop 284 do i = 1, N 285 end do 286 !$acc end loop 287 288 !$acc loop collapse(2) 289 do i = 1, 10 290 !ERROR: LOOP directive not expected in COLLAPSE loop nest 291 !$acc loop 292 do j = 1, 10 293 end do 294 end do 295 296 !$acc parallel 297 !$acc loop 298 do i = 1, n 299 if(i == 10) cycle 300 end do 301 !$acc end parallel 302 303 !$acc loop gang device_type(nvidia) gang(num: 8) 304 DO i = 1, n 305 END DO 306 307 !$acc loop vector device_type(default) vector(16) 308 DO i = 1, n 309 END DO 310 311 !$acc loop worker device_type(*) worker(8) 312 DO i = 1, n 313 END DO 314 315 !$acc loop device_type(multicore) collapse(2) 316 DO i = 1, n 317 DO j = 1, n 318 END DO 319 END DO 320 321 !ERROR: Trip count must be computable and invariant 322 !$acc loop collapse(2) 323 DO i = 1, n 324 DO j = 1, c(i) 325 END DO 326 END DO 327 328 !ERROR: Trip count must be computable and invariant 329 !$acc loop collapse(2) 330 DO i = 1, n 331 DO j = 1, i 332 END DO 333 END DO 334 335 !ERROR: Trip count must be computable and invariant 336 !$acc loop collapse(2) 337 DO i = 1, n 338 DO j = 1, ta(i)%n 339 END DO 340 END DO 341 342 !ERROR: Trip count must be computable and invariant 343 !$acc parallel loop collapse(2) 344 DO i = 1, n 345 DO j = 1, ta(i)%n 346 END DO 347 END DO 348 349 !ERROR: Trip count must be computable and invariant 350 !$acc loop collapse(3) 351 DO i = 1, n 352 DO j = 1, n 353 DO k = 1, i 354 END DO 355 END DO 356 END DO 357 358end program openacc_loop_validity 359