forked from OSchip/llvm-project
444 lines
9.2 KiB
Fortran
444 lines
9.2 KiB
Fortran
! RUN: %S/test_errors.sh %s %t %f18 -fopenacc
|
|
|
|
! Check OpenACC clause validity for the following construct and directive:
|
|
! 2.6.5 Data
|
|
! 2.5.1 Parallel
|
|
! 2.5.2 Kernels
|
|
! 2.5.3 Serial
|
|
! 2.9 Loop
|
|
! 2.13 Declare
|
|
! 2.14.3 Set
|
|
! 2.14.4 Update
|
|
! 2.15.1 Routine
|
|
! 2.11 Parallel Loop
|
|
! 2.11 Kernels Loop
|
|
! 2.11 Serial Loop
|
|
|
|
program openacc_clause_validity
|
|
|
|
implicit none
|
|
|
|
integer :: i, j, b, gang_size, vector_size, worker_size
|
|
integer, parameter :: N = 256
|
|
integer, dimension(N) :: c
|
|
logical, dimension(N) :: d, e
|
|
real :: reduction_r
|
|
logical :: reduction_l
|
|
real(8), dimension(N, N) :: aa
|
|
|
|
!ERROR: At least one clause is required on the DECLARE directive
|
|
!$acc declare
|
|
real(8), dimension(N) :: a
|
|
|
|
!ERROR: At least one of ATTACH, COPYIN, CREATE clause must appear on the ENTER DATA directive
|
|
!$acc enter data
|
|
|
|
!ERROR: Only the READONLY modifier is allowed for the COPYIN clause on the ENTER DATA directive
|
|
!$acc enter data copyin(zero: i)
|
|
|
|
!ERROR: Only the ZERO modifier is allowed for the CREATE clause on the ENTER DATA directive
|
|
!$acc enter data create(readonly: i)
|
|
|
|
!ERROR: Only the ZERO modifier is allowed for the COPYOUT clause on the DATA directive
|
|
!$acc data copyout(readonly: i)
|
|
!$acc end data
|
|
|
|
!ERROR: COPYOUT clause is not allowed on the ENTER DATA directive
|
|
!$acc enter data copyin(i) copyout(i)
|
|
|
|
!ERROR: At most one IF clause can appear on the DATA directive
|
|
!$acc data copy(i) if(.true.) if(.true.)
|
|
!$acc end data
|
|
|
|
!ERROR: At least one of COPYOUT, DELETE, DETACH clause must appear on the EXIT DATA directive
|
|
!$acc exit data
|
|
|
|
!ERROR: At least one of USE_DEVICE clause must appear on the HOST_DATA directive
|
|
!$acc host_data
|
|
!$acc end host_data
|
|
|
|
!ERROR: At least one of DEFAULT_ASYNC, DEVICE_NUM, DEVICE_TYPE clause must appear on the SET directive
|
|
!$acc set
|
|
|
|
!ERROR: At least one of ATTACH, COPY, COPYIN, COPYOUT, CREATE, DEFAULT, DEVICEPTR, NO_CREATE, PRESENT clause must appear on the DATA directive
|
|
!$acc data
|
|
!$acc end data
|
|
|
|
!$acc data copyin(i)
|
|
!$acc end data
|
|
|
|
!$acc data copyin(i)
|
|
!ERROR: Unmatched PARALLEL directive
|
|
!$acc end parallel
|
|
|
|
!$acc update device(i) device_type(*) async
|
|
|
|
!ERROR: Clause IF is not allowed after clause DEVICE_TYPE on the UPDATE directive
|
|
!$acc update device(i) device_type(*) if(.TRUE.)
|
|
|
|
!$acc parallel
|
|
!ERROR: INDEPENDENT and SEQ clauses are mutually exclusive and may not appear on the same LOOP directive
|
|
!$acc loop seq independent
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end parallel
|
|
|
|
!$acc parallel
|
|
!$acc loop tile(2)
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end parallel
|
|
|
|
!$acc parallel loop tile(2)
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
|
|
!$acc parallel loop tile(2, 2)
|
|
do i = 1, N
|
|
do j = 1, N
|
|
aa(i, j) = 3.14
|
|
end do
|
|
end do
|
|
|
|
!$acc parallel device_type(*) num_gangs(2)
|
|
!$acc loop
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end parallel
|
|
|
|
!$acc parallel
|
|
!$acc loop seq
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end parallel
|
|
|
|
!$acc parallel
|
|
!$acc loop independent
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end parallel
|
|
|
|
!$acc parallel
|
|
!$acc loop auto
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end parallel
|
|
|
|
!$acc parallel
|
|
!$acc loop vector
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end parallel
|
|
|
|
!$acc parallel
|
|
!$acc loop vector(10)
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end parallel
|
|
|
|
!$acc parallel
|
|
!$acc loop vector(vector_size)
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end parallel
|
|
|
|
!$acc parallel
|
|
!$acc loop vector(length: vector_size)
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end parallel
|
|
|
|
!$acc parallel
|
|
!$acc loop worker
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end parallel
|
|
|
|
!$acc parallel
|
|
!$acc loop worker(10)
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end parallel
|
|
|
|
!$acc parallel
|
|
!$acc loop worker(worker_size)
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end parallel
|
|
|
|
!$acc parallel
|
|
!$acc loop worker(num: worker_size)
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end parallel
|
|
|
|
!$acc parallel
|
|
!$acc loop gang(gang_size)
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end parallel
|
|
|
|
!$acc parallel
|
|
!$acc loop gang(num: gang_size)
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end parallel
|
|
|
|
!$acc parallel
|
|
!$acc loop gang(gang_size, static:*)
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end parallel
|
|
|
|
!$acc parallel
|
|
!$acc loop gang(num: gang_size, static:*)
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end parallel
|
|
|
|
!$acc parallel
|
|
!$acc loop gang(num: gang_size, static: gang_size)
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end parallel
|
|
|
|
!$acc parallel
|
|
!$acc loop private(b, a(:))
|
|
do i = 1, N
|
|
a(i) = b
|
|
end do
|
|
!$acc end parallel
|
|
|
|
!$acc parallel
|
|
!$acc loop tile(*)
|
|
do i = 1, N
|
|
a(i) = b
|
|
end do
|
|
!$acc end parallel
|
|
|
|
!$acc parallel
|
|
!$acc loop tile(2, 2)
|
|
do i = 1, N
|
|
do j = 1, N
|
|
a(i) = b
|
|
end do
|
|
end do
|
|
!$acc end parallel
|
|
|
|
!$acc parallel
|
|
!ERROR: The parameter of the COLLAPSE clause must be a constant positive integer expression
|
|
!$acc loop collapse(-1)
|
|
do i = 1, N
|
|
do j = 1, N
|
|
a(i) = 3.14 + j
|
|
end do
|
|
end do
|
|
!$acc end parallel
|
|
|
|
!$acc parallel
|
|
!ERROR: Clause PRIVATE is not allowed after clause DEVICE_TYPE on the LOOP directive
|
|
!$acc loop device_type(*) private(i)
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end parallel
|
|
|
|
!$acc parallel
|
|
!ERROR: Clause GANG is not allowed if clause SEQ appears on the LOOP directive
|
|
!$acc loop gang seq
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end parallel
|
|
|
|
!ERROR: Clause IF is not allowed after clause DEVICE_TYPE on the PARALLEL directive
|
|
!$acc parallel device_type(*) if(.TRUE.)
|
|
!$acc loop
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end parallel
|
|
|
|
!ERROR: Clause IF is not allowed after clause DEVICE_TYPE on the PARALLEL LOOP directive
|
|
!$acc parallel loop device_type(*) if(.TRUE.)
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end parallel loop
|
|
|
|
!$acc kernels device_type(*) async
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end kernels
|
|
|
|
!ERROR: Clause IF is not allowed after clause DEVICE_TYPE on the KERNELS directive
|
|
!$acc kernels device_type(*) if(.TRUE.)
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end kernels
|
|
|
|
!ERROR: Clause IF is not allowed after clause DEVICE_TYPE on the KERNELS LOOP directive
|
|
!$acc kernels loop device_type(*) if(.TRUE.)
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end kernels loop
|
|
|
|
!$acc serial device_type(*) async
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end serial
|
|
|
|
!ERROR: Clause IF is not allowed after clause DEVICE_TYPE on the SERIAL directive
|
|
!$acc serial device_type(*) if(.TRUE.)
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end serial
|
|
|
|
!ERROR: Clause IF is not allowed after clause DEVICE_TYPE on the SERIAL LOOP directive
|
|
!$acc serial loop device_type(*) if(.TRUE.)
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!$acc end serial loop
|
|
|
|
!$acc parallel loop
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!ERROR: Unmatched END KERNELS LOOP directive
|
|
!$acc end kernels loop
|
|
|
|
!$acc kernels loop
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!ERROR: Unmatched END SERIAL LOOP directive
|
|
!$acc end serial loop
|
|
|
|
!$acc serial loop
|
|
do i = 1, N
|
|
a(i) = 3.14
|
|
end do
|
|
!ERROR: Unmatched END PARALLEL LOOP directive
|
|
!$acc end parallel loop
|
|
|
|
!$acc parallel loop reduction(+: reduction_r)
|
|
do i = 1, N
|
|
reduction_r = a(i) + i
|
|
end do
|
|
|
|
!$acc parallel loop reduction(*: reduction_r)
|
|
do i = 1, N
|
|
reduction_r = reduction_r * (a(i) + i)
|
|
end do
|
|
|
|
!$acc parallel loop reduction(min: reduction_r)
|
|
do i = 1, N
|
|
reduction_r = min(reduction_r, a(i) * i)
|
|
end do
|
|
|
|
!$acc parallel loop reduction(max: reduction_r)
|
|
do i = 1, N
|
|
reduction_r = max(reduction_r, a(i) * i)
|
|
end do
|
|
|
|
!$acc parallel loop reduction(iand: b)
|
|
do i = 1, N
|
|
b = iand(b, c(i))
|
|
end do
|
|
|
|
!$acc parallel loop reduction(ior: b)
|
|
do i = 1, N
|
|
b = ior(b, c(i))
|
|
end do
|
|
|
|
!$acc parallel loop reduction(ieor: b)
|
|
do i = 1, N
|
|
b = ieor(b, c(i))
|
|
end do
|
|
|
|
!$acc parallel loop reduction(.and.: reduction_l)
|
|
do i = 1, N
|
|
reduction_l = d(i) .and. e(i)
|
|
end do
|
|
|
|
!$acc parallel loop reduction(.or.: reduction_l)
|
|
do i = 1, N
|
|
reduction_l = d(i) .or. e(i)
|
|
end do
|
|
|
|
!$acc parallel loop reduction(.eqv.: reduction_l)
|
|
do i = 1, N
|
|
reduction_l = d(i) .eqv. e(i)
|
|
end do
|
|
|
|
!$acc parallel loop reduction(.neqv.: reduction_l)
|
|
do i = 1, N
|
|
reduction_l = d(i) .neqv. e(i)
|
|
end do
|
|
|
|
!$acc kernels wait(1, 2) async(3)
|
|
!$acc end kernels
|
|
|
|
!$acc kernels wait(queues: 1, 2) async(3)
|
|
!$acc end kernels
|
|
|
|
!$acc kernels wait(devnum: 1: 1, 2) async(3)
|
|
!$acc end kernels
|
|
|
|
!$acc kernels wait(devnum: 1: queues: 1, 2) async(3)
|
|
!$acc end kernels
|
|
|
|
!$acc wait(1)
|
|
!$acc wait(1, 2)
|
|
|
|
!$acc wait(queues: 1)
|
|
!$acc wait(queues: 1, 2)
|
|
|
|
!$acc wait(devnum: 1: 3)
|
|
!$acc wait(devnum: 1: 3, 4)
|
|
|
|
!$acc wait(devnum: 1: queues: 3)
|
|
!$acc wait(devnum: 1: queues: 3, 4)
|
|
|
|
contains
|
|
|
|
subroutine sub1(a)
|
|
real :: a(:)
|
|
!ERROR: At least one of GANG, SEQ, VECTOR, WORKER clause must appear on the ROUTINE directive
|
|
!$acc routine
|
|
end subroutine sub1
|
|
|
|
subroutine sub2(a)
|
|
real :: a(:)
|
|
!ERROR: Clause NOHOST is not allowed after clause DEVICE_TYPE on the ROUTINE directive
|
|
!$acc routine seq device_type(*) nohost
|
|
end subroutine sub2
|
|
|
|
end program openacc_clause_validity
|