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 Parallel Loop 5 6program openacc_parallel_loop_validity 7 8 implicit none 9 10 integer :: i, j, b 11 integer, parameter :: N = 256 12 integer, dimension(N) :: c 13 logical, dimension(N) :: d, e 14 real :: reduction_r 15 logical :: reduction_l 16 logical :: ifCondition = .TRUE. 17 real(8), dimension(N) :: a, f, g, h 18 real(8), dimension(N, N) :: aa, bb, cc 19 20 !$acc parallel loop tile(2) 21 do i = 1, N 22 a(i) = 3.14 23 end do 24 25 !$acc parallel loop self 26 do i = 1, N 27 a(i) = 3.14 28 end do 29 30 !ERROR: SELF clause on the PARALLEL LOOP directive only accepts optional scalar logical expression 31 !$acc parallel loop self(bb, cc(:)) 32 do i = 1, N 33 a(i) = 3.14 34 end do 35 36 !$acc parallel loop self(.true.) 37 do i = 1, N 38 a(i) = 3.14 39 end do 40 41 !$acc parallel loop self(ifCondition) 42 do i = 1, N 43 a(i) = 3.14 44 end do 45 46 !$acc parallel loop tile(2, 2) 47 do i = 1, N 48 do j = 1, N 49 aa(i, j) = 3.14 50 end do 51 end do 52 53 !ERROR: Clause IF is not allowed after clause DEVICE_TYPE on the PARALLEL LOOP directive 54 !$acc parallel loop device_type(*) if(.TRUE.) 55 do i = 1, N 56 a(i) = 3.14 57 end do 58 !$acc end parallel loop 59 60 !$acc kernels loop 61 do i = 1, N 62 a(i) = 3.14 63 end do 64 !ERROR: Unmatched END PARALLEL LOOP directive 65 !$acc end parallel loop 66 67 !$acc parallel loop reduction(+: reduction_r) 68 do i = 1, N 69 reduction_r = a(i) + i 70 end do 71 72 !$acc parallel loop reduction(*: reduction_r) 73 do i = 1, N 74 reduction_r = reduction_r * (a(i) + i) 75 end do 76 77 !$acc parallel loop reduction(min: reduction_r) 78 do i = 1, N 79 reduction_r = min(reduction_r, a(i) * i) 80 end do 81 82 !$acc parallel loop reduction(max: reduction_r) 83 do i = 1, N 84 reduction_r = max(reduction_r, a(i) * i) 85 end do 86 87 !$acc parallel loop reduction(iand: b) 88 do i = 1, N 89 b = iand(b, c(i)) 90 end do 91 92 !$acc parallel loop reduction(ior: b) 93 do i = 1, N 94 b = ior(b, c(i)) 95 end do 96 97 !$acc parallel loop reduction(ieor: b) 98 do i = 1, N 99 b = ieor(b, c(i)) 100 end do 101 102 !$acc parallel loop reduction(.and.: reduction_l) 103 do i = 1, N 104 reduction_l = d(i) .and. e(i) 105 end do 106 107 !$acc parallel loop reduction(.or.: reduction_l) 108 do i = 1, N 109 reduction_l = d(i) .or. e(i) 110 end do 111 112 !$acc parallel loop reduction(.eqv.: reduction_l) 113 do i = 1, N 114 reduction_l = d(i) .eqv. e(i) 115 end do 116 117 !$acc parallel loop reduction(.neqv.: reduction_l) 118 do i = 1, N 119 reduction_l = d(i) .neqv. e(i) 120 end do 121 122end program openacc_parallel_loop_validity 123