| ! { dg-do run } |
| |
| module target_procs |
| use iso_c_binding |
| implicit none (type, external) |
| private |
| public :: copy3_array, copy3_scalar, copy3_array1, copy3_array3 |
| contains |
| subroutine copy3_array_int(from_ptr, to_ptr, N) |
| !$omp declare target |
| real(c_double) :: from_ptr(:) |
| real(c_double) :: to_ptr(:) |
| integer, value :: N |
| integer :: i |
| |
| !$omp parallel do |
| do i = 1, N |
| to_ptr(i) = 3 * from_ptr(i) |
| end do |
| !$omp end parallel do |
| end subroutine copy3_array_int |
| |
| subroutine copy3_scalar_int(from, to) |
| !$omp declare target |
| real(c_double) :: from, to |
| |
| to = 3 * from |
| end subroutine copy3_scalar_int |
| |
| |
| subroutine copy3_array(from, to, N) |
| type(c_ptr), value :: from, to |
| integer, value :: N |
| real(c_double), pointer :: from_ptr(:), to_ptr(:) |
| |
| call c_f_pointer(from, from_ptr, shape=[N]) |
| call c_f_pointer(to, to_ptr, shape=[N]) |
| |
| call do_offload_scalar(from_ptr,to_ptr) |
| contains |
| subroutine do_offload_scalar(from_r, to_r) |
| real(c_double), target :: from_r(:), to_r(:) |
| ! The extra function is needed as is_device_ptr |
| ! requires non-value, non-pointer dummy arguments |
| |
| !$omp target is_device_ptr(from_r, to_r) |
| call copy3_array_int(from_r, to_r, N) |
| !$omp end target |
| end subroutine do_offload_scalar |
| end subroutine copy3_array |
| |
| subroutine copy3_scalar(from, to) |
| type(c_ptr), value, target :: from, to |
| real(c_double), pointer :: from_ptr(:), to_ptr(:) |
| |
| ! Standard-conform detour of using an array as at time of writing |
| ! is_device_ptr below does not handle scalars |
| call c_f_pointer(from, from_ptr, shape=[1]) |
| call c_f_pointer(to, to_ptr, shape=[1]) |
| |
| call do_offload_scalar(from_ptr,to_ptr) |
| contains |
| subroutine do_offload_scalar(from_r, to_r) |
| real(c_double), target :: from_r(:), to_r(:) |
| ! The extra function is needed as is_device_ptr |
| ! requires non-value, non-pointer dummy arguments |
| |
| !$omp target is_device_ptr(from_r, to_r) |
| call copy3_scalar_int(from_r(1), to_r(1)) |
| !$omp end target |
| end subroutine do_offload_scalar |
| end subroutine copy3_scalar |
| |
| subroutine copy3_array1(from, to) |
| real(c_double), target :: from(:), to(:) |
| integer :: N |
| N = size(from) |
| |
| !!$omp target is_device_ptr(from, to) |
| call copy3_array(c_loc(from), c_loc(to), N) |
| !!$omp end target |
| end subroutine copy3_array1 |
| |
| subroutine copy3_array3(from, to) |
| real(c_double), optional, target :: from(:), to(:) |
| integer :: N |
| N = size(from) |
| |
| ! !$omp target is_device_ptr(from, to) |
| call copy3_array(c_loc(from), c_loc(to), N) |
| ! !$omp end target |
| end subroutine copy3_array3 |
| end module target_procs |
| |
| |
| |
| module offloading2 |
| use iso_c_binding |
| use target_procs |
| implicit none (type, external) |
| contains |
| ! Same as main program but uses dummy *nonoptional* arguments |
| subroutine use_device_ptr_sub(AA, BB, CC, DD, EE, FF, AptrA, BptrB, N) |
| real(c_double), pointer :: AA(:), BB(:) |
| real(c_double), allocatable, target :: CC(:), DD(:) |
| real(c_double), target :: EE(N), FF(N), dummy(1) |
| real(c_double), pointer :: AptrA(:), BptrB(:) |
| intent(inout) :: AA, BB, CC, DD, EE, FF |
| integer, value :: N |
| |
| type(c_ptr) :: tgt_aptr, tgt_bptr, tgt_cptr, tgt_dptr, tgt_eptr, tgt_fptr |
| |
| AA = 11.0_c_double |
| BB = 22.0_c_double |
| CC = 33.0_c_double |
| DD = 44.0_c_double |
| EE = 55.0_c_double |
| FF = 66.0_c_double |
| |
| ! pointer-type array to use_device_ptr |
| !$omp target data map(to:AA) map(from:BB) use_device_ptr(AA,BB) |
| call copy3_array(c_loc(AA), c_loc(BB), N) |
| !$omp end target data |
| |
| if (any(abs(AA - 11.0_c_double) > 10.0_c_double * epsilon(AA))) stop 1 |
| if (any(abs(3.0_c_double * AA - BB) > 10.0_c_double * epsilon(AA))) stop 2 |
| |
| ! allocatable array to use_device_ptr |
| !$omp target data map(to:CC) map(from:DD) use_device_ptr(CC,DD) |
| call copy3_array(c_loc(CC), c_loc(DD), N) |
| !$omp end target data |
| |
| if (any(abs(CC - 33.0_c_double) > 10.0_c_double * epsilon(CC))) stop 3 |
| if (any(abs(3.0_c_double * CC - DD) > 10.0_c_double * epsilon(CC))) stop 4 |
| |
| ! fixed-size decriptorless array to use_device_ptr |
| !$omp target data map(to:EE) map(from:FF) use_device_ptr(EE,FF) |
| call copy3_array(c_loc(EE), c_loc(FF), N) |
| !$omp end target data |
| |
| if (any(abs(EE - 55.0_c_double) > 10.0_c_double * epsilon(EE))) stop 5 |
| if (any(abs(3.0_c_double * EE - FF) > 10.0_c_double * epsilon(EE))) stop 6 |
| |
| |
| |
| AA = 111.0_c_double |
| BB = 222.0_c_double |
| CC = 333.0_c_double |
| DD = 444.0_c_double |
| EE = 555.0_c_double |
| FF = 666.0_c_double |
| |
| ! pointer-type array to use_device_ptr |
| !$omp target data map(to:AA) map(from:BB) |
| !$omp target data map(alloc:dummy) use_device_ptr(AA,BB) |
| tgt_aptr = c_loc(AA) |
| tgt_bptr = c_loc(BB) |
| AptrA => AA |
| BptrB => BB |
| !$omp end target data |
| |
| call copy3_array(tgt_aptr, tgt_bptr, N) |
| !$omp target update from(BB) |
| if (any(abs(AA - 111.0_c_double) > 10.0_c_double * epsilon(AA))) stop 7 |
| if (any(abs(3.0_c_double * AA - BB) > 10.0_c_double * epsilon(AA))) stop 8 |
| |
| AA = 1111.0_c_double |
| !$omp target update to(AA) |
| call copy3_array(tgt_aptr, tgt_bptr, N) |
| !$omp target update from(BB) |
| if (any(abs(AA - 1111.0_c_double) > 10.0_c_double * epsilon(AA))) stop 9 |
| if (any(abs(3.0_c_double * AA - BB) > 10.0_c_double * epsilon(AA))) stop 10 |
| |
| ! AprtA tests |
| AA = 7.0_c_double |
| !$omp target update to(AA) |
| call copy3_array(c_loc(AptrA), c_loc(BptrB), N) |
| !$omp target update from(BB) |
| if (any(abs(AA - 7.0_c_double) > 10.0_c_double * epsilon(AA))) stop 11 |
| if (any(abs(3.0_c_double * AA - BB) > 10.0_c_double * epsilon(AA))) stop 12 |
| |
| AA = 77.0_c_double |
| !$omp target update to(AA) |
| call copy3_array1(AptrA, BptrB) |
| !$omp target update from(BB) |
| if (any(abs(AA - 77.0_c_double) > 10.0_c_double * epsilon(AA))) stop 13 |
| if (any(abs(3.0_c_double * AA - BB) > 10.0_c_double * epsilon(AA))) stop 14 |
| |
| ! AA = 777.0_c_double |
| ! !$omp target update to(AA) |
| ! call copy3_array2(AptrA, BptrB) |
| ! !$omp target update from(BB) |
| ! if (any(abs(AA - 777.0_c_double) > 10.0_c_double * epsilon(AA))) stop 15 |
| ! if (any(abs(3.0_c_double * AA - BB) > 10.0_c_double * epsilon(AA))) stop 16 |
| |
| AA = 7777.0_c_double |
| !$omp target update to(AA) |
| call copy3_array3(AptrA, BptrB) |
| !$omp target update from(BB) |
| if (any(abs(AA - 7777.0_c_double) > 10.0_c_double * epsilon(AA))) stop 17 |
| if (any(abs(3.0_c_double * AA - BB) > 10.0_c_double * epsilon(AA))) stop 18 |
| |
| ! AA = 77777.0_c_double |
| ! !$omp target update to(AA) |
| ! call copy3_array4(AptrA, BptrB) |
| ! !$omp target update from(BB) |
| !$omp end target data |
| ! |
| ! if (any(abs(AA - 77777.0_c_double) > 10.0_c_double * epsilon(AA))) stop 19 |
| ! if (any(abs(3.0_c_double * AA - BB) > 10.0_c_double * epsilon(AA))) stop 20 |
| |
| |
| |
| ! allocatable array to use_device_ptr |
| !$omp target data map(to:CC) map(from:DD) |
| !$omp target data map(alloc:dummy) use_device_ptr(CC,DD) |
| tgt_cptr = c_loc(CC) |
| tgt_dptr = c_loc(DD) |
| !$omp end target data |
| |
| call copy3_array(tgt_cptr, tgt_dptr, N) |
| !$omp target update from(DD) |
| if (any(abs(CC - 333.0_c_double) > 10.0_c_double * epsilon(CC))) stop 21 |
| if (any(abs(3.0_c_double * CC - DD) > 10.0_c_double * epsilon(CC))) stop 22 |
| |
| CC = 3333.0_c_double |
| !$omp target update to(CC) |
| call copy3_array(tgt_cptr, tgt_dptr, N) |
| !$omp target update from(DD) |
| !$omp end target data |
| |
| if (any(abs(CC - 3333.0_c_double) > 10.0_c_double * epsilon(CC))) stop 23 |
| if (any(abs(3.0_c_double * CC - DD) > 10.0_c_double * epsilon(CC))) stop 24 |
| |
| |
| |
| ! fixed-size decriptorless array to use_device_ptr |
| !$omp target data map(to:EE) map(from:FF) |
| !$omp target data map(alloc:dummy) use_device_ptr(EE,FF) |
| tgt_eptr = c_loc(EE) |
| tgt_fptr = c_loc(FF) |
| !$omp end target data |
| |
| call copy3_array(tgt_eptr, tgt_fptr, N) |
| !$omp target update from(FF) |
| if (any(abs(EE - 555.0_c_double) > 10.0_c_double * epsilon(EE))) stop 25 |
| if (any(abs(3.0_c_double * EE - FF) > 10.0_c_double * epsilon(EE))) stop 26 |
| |
| EE = 5555.0_c_double |
| !$omp target update to(EE) |
| call copy3_array(tgt_eptr, tgt_fptr, N) |
| !$omp target update from(FF) |
| !$omp end target data |
| |
| if (any(abs(EE - 5555.0_c_double) > 10.0_c_double * epsilon(EE))) stop 27 |
| if (any(abs(3.0_c_double * EE - FF) > 10.0_c_double * epsilon(EE))) stop 28 |
| end subroutine use_device_ptr_sub |
| |
| |
| |
| ! Same as main program but uses dummy *optional* arguments |
| subroutine use_device_ptr_sub2(AA, BB, CC, DD, EE, FF, AptrA, BptrB, N) |
| real(c_double), optional, pointer :: AA(:), BB(:) |
| real(c_double), optional, allocatable, target :: CC(:), DD(:) |
| real(c_double), optional, target :: EE(N), FF(N) |
| real(c_double), pointer :: AptrA(:), BptrB(:) |
| intent(inout) :: AA, BB, CC, DD, EE, FF |
| real(c_double), target :: dummy(1) |
| integer, value :: N |
| |
| type(c_ptr) :: tgt_aptr, tgt_bptr, tgt_cptr, tgt_dptr, tgt_eptr, tgt_fptr |
| |
| AA = 11.0_c_double |
| BB = 22.0_c_double |
| CC = 33.0_c_double |
| DD = 44.0_c_double |
| EE = 55.0_c_double |
| FF = 66.0_c_double |
| |
| ! pointer-type array to use_device_ptr |
| !$omp target data map(to:AA) map(from:BB) use_device_ptr(AA,BB) |
| call copy3_array(c_loc(AA), c_loc(BB), N) |
| !$omp end target data |
| |
| if (any(abs(AA - 11.0_c_double) > 10.0_c_double * epsilon(AA))) stop 29 |
| if (any(abs(3.0_c_double * AA - BB) > 10.0_c_double * epsilon(AA))) stop 30 |
| |
| ! allocatable array to use_device_ptr |
| !$omp target data map(to:CC) map(from:DD) use_device_ptr(CC,DD) |
| call copy3_array(c_loc(CC), c_loc(DD), N) |
| !$omp end target data |
| |
| if (any(abs(CC - 33.0_c_double) > 10.0_c_double * epsilon(CC))) stop 31 |
| if (any(abs(3.0_c_double * CC - DD) > 10.0_c_double * epsilon(CC))) stop 32 |
| |
| ! fixed-size decriptorless array to use_device_ptr |
| !$omp target data map(to:EE) map(from:FF) use_device_ptr(EE,FF) |
| call copy3_array(c_loc(EE), c_loc(FF), N) |
| !$omp end target data |
| |
| if (any(abs(EE - 55.0_c_double) > 10.0_c_double * epsilon(EE))) stop 33 |
| if (any(abs(3.0_c_double * EE - FF) > 10.0_c_double * epsilon(EE))) stop 34 |
| |
| |
| |
| AA = 111.0_c_double |
| BB = 222.0_c_double |
| CC = 333.0_c_double |
| DD = 444.0_c_double |
| EE = 555.0_c_double |
| FF = 666.0_c_double |
| |
| ! pointer-type array to use_device_ptr |
| !$omp target data map(to:AA) map(from:BB) |
| !$omp target data map(alloc:dummy) use_device_ptr(AA,BB) |
| tgt_aptr = c_loc(AA) |
| tgt_bptr = c_loc(BB) |
| AptrA => AA |
| BptrB => BB |
| !$omp end target data |
| |
| call copy3_array(tgt_aptr, tgt_bptr, N) |
| !$omp target update from(BB) |
| if (any(abs(AA - 111.0_c_double) > 10.0_c_double * epsilon(AA))) stop 35 |
| if (any(abs(3.0_c_double * AA - BB) > 10.0_c_double * epsilon(AA))) stop 36 |
| |
| AA = 1111.0_c_double |
| !$omp target update to(AA) |
| call copy3_array(tgt_aptr, tgt_bptr, N) |
| !$omp target update from(BB) |
| if (any(abs(AA - 1111.0_c_double) > 10.0_c_double * epsilon(AA))) stop 37 |
| if (any(abs(3.0_c_double * AA - BB) > 10.0_c_double * epsilon(AA))) stop 38 |
| |
| ! AprtA tests |
| AA = 7.0_c_double |
| !$omp target update to(AA) |
| call copy3_array(c_loc(AptrA), c_loc(BptrB), N) |
| !$omp target update from(BB) |
| if (any(abs(AA - 7.0_c_double) > 10.0_c_double * epsilon(AA))) stop 39 |
| if (any(abs(3.0_c_double * AA - BB) > 10.0_c_double * epsilon(AA))) stop 40 |
| |
| AA = 77.0_c_double |
| !$omp target update to(AA) |
| call copy3_array1(AptrA, BptrB) |
| !$omp target update from(BB) |
| if (any(abs(AA - 77.0_c_double) > 10.0_c_double * epsilon(AA))) stop 41 |
| if (any(abs(3.0_c_double * AA - BB) > 10.0_c_double * epsilon(AA))) stop 42 |
| |
| ! AA = 777.0_c_double |
| ! !$omp target update to(AA) |
| ! call copy3_array2(AptrA, BptrB) |
| ! !$omp target update from(BB) |
| ! if (any(abs(AA - 777.0_c_double) > 10.0_c_double * epsilon(AA))) stop 43 |
| ! if (any(abs(3.0_c_double * AA - BB) > 10.0_c_double * epsilon(AA))) stop 44 |
| |
| AA = 7777.0_c_double |
| !$omp target update to(AA) |
| call copy3_array3(AptrA, BptrB) |
| !$omp target update from(BB) |
| if (any(abs(AA - 7777.0_c_double) > 10.0_c_double * epsilon(AA))) stop 45 |
| if (any(abs(3.0_c_double * AA - BB) > 10.0_c_double * epsilon(AA))) stop 46 |
| |
| ! AA = 77777.0_c_double |
| ! !$omp target update to(AA) |
| ! call copy3_array4(AptrA, BptrB) |
| ! !$omp target update from(BB) |
| !$omp end target data |
| ! |
| ! if (any(abs(AA - 77777.0_c_double) > 10.0_c_double * epsilon(AA))) stop 47 |
| ! if (any(abs(3.0_c_double * AA - BB) > 10.0_c_double * epsilon(AA))) stop 48 |
| |
| |
| |
| ! allocatable array to use_device_ptr |
| !$omp target data map(to:CC) map(from:DD) |
| !$omp target data map(alloc:dummy) use_device_ptr(CC,DD) |
| tgt_cptr = c_loc(CC) |
| tgt_dptr = c_loc(DD) |
| !$omp end target data |
| |
| call copy3_array(tgt_cptr, tgt_dptr, N) |
| !$omp target update from(DD) |
| if (any(abs(CC - 333.0_c_double) > 10.0_c_double * epsilon(CC))) stop 49 |
| if (any(abs(3.0_c_double * CC - DD) > 10.0_c_double * epsilon(CC))) stop 50 |
| |
| CC = 3333.0_c_double |
| !$omp target update to(CC) |
| call copy3_array(tgt_cptr, tgt_dptr, N) |
| !$omp target update from(DD) |
| !$omp end target data |
| |
| if (any(abs(CC - 3333.0_c_double) > 10.0_c_double * epsilon(CC))) stop 51 |
| if (any(abs(3.0_c_double * CC - DD) > 10.0_c_double * epsilon(CC))) stop 52 |
| |
| |
| |
| ! fixed-size decriptorless array to use_device_ptr |
| !$omp target data map(to:EE) map(from:FF) |
| !$omp target data map(alloc:dummy) use_device_ptr(EE,FF) |
| tgt_eptr = c_loc(EE) |
| tgt_fptr = c_loc(FF) |
| !$omp end target data |
| |
| call copy3_array(tgt_eptr, tgt_fptr, N) |
| !$omp target update from(FF) |
| if (any(abs(EE - 555.0_c_double) > 10.0_c_double * epsilon(EE))) stop 53 |
| if (any(abs(3.0_c_double * EE - FF) > 10.0_c_double * epsilon(EE))) stop 54 |
| |
| EE = 5555.0_c_double |
| !$omp target update to(EE) |
| call copy3_array(tgt_eptr, tgt_fptr, N) |
| !$omp end target data |
| |
| if (any(abs(EE - 5555.0_c_double) > 10.0_c_double * epsilon(EE))) stop 55 |
| if (any(abs(3.0_c_double * EE - FF) > 10.0_c_double * epsilon(EE))) stop 56 |
| end subroutine use_device_ptr_sub2 |
| end module offloading2 |
| |
| |
| |
| program omp_device_ptr |
| use iso_c_binding |
| use target_procs |
| use offloading2 |
| implicit none (type, external) |
| |
| integer, parameter :: N = 1000 |
| real(c_double), pointer :: AA(:), BB(:), arg_AA(:), arg_BB(:), arg2_AA(:), arg2_BB(:) |
| real(c_double), allocatable, target :: CC(:), DD(:), arg_CC(:), arg_DD(:), arg2_CC(:), arg2_DD(:) |
| real(c_double), target :: EE(N), FF(N), dummy(1), arg_EE(N), arg_FF(N), arg2_EE(N), arg2_FF(N) |
| |
| real(c_double), pointer :: AptrA(:), BptrB(:) |
| type(c_ptr) :: tgt_aptr, tgt_bptr, tgt_cptr, tgt_dptr, tgt_eptr, tgt_fptr |
| |
| allocate(AA(N), BB(N), CC(N), DD(N)) |
| |
| AA = 11.0_c_double |
| BB = 22.0_c_double |
| CC = 33.0_c_double |
| DD = 44.0_c_double |
| EE = 55.0_c_double |
| FF = 66.0_c_double |
| |
| ! pointer-type array to use_device_ptr |
| !$omp target data map(to:AA) map(from:BB) use_device_ptr(AA,BB) |
| call copy3_array(c_loc(AA), c_loc(BB), N) |
| !$omp end target data |
| |
| if (any(abs(AA - 11.0_c_double) > 10.0_c_double * epsilon(AA))) stop 57 |
| if (any(abs(3.0_c_double * AA - BB) > 10.0_c_double * epsilon(AA))) stop 58 |
| |
| ! allocatable array to use_device_ptr |
| !$omp target data map(to:CC) map(from:DD) use_device_ptr(CC,DD) |
| call copy3_array(c_loc(CC), c_loc(DD), N) |
| !$omp end target data |
| |
| if (any(abs(CC - 33.0_c_double) > 10.0_c_double * epsilon(CC))) stop 59 |
| if (any(abs(3.0_c_double * CC - DD) > 10.0_c_double * epsilon(CC))) stop 60 |
| |
| ! fixed-size decriptorless array to use_device_ptr |
| !$omp target data map(to:EE) map(from:FF) use_device_ptr(EE,FF) |
| call copy3_array(c_loc(EE), c_loc(FF), N) |
| !$omp end target data |
| |
| if (any(abs(EE - 55.0_c_double) > 10.0_c_double * epsilon(EE))) stop 61 |
| if (any(abs(3.0_c_double * EE - FF) > 10.0_c_double * epsilon(EE))) stop 62 |
| |
| |
| |
| AA = 111.0_c_double |
| BB = 222.0_c_double |
| CC = 333.0_c_double |
| DD = 444.0_c_double |
| EE = 555.0_c_double |
| FF = 666.0_c_double |
| |
| ! pointer-type array to use_device_ptr |
| !$omp target data map(to:AA) map(from:BB) |
| !$omp target data map(alloc:dummy) use_device_ptr(AA,BB) |
| tgt_aptr = c_loc(AA) |
| tgt_bptr = c_loc(BB) |
| AptrA => AA |
| BptrB => BB |
| !$omp end target data |
| |
| call copy3_array(tgt_aptr, tgt_bptr, N) |
| !$omp target update from(BB) |
| if (any(abs(AA - 111.0_c_double) > 10.0_c_double * epsilon(AA))) stop 63 |
| if (any(abs(3.0_c_double * AA - BB) > 10.0_c_double * epsilon(AA))) stop 64 |
| |
| AA = 1111.0_c_double |
| !$omp target update to(AA) |
| call copy3_array(tgt_aptr, tgt_bptr, N) |
| !$omp target update from(BB) |
| if (any(abs(AA - 1111.0_c_double) > 10.0_c_double * epsilon(AA))) stop 65 |
| if (any(abs(3.0_c_double * AA - BB) > 10.0_c_double * epsilon(AA))) stop 66 |
| |
| ! AprtA tests |
| AA = 7.0_c_double |
| !$omp target update to(AA) |
| call copy3_array(c_loc(AptrA), c_loc(BptrB), N) |
| !$omp target update from(BB) |
| if (any(abs(AA - 7.0_c_double) > 10.0_c_double * epsilon(AA))) stop 67 |
| if (any(abs(3.0_c_double * AA - BB) > 10.0_c_double * epsilon(AA))) stop 68 |
| |
| AA = 77.0_c_double |
| !$omp target update to(AA) |
| call copy3_array1(AptrA, BptrB) |
| !$omp target update from(BB) |
| if (any(abs(AA - 77.0_c_double) > 10.0_c_double * epsilon(AA))) stop 69 |
| if (any(abs(3.0_c_double * AA - BB) > 10.0_c_double * epsilon(AA))) stop 70 |
| |
| ! AA = 777.0_c_double |
| ! !$omp target update to(AA) |
| ! call copy3_array2(AptrA, BptrB) |
| ! !$omp target update from(BB) |
| ! if (any(abs(AA - 777.0_c_double) > 10.0_c_double * epsilon(AA))) stop 71 |
| ! if (any(abs(3.0_c_double * AA - BB) > 10.0_c_double * epsilon(AA))) stop 72 |
| |
| AA = 7777.0_c_double |
| !$omp target update to(AA) |
| call copy3_array3(AptrA, BptrB) |
| !$omp target update from(BB) |
| if (any(abs(AA - 7777.0_c_double) > 10.0_c_double * epsilon(AA))) stop 73 |
| if (any(abs(3.0_c_double * AA - BB) > 10.0_c_double * epsilon(AA))) stop 74 |
| |
| ! AA = 77777.0_c_double |
| ! !$omp target update to(AA) |
| ! call copy3_array4(AptrA, BptrB) |
| ! !$omp target update from(BB) |
| !$omp end target data |
| ! |
| ! if (any(abs(AA - 77777.0_c_double) > 10.0_c_double * epsilon(AA))) stop 75 |
| ! if (any(abs(3.0_c_double * AA - BB) > 10.0_c_double * epsilon(AA))) stop 76 |
| |
| |
| |
| ! allocatable array to use_device_ptr |
| !$omp target data map(to:CC) map(from:DD) |
| !$omp target data map(alloc:dummy) use_device_ptr(CC,DD) |
| tgt_cptr = c_loc(CC) |
| tgt_dptr = c_loc(DD) |
| !$omp end target data |
| |
| call copy3_array(tgt_cptr, tgt_dptr, N) |
| !$omp target update from(DD) |
| if (any(abs(CC - 333.0_c_double) > 10.0_c_double * epsilon(CC))) stop 77 |
| if (any(abs(3.0_c_double * CC - DD) > 10.0_c_double * epsilon(CC))) stop 78 |
| |
| CC = 3333.0_c_double |
| !$omp target update to(CC) |
| call copy3_array(tgt_cptr, tgt_dptr, N) |
| !$omp target update from(DD) |
| !$omp end target data |
| |
| if (any(abs(CC - 3333.0_c_double) > 10.0_c_double * epsilon(CC))) stop 79 |
| if (any(abs(3.0_c_double * CC - DD) > 10.0_c_double * epsilon(CC))) stop 80 |
| |
| |
| |
| ! fixed-size decriptorless array to use_device_ptr |
| !$omp target data map(to:EE) map(from:FF) |
| !$omp target data map(alloc:dummy) use_device_ptr(EE,FF) |
| tgt_eptr = c_loc(EE) |
| tgt_fptr = c_loc(FF) |
| !$omp end target data |
| |
| call copy3_array(tgt_eptr, tgt_fptr, N) |
| !$omp target update from(FF) |
| if (any(abs(EE - 555.0_c_double) > 10.0_c_double * epsilon(EE))) stop 81 |
| if (any(abs(3.0_c_double * EE - FF) > 10.0_c_double * epsilon(EE))) stop 82 |
| |
| EE = 5555.0_c_double |
| !$omp target update to(EE) |
| call copy3_array(tgt_eptr, tgt_fptr, N) |
| !$omp target update from(FF) |
| !$omp end target data |
| |
| if (any(abs(EE - 5555.0_c_double) > 10.0_c_double * epsilon(EE))) stop 83 |
| if (any(abs(3.0_c_double * EE - FF) > 10.0_c_double * epsilon(EE))) stop 84 |
| |
| |
| |
| deallocate(AA, BB) ! Free pointers only |
| |
| AptrA => null() |
| BptrB => null() |
| allocate(arg_AA(N), arg_BB(N), arg_CC(N), arg_DD(N)) |
| call use_device_ptr_sub(arg_AA, arg_BB, arg_CC, arg_DD, arg_EE, arg_FF, AptrA, BptrB, N) |
| deallocate(arg_AA, arg_BB) |
| |
| AptrA => null() |
| BptrB => null() |
| allocate(arg2_AA(N), arg2_BB(N), arg2_CC(N), arg2_DD(N)) |
| call use_device_ptr_sub2(arg2_AA, arg2_BB, arg2_CC, arg2_DD, arg2_EE, arg2_FF, AptrA, BptrB, N) |
| deallocate(arg2_AA, arg2_BB) |
| end program omp_device_ptr |