| ! { dg-do run } |
| ! |
| ! Test user_device_ptr nested within another parallel |
| ! construct |
| ! |
| program test_nested_use_device_ptr |
| use iso_c_binding, only: c_loc, c_ptr |
| implicit none |
| real, allocatable, target :: arr(:,:) |
| integer :: width = 1024, height = 1024, i |
| type(c_ptr) :: devptr |
| |
| allocate(arr(width,height)) |
| |
| !$omp target enter data map(alloc: arr) |
| |
| !$omp target data use_device_ptr(arr) |
| devptr = c_loc(arr(1,1)) |
| !$omp end target data |
| |
| !$omp parallel default(none) shared(arr, devptr) |
| !$omp single |
| |
| !$omp target data use_device_ptr(arr) |
| call thing(c_loc(arr), devptr) |
| !$omp end target data |
| |
| !$omp end single |
| !$omp end parallel |
| !$omp target exit data map(delete: arr) |
| |
| contains |
| |
| subroutine thing(myarr, devptr) |
| use iso_c_binding, only: c_ptr, c_associated |
| implicit none |
| type(c_ptr) :: myarr, devptr |
| if (.not.c_associated(myarr, devptr)) stop 1 |
| end subroutine thing |
| |
| end program |