| ! Test for map type close, verifying it appropriately places memory |
| ! near/on device when utilised in USM mode. |
| ! REQUIRES: clang, flang, amdgpu |
| |
| ! RUN: %clang -c -fopenmp -fopenmp-targets=amdgcn-amd-amdhsa \ |
| ! RUN: %S/../../Inputs/target-use-dev-ptr.c -o target-use-dev-ptr_c.o |
| ! RUN: %libomptarget-compile-fortran-generic target-use-dev-ptr_c.o |
| ! RUN: env HSA_XNACK=1 \ |
| ! RUN: %libomptarget-run-generic | %fcheck-generic |
| |
| program use_device_test |
| use iso_c_binding |
| implicit none |
| interface |
| type(c_ptr) function get_ptr() BIND(C) |
| USE, intrinsic :: iso_c_binding |
| implicit none |
| end function get_ptr |
| |
| integer(c_int) function check_equality(host, dev) BIND(C) |
| USE, intrinsic :: iso_c_binding |
| implicit none |
| type(c_ptr), value, intent(in) :: host, dev |
| end function check_equality |
| end interface |
| type(c_ptr) :: host_alloc, device_alloc |
| integer, pointer :: a |
| !$omp requires unified_shared_memory |
| |
| allocate(a) |
| host_alloc = C_LOC(a) |
| |
| ! map + target no close |
| device_alloc = c_null_ptr |
| !$omp target data map(tofrom: a, device_alloc) |
| !$omp target map(tofrom: device_alloc) |
| device_alloc = C_LOC(a) |
| !$omp end target |
| !$omp end target data |
| |
| ! CHECK: a used from unified memory |
| if (check_equality(host_alloc, device_alloc) == 1) then |
| print*, "a used from unified memory" |
| end if |
| |
| ! map + target with close |
| device_alloc = c_null_ptr |
| !$omp target data map(close, tofrom: a) map(tofrom: device_alloc) |
| !$omp target map(tofrom: device_alloc) |
| device_alloc = C_LOC(a) |
| !$omp end target |
| !$omp end target data |
| |
| ! CHECK: a copied to device |
| if (check_equality(host_alloc, device_alloc) == 0) then |
| print *, "a copied to device" |
| end if |
| |
| ! map + use_device_ptr no close |
| device_alloc = c_null_ptr |
| !$omp target data map(tofrom: a) use_device_ptr(a) |
| device_alloc = C_LOC(a) |
| !$omp end target data |
| |
| ! CHECK: a used from unified memory with use_device_ptr |
| if (check_equality(host_alloc, device_alloc) == 1) then |
| print *, "a used from unified memory with use_device_ptr" |
| end if |
| |
| ! map enter/exit + close |
| device_alloc = c_null_ptr |
| !$omp target enter data map(close, to: a) |
| |
| !$omp target map(from: device_alloc) |
| device_alloc = C_LOC(a) |
| !$omp end target |
| |
| !$omp target exit data map(from: a) |
| |
| ! CHECK: a has been mapped to the device |
| if (check_equality(host_alloc, device_alloc) == 0) then |
| print *, "a has been mapped to the device" |
| end if |
| |
| end program use_device_test |