program main use omp_lib implicit none integer, allocatable :: aaa(:,:,:) integer :: i allocate (aaa(-4:10,-3:8,2)) aaa(:,:,:) = reshape ([(i, i = 1, size(aaa))], shape(aaa)) do i = 0, omp_get_num_devices() !$omp target data map(to: aaa) device(i) call test_addr (aaa, i) call test_ptr (aaa, i) !$omp end target data end do deallocate (aaa) contains subroutine test_addr (aaaa, dev) use iso_c_binding integer, target, allocatable :: aaaa(:,:,:), bbbb(:,:,:) integer, value :: dev integer :: i type(c_ptr) :: ptr logical :: is_shared is_shared = .false. !$omp target device(dev) map(to: is_shared) is_shared = .true. !$omp end target allocate (bbbb(-4:10,-3:8,2)) bbbb(:,:,:) = reshape ([(-i, i = 1, size(bbbb))], shape(bbbb)) !$omp target enter data map(to: bbbb) device(dev) if (any (lbound (aaaa) /= [-4, -3, 1])) error stop 1 if (any (shape (aaaa) /= [15, 12, 2])) error stop 2 if (any (lbound (bbbb) /= [-4, -3, 1])) error stop 3 if (any (shape (bbbb) /= [15, 12, 2])) error stop 4 if (any (aaaa /= -bbbb)) error stop 5 if (any (aaaa /= reshape ([(i, i = 1, size(aaaa))], shape(aaaa)))) & error stop 6 !$omp parallel do shared(bbbb, aaaa) do i = 1,1 if (any (lbound (aaaa) /= [-4, -3, 1])) error stop 5 if (any (shape (aaaa) /= [15, 12, 2])) error stop 6 if (any (lbound (bbbb) /= [-4, -3, 1])) error stop 7 if (any (shape (bbbb) /= [15, 12, 2])) error stop 8 if (any (aaaa /= -bbbb)) error stop 5 if (any (aaaa /= reshape ([(i, i = 1, size(aaaa))], shape(aaaa)))) & error stop 6 ptr = c_loc (aaaa) !$omp target data use_device_addr(bbbb, aaaa) device(dev) if (any (lbound (aaaa) /= [-4, -3, 1])) error stop 9 if (any (shape (aaaa) /= [15, 12, 2])) error stop 10 if (any (lbound (bbbb) /= [-4, -3, 1])) error stop 11 if (any (shape (bbbb) /= [15, 12, 2])) error stop 12 if (is_shared) then if (any (aaaa /= -bbbb)) error stop 5 if (any (aaaa /= reshape ([(i, i = 1, size(aaaa))], shape(aaaa)))) & error stop 6 end if if (is_shared .neqv. c_associated (ptr, c_loc (aaaa))) error stop !$omp target has_device_addr(bbbb, aaaa) device(dev) if (any (lbound (aaaa) /= [-4, -3, 1])) error stop 9 if (any (shape (aaaa) /= [15, 12, 2])) error stop 10 if (any (lbound (bbbb) /= [-4, -3, 1])) error stop 11 if (any (shape (bbbb) /= [15, 12, 2])) error stop 12 if (any (aaaa /= -bbbb)) error stop 5 if (any (aaaa /= reshape ([(i, i = 1, size(aaaa))], shape(aaaa)))) & error stop 6 !$omp end target !$omp end target data end do !$omp target exit data map(delete: bbbb) device(dev) deallocate (bbbb) end subroutine test_addr subroutine test_ptr (aaaa, dev) use iso_c_binding integer, target, allocatable :: aaaa(:,:,:), bbbb(:,:,:) integer, value :: dev integer :: i type(c_ptr) :: ptr logical :: is_shared is_shared = .false. !$omp target device(dev) map(to: is_shared) is_shared = .true. !$omp end target allocate (bbbb(-4:10,-3:8,2)) bbbb(:,:,:) = reshape ([(-i, i = 1, size(bbbb))], shape(bbbb)) !$omp target enter data map(to: bbbb) device(dev) if (any (lbound (aaaa) /= [-4, -3, 1])) error stop 1 if (any (shape (aaaa) /= [15, 12, 2])) error stop 2 if (any (lbound (bbbb) /= [-4, -3, 1])) error stop 3 if (any (shape (bbbb) /= [15, 12, 2])) error stop 4 if (any (aaaa /= -bbbb)) error stop 5 if (any (aaaa /= reshape ([(i, i = 1, size(aaaa))], shape(aaaa)))) & error stop 6 !$omp parallel do shared(bbbb, aaaa) do i = 1,1 if (any (lbound (aaaa) /= [-4, -3, 1])) error stop 5 if (any (shape (aaaa) /= [15, 12, 2])) error stop 6 if (any (lbound (bbbb) /= [-4, -3, 1])) error stop 7 if (any (shape (bbbb) /= [15, 12, 2])) error stop 8 if (any (aaaa /= -bbbb)) error stop 5 if (any (aaaa /= reshape ([(i, i = 1, size(aaaa))], shape(aaaa)))) & error stop 6 ptr = c_loc (aaaa) !$omp target data use_device_ptr(bbbb, aaaa) device(dev) if (any (lbound (aaaa) /= [-4, -3, 1])) error stop 9 if (any (shape (aaaa) /= [15, 12, 2])) error stop 10 if (any (lbound (bbbb) /= [-4, -3, 1])) error stop 11 if (any (shape (bbbb) /= [15, 12, 2])) error stop 12 if (is_shared) then if (any (aaaa /= -bbbb)) error stop 5 if (any (aaaa /= reshape ([(i, i = 1, size(aaaa))], shape(aaaa)))) & error stop 6 end if if (is_shared .neqv. c_associated (ptr, c_loc (aaaa))) error stop ! Uses has_device_addr due to PR fortran/105318 !!$omp target is_device_ptr(bbbb, aaaa) device(dev) !$omp target has_device_addr(bbbb, aaaa) device(dev) if (any (lbound (aaaa) /= [-4, -3, 1])) error stop 9 if (any (shape (aaaa) /= [15, 12, 2])) error stop 10 if (any (lbound (bbbb) /= [-4, -3, 1])) error stop 11 if (any (shape (bbbb) /= [15, 12, 2])) error stop 12 if (any (aaaa /= -bbbb)) error stop 5 if (any (aaaa /= reshape ([(i, i = 1, size(aaaa))], shape(aaaa)))) & error stop 6 !$omp end target !$omp end target data end do !$omp target exit data map(delete: bbbb) device(dev) deallocate (bbbb) end subroutine test_ptr end program main