482 lines · plain
1! RUN: %python %S/../test_errors.py %s %flang -fopenacc2 3! Check OpenACC clause validity for the following construct and directive:4! 2.9 Loop5 6program openacc_loop_validity7 8 implicit none9 10 type atype11 real(8), dimension(10) :: arr12 real(8) :: s13 integer :: n14 end type atype15 16 integer :: i, j, k, l, m, b, gang_size, vector_size, worker_size17 integer, parameter :: N = 25618 integer, dimension(N) :: c19 logical, dimension(N) :: d, e20 integer :: async121 integer :: wait1, wait222 real :: reduction_r23 logical :: reduction_l24 real(8), dimension(N, N) :: aa, bb, cc25 logical :: ifCondition = .TRUE.26 type(atype) :: t27 type(atype), dimension(10) :: ta28 29 real(8), dimension(N) :: a, f, g, h30 31 !$acc parallel32 !$acc loop tile(2)33 do i = 1, N34 a(i) = 3.14d035 end do36 !$acc end parallel37 38 !$acc parallel device_type(*) num_gangs(2)39 !$acc loop40 do i = 1, N41 a(i) = 3.14d042 end do43 !$acc end parallel44 45 !$acc parallel46 !$acc loop seq47 do i = 1, N48 a(i) = 3.14d049 end do50 !$acc end parallel51 52 !$acc parallel53 !$acc loop independent54 do i = 1, N55 a(i) = 3.14d056 end do57 !$acc end parallel58 59 !$acc parallel60 !$acc loop auto61 do i = 1, N62 a(i) = 3.14d063 end do64 !$acc end parallel65 66 !$acc parallel67 !ERROR: At most one VECTOR clause can appear on the LOOP directive or in group separated by the DEVICE_TYPE clause68 !$acc loop vector vector(128)69 do i = 1, N70 a(i) = 3.14d071 end do72 !$acc end parallel73 74 !$acc parallel75 !$acc loop vector76 do i = 1, N77 a(i) = 3.14d078 end do79 !$acc end parallel80 81 !$acc parallel82 !$acc loop vector(10)83 do i = 1, N84 a(i) = 3.14d085 end do86 !$acc end parallel87 88 !$acc parallel89 !$acc loop vector(vector_size)90 do i = 1, N91 a(i) = 3.14d092 end do93 !$acc end parallel94 95 !$acc parallel96 !$acc loop vector(length: vector_size)97 do i = 1, N98 a(i) = 3.14d099 end do100 !$acc end parallel101 102 !$acc parallel103 !ERROR: At most one WORKER clause can appear on the LOOP directive or in group separated by the DEVICE_TYPE clause104 !$acc loop worker worker(10)105 do i = 1, N106 a(i) = 3.14d0107 end do108 !$acc end parallel109 110 !$acc parallel111 !$acc loop worker112 do i = 1, N113 a(i) = 3.14d0114 end do115 !$acc end parallel116 117 !$acc parallel118 !$acc loop worker(10)119 do i = 1, N120 a(i) = 3.14d0121 end do122 !$acc end parallel123 124 !$acc parallel125 !$acc loop worker(worker_size)126 do i = 1, N127 a(i) = 3.14d0128 end do129 !$acc end parallel130 131 !$acc parallel132 !$acc loop worker(num: worker_size)133 do i = 1, N134 a(i) = 3.14d0135 end do136 !$acc end parallel137 138 !$acc parallel139 !ERROR: At most one GANG clause can appear on the LOOP directive or in group separated by the DEVICE_TYPE clause140 !$acc loop gang gang(gang_size)141 do i = 1, N142 a(i) = 3.14d0143 end do144 !$acc end parallel145 146 !$acc loop gang device_type(default) gang(gang_size)147 do i = 1, N148 a(i) = 3.14d0149 end do150 151 !ERROR: At most one GANG clause can appear on the PARALLEL LOOP directive or in group separated by the DEVICE_TYPE clause152 !$acc parallel loop gang gang(gang_size)153 do i = 1, N154 a(i) = 3.14d0155 end do156 157 !$acc parallel loop gang device_type(default) gang(gang_size)158 do i = 1, N159 a(i) = 3.14d0160 end do161 162 !$acc parallel163 !$acc loop gang(gang_size)164 do i = 1, N165 a(i) = 3.14d0166 end do167 !$acc end parallel168 169 !$acc parallel170 !$acc loop gang(num: gang_size)171 do i = 1, N172 a(i) = 3.14d0173 end do174 !$acc end parallel175 176 !$acc parallel177 !$acc loop gang(gang_size, static:*)178 do i = 1, N179 a(i) = 3.14d0180 end do181 !$acc end parallel182 183 !$acc parallel184 !$acc loop gang(num: gang_size, static:*)185 do i = 1, N186 a(i) = 3.14d0187 end do188 !$acc end parallel189 190 !$acc parallel191 !$acc loop gang(num: gang_size, static: gang_size)192 do i = 1, N193 a(i) = 3.14d0194 end do195 !$acc end parallel196 197 !$acc parallel198 !$acc loop private(b, a(:))199 do i = 1, N200 a(i) = b201 end do202 !$acc end parallel203 204 !$acc parallel205 !$acc loop tile(*)206 do i = 1, N207 a(i) = b208 end do209 !$acc end parallel210 211 !$acc parallel212 !$acc loop tile(2, 2)213 do i = 1, N214 do j = 1, N215 a(i) = b216 end do217 end do218 !$acc end parallel219 220 !$acc parallel221 !ERROR: The parameter of the COLLAPSE clause must be a constant positive integer expression222 !$acc loop collapse(-1)223 do i = 1, N224 do j = 1, N225 a(i) = 3.14d0 + j226 end do227 end do228 !$acc end parallel229 230 !$acc parallel231 !ERROR: Clause PRIVATE is not allowed after clause DEVICE_TYPE on the LOOP directive232 !$acc loop device_type(*) private(i)233 do i = 1, N234 a(i) = 3.14d0235 end do236 !$acc end parallel237 238 !$acc parallel239 !ERROR: Clause GANG is not allowed if clause SEQ appears on the LOOP directive240 !$acc loop gang seq241 do i = 1, N242 a(i) = 3.14d0243 end do244 !$acc end parallel245 246 !$acc parallel247 !ERROR: Clause WORKER is not allowed if clause SEQ appears on the LOOP directive248 !$acc loop worker seq249 do i = 1, N250 a(i) = 3.14d0251 end do252 !$acc end parallel253 254 !$acc parallel255 !ERROR: Clause VECTOR is not allowed if clause SEQ appears on the LOOP directive256 !$acc loop vector seq257 do i = 1, N258 a(i) = 3.14d0259 end do260 !$acc end parallel261 262 !$acc parallel263 !$acc loop gang264 do i = 1, n265 !$acc loop worker266 do j = 1, n267 !ERROR: GANG clause is not allowed in the region of a loop with the WORKER clause268 !ERROR: GANG clause is not allowed in the region of a loop with the GANG clause269 !$acc loop gang vector270 do k = 1, i271 end do272 end do273 end do274 !$acc end parallel275 276 !$acc parallel loop vector277 do i = 1, n278 !ERROR: GANG clause is not allowed in the region of a loop with the VECTOR clause279 !$acc loop gang280 do j = 1, n281 !ERROR: WORKER clause is not allowed in the region of a loop with the VECTOR clause282 !$acc loop worker283 do k = 1, i284 !ERROR: VECTOR clause is not allowed in the region of a loop with the VECTOR clause285 !$acc loop vector286 do l = 1, 1287 end do288 end do289 end do290 end do291 !$acc end parallel loop292 293 !$acc kernels294 do i = 1, n295 !$acc loop gang worker296 do j = 1, n297 !ERROR: WORKER clause is not allowed in the region of a loop with the WORKER clause298 !$acc loop worker vector299 do k = 1, i300 end do301 end do302 end do303 !$acc end kernels304 305 !$acc parallel306 !$acc loop gang(dim:1)307 do i = 1, n308 !ERROR: GANG(dim:1) clause is not allowed in the region of a loop with the GANG(dim:1) clause309 !$acc loop gang(dim:1)310 do j = 1, n311 !ERROR: GANG(dim:2) clause is not allowed in the region of a loop with the GANG(dim:1) clause312 !$acc loop gang(dim:2)313 do k = 1, i314 !ERROR: GANG(dim:3) clause is not allowed in the region of a loop with the GANG(dim:2) clause315 !ERROR: GANG(dim:3) clause is not allowed in the region of a loop with the GANG(dim:1) clause316 !$acc loop gang(dim:3)317 do l = 1, 1318 !ERROR: GANG(dim:3) clause is not allowed in the region of a loop with the GANG(dim:3) clause319 !ERROR: GANG(dim:3) clause is not allowed in the region of a loop with the GANG(dim:2) clause320 !ERROR: GANG(dim:3) clause is not allowed in the region of a loop with the GANG(dim:1) clause321 !$acc loop gang(dim:3)322 do m = 1, 1323 end do324 end do325 end do326 end do327 end do328 !$acc end parallel329 330 !$acc parallel loop gang(dim:3)331 do i = 1, n332 !$acc loop gang(dim:2)333 do j = 1, n334 !$acc loop gang(dim:1) worker vector335 do k = 1, i336 end do337 end do338 end do339 !$acc end parallel loop340 341 !$acc kernels loop gang(dim:3)342 do i = 1, n343 !ERROR: Nested GANG loops are not allowed in the region of a KERNELS construct344 !$acc loop gang(dim:2)345 do j = 1, n346 !ERROR: Nested GANG loops are not allowed in the region of a KERNELS construct347 !$acc loop gang(dim:1) worker vector348 do k = 1, i349 end do350 end do351 end do352 !$acc end kernels loop353 354 !ERROR: Clause IF is not allowed after clause DEVICE_TYPE on the PARALLEL directive355 !$acc parallel device_type(*) if(.TRUE.)356 !$acc loop357 do i = 1, N358 a(i) = 3.14d0359 end do360 !$acc end parallel361 362 !$acc loop collapse(2)363 do i = 1, N364 !ERROR: Loop control is not present in the DO LOOP365 do366 a(i) = 3.14d0367 end do368 end do369 370 !ERROR: The num argument is not allowed when dim is specified371 !$acc loop gang(1, dim: 2)372 do i = 1, N373 end do374 375 !$acc loop376 do i = 1, N377 end do378 !$acc end loop379 380 !$acc loop collapse(2)381 do i = 1, 10382 !ERROR: LOOP directive not expected in COLLAPSE loop nest383 !$acc loop384 do j = 1, 10385 end do386 end do387 388 !$acc parallel389 !$acc loop390 do i = 1, n391 if(i == 10) cycle392 end do393 !$acc end parallel394 395 !$acc loop gang device_type(nvidia) gang(num: 8)396 DO i = 1, n397 END DO398 399 !$acc loop vector device_type(default) vector(16)400 DO i = 1, n401 END DO402 403 !$acc loop worker device_type(*) worker(8)404 DO i = 1, n405 END DO406 407 !$acc loop device_type(multicore) collapse(2)408 DO i = 1, n409 DO j = 1, n410 END DO411 END DO412 413 !ERROR: Trip count must be computable and invariant414 !$acc loop collapse(2)415 DO i = 1, n416 DO j = 1, c(i)417 END DO418 END DO419 420 !ERROR: Trip count must be computable and invariant421 !$acc loop collapse(2)422 DO i = 1, n423 DO j = 1, i424 END DO425 END DO426 427 !ERROR: Trip count must be computable and invariant428 !$acc loop collapse(2)429 DO i = 1, n430 DO j = 1, ta(i)%n431 END DO432 END DO433 434 !ERROR: Trip count must be computable and invariant435 !$acc parallel loop collapse(2)436 DO i = 1, n437 DO j = 1, ta(i)%n438 END DO439 END DO440 441 !ERROR: Trip count must be computable and invariant442 !$acc loop collapse(3)443 DO i = 1, n444 DO j = 1, n445 DO k = 1, i446 END DO447 END DO448 END DO449 450contains451 452 subroutine sub1()453 !$acc routine gang(dim:2)454 implicit none455 integer, parameter :: N = 256456 integer :: i, j457 458 !$acc loop gang(dim:2)459 DO j = 1, N460 !$acc loop gang(dim:1) vector461 DO i = 1, N462 END DO463 END DO464 end subroutine sub1465 466 subroutine sub2()467 !$acc routine gang(dim:2)468 implicit none469 integer, parameter :: N = 256470 integer :: i, j471 472 !$acc loop gang(dim:2)473 DO j = 1, N474 !ERROR: GANG(dim:2) clause is not allowed in the region of a loop with the GANG(dim:2) clause475 !$acc loop gang(dim:2) vector476 DO i = 1, N477 END DO478 END DO479 end subroutine sub2480 481end program openacc_loop_validity482