90 lines
2.5 KiB
Fortran
90 lines
2.5 KiB
Fortran
! Test optional dummy arguments in HAS_DEVICE_ADDR.
|
|
|
|
program main
|
|
use omp_lib
|
|
use iso_c_binding
|
|
implicit none
|
|
|
|
integer, target :: x
|
|
integer, pointer :: ptr
|
|
integer, parameter :: N=7
|
|
real :: y1(N), y2(N)
|
|
integer, target :: y3(N:2*N-1)
|
|
integer :: i
|
|
|
|
x = 24
|
|
ptr => x
|
|
y1 = 42.24
|
|
y2 = 42.24
|
|
y3 = 42
|
|
|
|
call optional_scalar (is_present=.false.)
|
|
if (x /= 24) stop 1
|
|
|
|
call optional_scalar (x, is_present=.true.)
|
|
if (x /= 42) stop 2
|
|
|
|
call optional_ptr (is_present=.false.)
|
|
if (x /= 42) stop 3
|
|
if (ptr /= 42) stop 4
|
|
|
|
call optional_ptr (ptr, is_present=.true.)
|
|
if (x /= 84) stop 5
|
|
if (ptr /= 84) stop 6
|
|
|
|
call optional_array (is_present=.false.)
|
|
if (any (y1 /= [(42.24, i=1, N)])) stop 7
|
|
if (any (y2 /= [(42.24, i=1, N)])) stop 8
|
|
if (any (y3 /= [(42, i=1, N)])) stop 9
|
|
|
|
call optional_array (y1, y2, y3, is_present=.true.)
|
|
if (any (y1 /= [(42.24+i, i=1, N)])) stop 10
|
|
if (any (y2 /= [(42.24+2*i, i=1, N)])) stop 11
|
|
if (any (y3 /= [(42+3*i, i=1, N)])) stop 12
|
|
|
|
contains
|
|
subroutine optional_scalar (a, is_present)
|
|
integer, optional :: a
|
|
logical, value :: is_present
|
|
|
|
!$omp target data map(a) use_device_addr(a)
|
|
!$omp target has_device_addr(a)
|
|
if (is_present) a = 42
|
|
!$omp end target
|
|
!$omp end target data
|
|
end subroutine optional_scalar
|
|
|
|
subroutine optional_ptr (a, is_present)
|
|
integer, pointer, optional :: a
|
|
logical, value :: is_present
|
|
!$omp target data map(a) use_device_addr(a)
|
|
!$omp target has_device_addr(a)
|
|
if (is_present) a = 84
|
|
!$omp end target
|
|
!$omp end target data
|
|
end subroutine optional_ptr
|
|
|
|
subroutine optional_array (a, b, c, is_present)
|
|
real, optional :: a(:), b(*)
|
|
integer, optional, pointer, intent(in) :: c(:)
|
|
logical, value :: is_present
|
|
integer :: i
|
|
|
|
!$omp target data map(a, b(:N), c) use_device_addr(a, b, c)
|
|
!$omp target has_device_addr(a, b, c)
|
|
if (is_present) then
|
|
if (lbound(a,dim=1) /= 1 .or. ubound(a,dim=1) /= N) stop 21
|
|
if (lbound(b,dim=1) /= 1) stop 22
|
|
if (lbound(c,dim=1) /= N .or. ubound(c,dim=1) /= 2*N-1) stop 23
|
|
if (any (a /= [(42.24, i = 1, N)])) stop 24
|
|
if (any (b(:N) /= [(42.24, i = 1, N)])) stop 25
|
|
if (any (c /= [(42, i = 1, N)])) stop 26
|
|
a = [(42.24+i, i=1, N)]
|
|
b(:N) = [(42.24+2*i, i=1, N)]
|
|
c = [(42+3*i, i=1, N)]
|
|
end if
|
|
!$omp end target
|
|
!$omp end target data
|
|
end subroutine optional_array
|
|
|
|
end program main
|