blob: 0b11f454aca0938468aa5694328129898493f857 [file] [log] [blame]
! { dg-do run }
! Test no_create clause with data/parallel constructs.
program no_create
use openacc
implicit none
logical :: shared_memory
integer, parameter :: n = 512
integer :: myvar, myarr(n)
integer i
shared_memory = .false.
!$acc kernels copyin (shared_memory)
shared_memory = .true.
!$acc end kernels
myvar = 55
do i = 1, n
myarr(i) = 0
end do
call do_on_target(myvar, n, myarr)
if (shared_memory) then
if (myvar .ne. 44) stop 10
else
if (myvar .ne. 33) stop 11
end if
do i = 1, n
if (shared_memory) then
if (myarr(i) .ne. i * 2) stop 20
else
if (myarr(i) .ne. i) stop 21
end if
end do
myvar = 55
do i = 1, n
myarr(i) = 0
end do
!$acc enter data copyin(myvar, myarr)
call do_on_target(myvar, n, myarr)
!$acc exit data copyout(myvar, myarr)
if (myvar .ne. 44) stop 30
do i = 1, n
if (myarr(i) .ne. i * 2) stop 31
end do
end program no_create
subroutine do_on_target (var, n, arr)
use openacc
implicit none
integer :: var, n, arr(n)
integer :: i
!$acc data no_create (var, arr)
if (acc_is_present(var)) then
! The no_create clause is meant for partially shared-memory machines. This
! test is written to work on non-shared-memory machines, though this is not
! necessarily a useful way to use the no_create clause in practice.
!$acc parallel !no_create (var)
var = 44
!$acc end parallel
else
var = 33
end if
if (acc_is_present(arr)) then
! The no_create clause is meant for partially shared-memory machines. This
! test is written to work on non-shared-memory machines, though this is not
! necessarily a useful way to use the no_create clause in practice.
!$acc parallel loop !no_create (arr)
do i = 1, n
arr(i) = i * 2
end do
!$acc end parallel loop
else
do i = 1, n
arr(i) = i
end do
end if
!$acc end data
end subroutine do_on_target