| ! Validate that a device pointer obtained via omp_get_mapped_ptr can be used |
| ! inside a TARGET region with the is_device_ptr clause. |
| ! REQUIRES: flang, amdgcn-amd-amdhsa |
| |
| ! RUN: %libomptarget-compile-fortran-run-and-check-generic |
| |
| module mod |
| implicit none |
| integer, parameter :: n = 4 |
| contains |
| subroutine kernel(dptr) |
| use iso_c_binding, only : c_ptr, c_f_pointer |
| implicit none |
| |
| type(c_ptr) :: dptr |
| integer, dimension(:), pointer :: b |
| integer :: i |
| |
| b => null() |
| |
| !$omp target is_device_ptr(dptr) |
| call c_f_pointer(dptr, b, [n]) |
| do i = 1, n |
| b(i) = b(i) + 1 |
| end do |
| !$omp end target |
| end subroutine kernel |
| end module mod |
| |
| program is_device_ptr_target |
| use iso_c_binding, only : c_ptr, c_loc, c_f_pointer |
| use omp_lib, only: omp_get_default_device, omp_get_mapped_ptr |
| use mod, only: kernel, n |
| implicit none |
| |
| integer, dimension(n), target :: a |
| integer :: dev |
| type(c_ptr) :: dptr |
| |
| a = [2, 4, 6, 8] |
| print '("BEFORE:", I3)', a |
| |
| dev = omp_get_default_device() |
| |
| !$omp target data map(tofrom: a) |
| dptr = omp_get_mapped_ptr(c_loc(a), dev) |
| call kernel(dptr) |
| !$omp end target data |
| |
| print '("AFTER: ", I3)', a |
| |
| if (all(a == [3, 5, 7, 9])) then |
| print '("PASS")' |
| else |
| print '("FAIL ", I3)', a |
| end if |
| |
| end program is_device_ptr_target |
| |
| !CHECK: PASS |