154 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.11 Parallel Loop5 6program openacc_parallel_loop_validity7 8 implicit none9 10 integer :: i, j, b11 integer, parameter :: N = 25612 integer, dimension(N) :: c13 logical, dimension(N) :: d, e14 real :: reduction_r15 logical :: reduction_l16 logical :: ifCondition = .TRUE.17 real(8), dimension(N) :: a, f, g, h18 real(8), dimension(N, N) :: aa, bb, cc19 20 !$acc parallel loop21 do i = 1, N22 a(i) = 3.14d023 end do24 25 !$acc parallel loop26 do i = 1, N27 a(i) = 3.14d028 end do29 !$acc end parallel loop30 31 !$acc parallel loop32 do i = 1, N33 a(i) = 3.14d034 end do35 !$acc end parallel36 37 !$acc parallel loop tile(2)38 do i = 1, N39 a(i) = 3.14d040 end do41 42 !$acc parallel loop self43 do i = 1, N44 a(i) = 3.14d045 end do46 47 !ERROR: SELF clause on the PARALLEL LOOP directive only accepts optional scalar logical expression48 !$acc parallel loop self(bb, cc(:,:))49 do i = 1, N50 a(i) = 3.14d051 end do52 53 !$acc parallel loop self(.true.)54 do i = 1, N55 a(i) = 3.14d056 end do57 58 !$acc parallel loop self(ifCondition)59 do i = 1, N60 a(i) = 3.14d061 end do62 63 !$acc parallel loop tile(2, 2)64 do i = 1, N65 do j = 1, N66 aa(i, j) = 3.14d067 end do68 end do69 70 !ERROR: Clause IF is not allowed after clause DEVICE_TYPE on the PARALLEL LOOP directive71 !$acc parallel loop device_type(*) if(.TRUE.)72 do i = 1, N73 a(i) = 3.14d074 end do75 !$acc end parallel loop76 77 !$acc kernels loop78 do i = 1, N79 a(i) = 3.14d080 end do81 !ERROR: Unmatched END PARALLEL LOOP directive82 !$acc end parallel loop83 84 !$acc parallel loop reduction(+: reduction_r)85 do i = 1, N86 reduction_r = a(i) + i87 end do88 89 !$acc parallel loop reduction(*: reduction_r)90 do i = 1, N91 reduction_r = reduction_r * (a(i) + i)92 end do93 94 !$acc parallel loop reduction(min: reduction_r)95 do i = 1, N96 reduction_r = min(reduction_r, a(i) * i)97 end do98 99 !$acc parallel loop reduction(max: reduction_r)100 do i = 1, N101 reduction_r = max(reduction_r, a(i) * i)102 end do103 104 !$acc parallel loop reduction(iand: b)105 do i = 1, N106 b = iand(b, c(i))107 end do108 109 !$acc parallel loop reduction(ior: b)110 do i = 1, N111 b = ior(b, c(i))112 end do113 114 !$acc parallel loop reduction(ieor: b)115 do i = 1, N116 b = ieor(b, c(i))117 end do118 119 !$acc parallel loop reduction(.and.: reduction_l)120 do i = 1, N121 reduction_l = d(i) .and. e(i)122 end do123 124 !$acc parallel loop reduction(.or.: reduction_l)125 do i = 1, N126 reduction_l = d(i) .or. e(i)127 end do128 129 !$acc parallel loop reduction(.eqv.: reduction_l)130 do i = 1, N131 reduction_l = d(i) .eqv. e(i)132 end do133 134 !$acc parallel loop reduction(.neqv.: reduction_l)135 do i = 1, N136 reduction_l = d(i) .neqv. e(i)137 end do138 139 !$acc parallel loop140 do i = 1, N141 if(i == 10) cycle142 end do143 144 !$acc parallel loop async(1) device_type(nvidia) async(3)145 do i = 1, n146 end do147 148!ERROR: At most one ASYNC clause can appear on the PARALLEL LOOP directive or in group separated by the DEVICE_TYPE clause149 !$acc parallel loop async(1) device_type(nvidia) async async150 do i = 1, n151 end do152 153end program openacc_parallel_loop_validity154