71 lines
1.5 KiB
Fortran
71 lines
1.5 KiB
Fortran
! Test allocatables in HAS_DEVICE_ADDR.
|
|
|
|
program main
|
|
use omp_lib
|
|
use iso_c_binding
|
|
implicit none
|
|
|
|
integer, parameter :: N = 5
|
|
integer, allocatable :: x
|
|
integer, allocatable :: y(:)
|
|
call scalar_dummy (x)
|
|
call array_dummy (y)
|
|
call array_dummy_optional (y)
|
|
call array_dummy_optional ()
|
|
|
|
contains
|
|
subroutine scalar_dummy (a)
|
|
integer, allocatable :: a
|
|
|
|
allocate (a)
|
|
a = 24
|
|
|
|
!$omp target data map(a) use_device_addr(a)
|
|
!$omp target has_device_addr(a)
|
|
a = 42
|
|
!$omp end target
|
|
!$omp end target data
|
|
if (a /= 42) stop 1
|
|
|
|
deallocate (a)
|
|
end subroutine scalar_dummy
|
|
|
|
subroutine array_dummy (a)
|
|
integer, allocatable :: a(:)
|
|
integer :: i
|
|
|
|
allocate (a(N))
|
|
a = 42
|
|
|
|
!$omp target data map(a) use_device_addr(a)
|
|
!$omp target has_device_addr(a)
|
|
a = [(i, i=1, N)]
|
|
!$omp end target
|
|
!$omp end target data
|
|
if (any (a /= [(i, i=1, N)])) stop 2
|
|
|
|
deallocate (a)
|
|
end subroutine array_dummy
|
|
|
|
subroutine array_dummy_optional (a)
|
|
integer, optional, allocatable :: a(:)
|
|
integer :: i
|
|
|
|
if (present (a)) then
|
|
allocate (a(N))
|
|
a = 42
|
|
end if
|
|
|
|
!$omp target data map(a) use_device_addr(a)
|
|
!$omp target has_device_addr(a)
|
|
if (present (a)) a = [(i, i=1, N)]
|
|
!$omp end target
|
|
!$omp end target data
|
|
|
|
if (present (a)) then
|
|
if (any (a /= [(i, i=1, N)])) stop 2
|
|
deallocate (a)
|
|
end if
|
|
end subroutine array_dummy_optional
|
|
|
|
end program main
|