| ! { 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 |