blob: 54b2a6c37c183a5b769c8236fe0a92c7610a8172 [file]
! { dg-do run }
! { dg-require-effective-target offload_device_nonshared_as }
! Test target enter data and target update to the target using map
! iterators with a function.
program test
implicit none
integer, parameter :: DIM1 = 8
integer, parameter :: DIM2 = 15
type :: array_ptr
integer, pointer :: arr(:)
end type
type (array_ptr) :: x(DIM1)
integer :: x_new(DIM1, DIM2)
integer :: expected, sum, i, j
call mkarray (x)
!$omp target enter data map(to: x(:DIM1))
!$omp target enter data map(iterator(i=1:DIM1), to: x(i)%arr(:))
! Update x on host.
do i = 1, DIM1
do j = 1, DIM2
x_new(i, j) = x(i)%arr(j)
x(i)%arr(j) = (i + 1) * (j + 2);
end do
end do
! Update a subset of x on target.
!$omp target update to(iterator(i=1:DIM1/2): x(f (i))%arr(:))
!$omp target map(from: sum)
sum = 0
do i = 1, DIM1
do j = 1, DIM2
sum = sum + x(i)%arr(j)
end do
end do
!$omp end target
! Calculate expected value on host.
do i = 1, DIM1/2
do j = 1, DIM2
x_new(f (i), j) = x(f (i))%arr(j)
end do
end do
expected = 0
do i = 1, DIM1
do j = 1, DIM2
expected = expected + x_new(i, j)
end do
end do
if (sum .ne. expected) stop 1
contains
subroutine mkarray (x)
type (array_ptr), intent(inout) :: x(DIM1)
do i = 1, DIM1
allocate (x(i)%arr(DIM2))
do j = 1, DIM2
x(i)%arr(j) = i * j
end do
end do
end subroutine
integer function f (i)
integer, intent(in) :: i
f = i * 2
end function
end program