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