| ! { dg-do run } |
| |
| ! Comprehensive run-time test for use_device_addr |
| ! |
| ! Tests array with array descriptor |
| ! |
| ! Differs from use_device_addr-3.f90 by using a 4-byte variable (c_float) |
| ! |
| ! This test case assumes that a 'var' appearing in 'use_device_addr' is |
| ! only used as 'c_loc(var)' - such that only the actual data is used/usable |
| ! on the device - and not meta data ((dynamic) type information, 'present()' |
| ! status, array shape). |
| ! |
| ! Untested in this test case are: |
| ! - scalars |
| ! - polymorphic variables |
| ! - absent optional arguments |
| ! |
| module target_procs |
| use iso_c_binding |
| implicit none (type, external) |
| private |
| public :: copy3_array |
| contains |
| subroutine copy3_array_int(from_ptr, to_ptr, N) |
| !$omp declare target |
| real(c_float) :: from_ptr(:) |
| real(c_float) :: 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_array(from, to, N) |
| type(c_ptr), value :: from, to |
| integer, value :: N |
| real(c_float), 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_float), 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 |
| end module target_procs |
| |
| |
| |
| ! Test local dummy arguments (w/o optional) |
| module test_dummies |
| use iso_c_binding |
| use target_procs |
| implicit none (type, external) |
| private |
| public :: test_dummy_call_1, test_dummy_call_2 |
| contains |
| subroutine test_dummy_call_1() |
| integer, parameter :: N = 1000 |
| |
| real(c_float), target :: aa(N), bb(N) |
| real(c_float), target, allocatable :: cc(:), dd(:) |
| real(c_float), pointer :: ee(:), ff(:) |
| |
| allocate(cc(N), dd(N), ee(N), ff(N)) |
| |
| aa = 11.0_c_float |
| bb = 22.0_c_float |
| cc = 33.0_c_float |
| dd = 44.0_c_float |
| ee = 55.0_c_float |
| ff = 66.0_c_float |
| |
| call test_dummy_callee_1(aa, bb, cc, dd, ee, ff, N) |
| deallocate(ee, ff) ! pointers, only |
| end subroutine test_dummy_call_1 |
| |
| subroutine test_dummy_callee_1(aa, bb, cc, dd, ee, ff, N) |
| real(c_float), target :: aa(:), bb(:) |
| real(c_float), target, allocatable :: cc(:), dd(:) |
| real(c_float), pointer :: ee(:), ff(:) |
| |
| integer, value :: N |
| |
| !$omp target data map(to:aa) map(from:bb) use_device_addr(aa,bb) |
| call copy3_array(c_loc(aa), c_loc(bb), N) |
| !$omp end target data |
| if (any(abs(aa - 11.0_c_float) > 10.0_c_float * epsilon(aa))) stop 2 |
| if (any(abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa))) stop 3 |
| |
| !$omp target data map(to:cc) map(from:dd) use_device_addr(cc,dd) |
| call copy3_array(c_loc(cc), c_loc(dd), N) |
| !$omp end target data |
| if (any(abs(cc - 33.0_c_float) > 10.0_c_float * epsilon(cc))) stop 4 |
| if (any(abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(cc))) stop 5 |
| |
| !$omp target data map(to:ee) map(from:ff) use_device_addr(ee,ff) |
| call copy3_array(c_loc(ee), c_loc(ff), N) |
| !$omp end target data |
| if (any(abs(ee - 55.0_c_float) > 10.0_c_float * epsilon(ee))) stop 6 |
| if (any(abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ee))) stop 7 |
| end subroutine test_dummy_callee_1 |
| |
| ! Save device ptr - and recall pointer |
| subroutine test_dummy_call_2() |
| integer, parameter :: N = 1000 |
| |
| real(c_float), target :: aa(N), bb(N) |
| real(c_float), target, allocatable :: cc(:), dd(:) |
| real(c_float), pointer :: ee(:), ff(:) |
| |
| type(c_ptr) :: c_aptr, c_bptr, c_cptr, c_dptr, c_eptr, c_fptr |
| real(c_float), pointer :: aptr(:), bptr(:), cptr(:), dptr(:), eptr(:), fptr(:) |
| |
| allocate(cc(N), dd(N), ee(N), ff(N)) |
| |
| call test_dummy_callee_2(aa, bb, cc, dd, ee, ff, & |
| c_aptr, c_bptr, c_cptr, c_dptr, c_eptr, c_fptr, & |
| aptr, bptr, cptr, dptr, eptr, fptr, & |
| N) |
| deallocate(ee, ff) |
| end subroutine test_dummy_call_2 |
| |
| subroutine test_dummy_callee_2(aa, bb, cc, dd, ee, ff, & |
| c_aptr, c_bptr, c_cptr, c_dptr, c_eptr, c_fptr, & |
| aptr, bptr, cptr, dptr, eptr, fptr, & |
| N) |
| real(c_float), target :: aa(:), bb(:) |
| real(c_float), target, allocatable :: cc(:), dd(:) |
| real(c_float), pointer :: ee(:), ff(:) |
| |
| type(c_ptr) :: c_aptr, c_bptr, c_cptr, c_dptr, c_eptr, c_fptr |
| real(c_float), pointer :: aptr(:), bptr(:), cptr(:), dptr(:), eptr(:), fptr(:) |
| |
| integer, value :: N |
| |
| real(c_float) :: dummy |
| |
| aa = 111.0_c_float |
| bb = 222.0_c_float |
| cc = 333.0_c_float |
| dd = 444.0_c_float |
| ee = 555.0_c_float |
| ff = 666.0_c_float |
| |
| !$omp target data map(to:aa) map(from:bb) |
| !$omp target data map(alloc:dummy) use_device_addr(aa,bb) |
| c_aptr = c_loc(aa) |
| c_bptr = c_loc(bb) |
| aptr => aa |
| bptr => bb |
| !$omp end target data |
| |
| ! check c_loc ptr once |
| call copy3_array(c_aptr, c_bptr, N) |
| !$omp target update from(bb) |
| if (any(abs(aa - 111.0_c_float) > 10.0_c_float * epsilon(aa))) stop 8 |
| if (any(abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa))) stop 9 |
| |
| ! check c_loc ptr again after target-value modification |
| aa = 1111.0_c_float |
| !$omp target update to(aa) |
| call copy3_array(c_aptr, c_bptr, N) |
| !$omp target update from(bb) |
| if (any(abs(aa - 1111.0_c_float) > 10.0_c_float * epsilon(aa))) stop 10 |
| if (any(abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa))) stop 11 |
| |
| ! check Fortran pointer after target-value modification |
| aa = 11111.0_c_float |
| !$omp target update to(aa) |
| call copy3_array(c_loc(aptr), c_loc(bptr), N) |
| !$omp target update from(bb) |
| if (any(abs(aa - 11111.0_c_float) > 10.0_c_float * epsilon(aa))) stop 12 |
| if (any(abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa))) stop 13 |
| !$omp end target data |
| |
| if (any(abs(aa - 11111.0_c_float) > 10.0_c_float * epsilon(aa))) stop 14 |
| if (any(abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa))) stop 15 |
| |
| |
| !$omp target data map(to:cc) map(from:dd) |
| !$omp target data map(alloc:dummy) use_device_addr(cc,dd) |
| c_cptr = c_loc(cc) |
| c_dptr = c_loc(dd) |
| cptr => cc |
| dptr => dd |
| !$omp end target data |
| |
| ! check c_loc ptr once |
| call copy3_array(c_cptr, c_dptr, N) |
| !$omp target update from(dd) |
| if (any(abs(cc - 333.0_c_float) > 10.0_c_float * epsilon(cc))) stop 16 |
| if (any(abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(cc))) stop 17 |
| |
| ! check c_loc ptr again after target-value modification |
| cc = 3333.0_c_float |
| !$omp target update to(cc) |
| call copy3_array(c_cptr, c_dptr, N) |
| !$omp target update from(dd) |
| if (any(abs(cc - 3333.0_c_float) > 10.0_c_float * epsilon(cc))) stop 18 |
| if (any(abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(cc))) stop 19 |
| |
| ! check Fortran pointer after target-value modification |
| cc = 33333.0_c_float |
| !$omp target update to(cc) |
| call copy3_array(c_loc(cptr), c_loc(dptr), N) |
| !$omp target update from(dd) |
| if (any(abs(cc - 33333.0_c_float) > 10.0_c_float * epsilon(cc))) stop 20 |
| if (any(abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(cc))) stop 21 |
| !$omp end target data |
| |
| if (any(abs(cc - 33333.0_c_float) > 10.0_c_float * epsilon(dd))) stop 22 |
| if (any(abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(dd))) stop 23 |
| |
| |
| !$omp target data map(to:ee) map(from:ff) |
| !$omp target data map(alloc:dummy) use_device_addr(ee,ff) |
| c_eptr = c_loc(ee) |
| c_fptr = c_loc(ff) |
| eptr => ee |
| fptr => ff |
| !$omp end target data |
| |
| ! check c_loc ptr once |
| call copy3_array(c_eptr, c_fptr, N) |
| !$omp target update from(ff) |
| if (any(abs(ee - 555.0_c_float) > 10.0_c_float * epsilon(ee))) stop 24 |
| if (any(abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ee))) stop 25 |
| |
| ! check c_loc ptr again after target-value modification |
| ee = 5555.0_c_float |
| !$omp target update to(ee) |
| call copy3_array(c_eptr, c_fptr, N) |
| !$omp target update from(ff) |
| if (any(abs(ee - 5555.0_c_float) > 10.0_c_float * epsilon(ee))) stop 26 |
| if (any(abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ee))) stop 27 |
| |
| ! check Fortran pointer after target-value modification |
| ee = 55555.0_c_float |
| !$omp target update to(ee) |
| call copy3_array(c_loc(eptr), c_loc(fptr), N) |
| !$omp target update from(ff) |
| if (any(abs(ee - 55555.0_c_float) > 10.0_c_float * epsilon(ee))) stop 28 |
| if (any(abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ff))) stop 29 |
| !$omp end target data |
| |
| if (any(abs(ee - 55555.0_c_float) > 10.0_c_float * epsilon(ee))) stop 30 |
| if (any(abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ee))) stop 31 |
| end subroutine test_dummy_callee_2 |
| end module test_dummies |
| |
| |
| |
| ! Test local dummy arguments + OPTIONAL |
| ! Values present and ptr associated to nonzero |
| module test_dummies_opt |
| use iso_c_binding |
| use target_procs |
| implicit none (type, external) |
| private |
| public :: test_dummy_opt_call_1, test_dummy_opt_call_2 |
| contains |
| subroutine test_dummy_opt_call_1() |
| integer, parameter :: N = 1000 |
| |
| real(c_float), target :: aa(N), bb(N) |
| real(c_float), target, allocatable :: cc(:), dd(:) |
| real(c_float), pointer :: ee(:), ff(:) |
| |
| allocate(cc(N), dd(N), ee(N), ff(N)) |
| |
| aa = 11.0_c_float |
| bb = 22.0_c_float |
| cc = 33.0_c_float |
| dd = 44.0_c_float |
| ee = 55.0_c_float |
| ff = 66.0_c_float |
| |
| call test_dummy_opt_callee_1(aa, bb, cc, dd, ee, ff, N) |
| call test_dummy_opt_callee_1_absent(N=N) |
| deallocate(ee, ff) ! pointers, only |
| end subroutine test_dummy_opt_call_1 |
| |
| subroutine test_dummy_opt_callee_1(aa, bb, cc, dd, ee, ff, N) |
| ! scalars |
| real(c_float), optional, target :: aa(:), bb(:) |
| real(c_float), optional, target, allocatable :: cc(:), dd(:) |
| real(c_float), optional, pointer :: ee(:), ff(:) |
| |
| integer, value :: N |
| |
| ! All shall be present - and pointing to non-NULL |
| if (.not.present(aa) .or. .not.present(bb)) stop 32 |
| if (.not.present(cc) .or. .not.present(dd)) stop 33 |
| if (.not.present(ee) .or. .not.present(ff)) stop 34 |
| |
| if (.not.allocated(cc) .or. .not.allocated(dd)) stop 35 |
| if (.not.associated(ee) .or. .not.associated(ff)) stop 36 |
| |
| !$omp target data map(to:aa) map(from:bb) use_device_addr(aa,bb) |
| if (.not.present(aa) .or. .not.present(bb)) stop 37 |
| if (.not.c_associated(c_loc(aa)) .or. .not.c_associated(c_loc(bb))) stop 38 |
| call copy3_array(c_loc(aa), c_loc(bb), N) |
| !$omp end target data |
| if (any(abs(aa - 11.0_c_float) > 10.0_c_float * epsilon(aa))) stop 39 |
| if (any(abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa))) stop 40 |
| |
| !$omp target data map(to:cc) map(from:dd) use_device_addr(cc,dd) |
| if (.not.present(cc) .or. .not.present(dd)) stop 41 |
| if (.not.allocated(cc) .or. .not.allocated(dd)) stop 42 |
| if (.not.c_associated(c_loc(cc)) .or. .not.c_associated(c_loc(dd))) stop 43 |
| call copy3_array(c_loc(cc), c_loc(dd), N) |
| !$omp end target data |
| if (any(abs(cc - 33.0_c_float) > 10.0_c_float * epsilon(cc))) stop 44 |
| if (any(abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(cc))) stop 45 |
| |
| !$omp target data map(to:ee) map(from:ff) use_device_addr(ee,ff) |
| if (.not.present(ee) .or. .not.present(ff)) stop 46 |
| if (.not.associated(ee) .or. .not.associated(ff)) stop 47 |
| if (.not.c_associated(c_loc(ee)) .or. .not.c_associated(c_loc(ff))) stop 48 |
| call copy3_array(c_loc(ee), c_loc(ff), N) |
| !$omp end target data |
| if (any(abs(ee - 55.0_c_float) > 10.0_c_float * epsilon(ee))) stop 49 |
| if (any(abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ee))) stop 50 |
| end subroutine test_dummy_opt_callee_1 |
| |
| subroutine test_dummy_opt_callee_1_absent(aa, bb, cc, dd, ee, ff, N) |
| ! scalars |
| real(c_float), optional, target :: aa(:), bb(:) |
| real(c_float), optional, target, allocatable :: cc(:), dd(:) |
| real(c_float), optional, pointer :: ee(:), ff(:) |
| |
| integer, value :: N |
| |
| ! All shall be absent |
| if (present(aa) .or. present(bb)) stop 51 |
| if (present(cc) .or. present(dd)) stop 52 |
| if (present(ee) .or. present(ff)) stop 53 |
| |
| !$omp target data map(to:aa) map(from:bb) use_device_addr(aa,bb) |
| if (present(aa) .or. present(bb)) stop 54 |
| !$omp end target data |
| |
| !$omp target data map(to:cc) map(from:dd) use_device_addr(cc,dd) |
| if (present(cc) .or. present(dd)) stop 55 |
| !$omp end target data |
| |
| !$omp target data map(to:ee) map(from:ff) use_device_addr(ee,ff) |
| if (present(ee) .or. present(ff)) stop 56 |
| !$omp end target data |
| end subroutine test_dummy_opt_callee_1_absent |
| |
| ! Save device ptr - and recall pointer |
| subroutine test_dummy_opt_call_2() |
| integer, parameter :: N = 1000 |
| |
| real(c_float), target :: aa(N), bb(N) |
| real(c_float), target, allocatable :: cc(:), dd(:) |
| real(c_float), pointer :: ee(:), ff(:) |
| |
| type(c_ptr) :: c_aptr, c_bptr, c_cptr, c_dptr, c_eptr, c_fptr |
| real(c_float), pointer :: aptr(:), bptr(:), cptr(:), dptr(:), eptr(:), fptr(:) |
| |
| allocate(cc(N), dd(N), ee(N), ff(N)) |
| call test_dummy_opt_callee_2(aa, bb, cc, dd, ee, ff, & |
| c_aptr, c_bptr, c_cptr, c_dptr, c_eptr, c_fptr, & |
| aptr, bptr, cptr, dptr, eptr, fptr, & |
| N) |
| deallocate(ee, ff) |
| end subroutine test_dummy_opt_call_2 |
| |
| subroutine test_dummy_opt_callee_2(aa, bb, cc, dd, ee, ff, & |
| c_aptr, c_bptr, c_cptr, c_dptr, c_eptr, c_fptr, & |
| aptr, bptr, cptr, dptr, eptr, fptr, & |
| N) |
| ! scalars |
| real(c_float), optional, target :: aa(:), bb(:) |
| real(c_float), optional, target, allocatable :: cc(:), dd(:) |
| real(c_float), optional, pointer :: ee(:), ff(:) |
| |
| type(c_ptr) :: c_aptr, c_bptr, c_cptr, c_dptr, c_eptr, c_fptr |
| real(c_float), optional, pointer :: aptr(:), bptr(:), cptr(:), dptr(:), eptr(:), fptr(:) |
| |
| integer, value :: N |
| |
| real(c_float) :: dummy |
| |
| ! All shall be present - and pointing to non-NULL |
| if (.not.present(aa) .or. .not.present(bb)) stop 57 |
| if (.not.present(cc) .or. .not.present(dd)) stop 58 |
| if (.not.present(ee) .or. .not.present(ff)) stop 59 |
| |
| if (.not.allocated(cc) .or. .not.allocated(dd)) stop 60 |
| if (.not.associated(ee) .or. .not.associated(ff)) stop 61 |
| |
| aa = 111.0_c_float |
| bb = 222.0_c_float |
| cc = 333.0_c_float |
| dd = 444.0_c_float |
| ee = 555.0_c_float |
| ff = 666.0_c_float |
| |
| !$omp target data map(to:aa) map(from:bb) |
| !$omp target data map(alloc:dummy) use_device_addr(aa,bb) |
| if (.not.present(aa) .or. .not.present(bb)) stop 62 |
| if (.not.c_associated(c_loc(aa)) .or. .not.c_associated(c_loc(bb))) stop 63 |
| c_aptr = c_loc(aa) |
| c_bptr = c_loc(bb) |
| aptr => aa |
| bptr => bb |
| if (.not.c_associated(c_aptr) .or. .not.c_associated(c_bptr)) stop 64 |
| if (.not.associated(aptr) .or. .not.associated(bptr)) stop 65 |
| !$omp end target data |
| |
| if (.not.present(aa) .or. .not.present(bb)) stop 66 |
| if (.not.c_associated(c_loc(aa)) .or. .not.c_associated(c_loc(bb))) stop 67 |
| if (.not.c_associated(c_aptr) .or. .not.c_associated(c_bptr)) stop 68 |
| if (.not.associated(aptr) .or. .not.associated(bptr)) stop 69 |
| |
| ! check c_loc ptr once |
| call copy3_array(c_aptr, c_bptr, N) |
| !$omp target update from(bb) |
| if (any(abs(aa - 111.0_c_float) > 10.0_c_float * epsilon(aa))) stop 70 |
| if (any(abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa))) stop 71 |
| |
| ! check c_loc ptr again after target-value modification |
| aa = 1111.0_c_float |
| !$omp target update to(aa) |
| call copy3_array(c_aptr, c_bptr, N) |
| !$omp target update from(bb) |
| if (any(abs(aa - 1111.0_c_float) > 10.0_c_float * epsilon(aa))) stop 72 |
| if (any(abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa))) stop 73 |
| |
| ! check Fortran pointer after target-value modification |
| aa = 11111.0_c_float |
| !$omp target update to(aa) |
| call copy3_array(c_loc(aptr), c_loc(bptr), N) |
| !$omp target update from(bb) |
| if (any(abs(aa - 11111.0_c_float) > 10.0_c_float * epsilon(aa))) stop 74 |
| if (any(abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa))) stop 75 |
| !$omp end target data |
| |
| if (any(abs(aa - 11111.0_c_float) > 10.0_c_float * epsilon(aa))) stop 76 |
| if (any(abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa))) stop 77 |
| |
| !$omp target data map(to:cc) map(from:dd) |
| !$omp target data map(alloc:dummy) use_device_addr(cc,dd) |
| if (.not.present(cc) .or. .not.present(dd)) stop 78 |
| if (.not.allocated(cc) .or. .not.allocated(dd)) stop 79 |
| if (.not.c_associated(c_loc(cc)) .or. .not.c_associated(c_loc(dd))) stop 80 |
| c_cptr = c_loc(cc) |
| c_dptr = c_loc(dd) |
| cptr => cc |
| dptr => dd |
| if (.not.c_associated(c_cptr) .or. .not.c_associated(c_dptr)) stop 81 |
| if (.not.associated(cptr) .or. .not.associated(dptr)) stop 82 |
| !$omp end target data |
| if (.not.present(cc) .or. .not.present(dd)) stop 83 |
| if (.not.c_associated(c_loc(cc)) .or. .not.c_associated(c_loc(dd))) stop 84 |
| if (.not.c_associated(c_cptr) .or. .not.c_associated(c_dptr)) stop 85 |
| if (.not.associated(cptr) .or. .not.associated(dptr)) stop 86 |
| |
| ! check c_loc ptr once |
| call copy3_array(c_cptr, c_dptr, N) |
| !$omp target update from(dd) |
| if (any(abs(cc - 333.0_c_float) > 10.0_c_float * epsilon(cc))) stop 87 |
| if (any(abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(cc))) stop 88 |
| |
| ! check c_loc ptr again after target-value modification |
| cc = 3333.0_c_float |
| !$omp target update to(cc) |
| call copy3_array(c_cptr, c_dptr, N) |
| !$omp target update from(dd) |
| if (any(abs(cc - 3333.0_c_float) > 10.0_c_float * epsilon(cc))) stop 89 |
| if (any(abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(cc))) stop 90 |
| |
| ! check Fortran pointer after target-value modification |
| cc = 33333.0_c_float |
| !$omp target update to(cc) |
| call copy3_array(c_loc(cptr), c_loc(dptr), N) |
| !$omp target update from(dd) |
| if (any(abs(cc - 33333.0_c_float) > 10.0_c_float * epsilon(cc))) stop 91 |
| if (any(abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(cc))) stop 92 |
| !$omp end target data |
| |
| if (any(abs(cc - 33333.0_c_float) > 10.0_c_float * epsilon(dd))) stop 93 |
| if (any(abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(dd))) stop 94 |
| |
| |
| !$omp target data map(to:ee) map(from:ff) |
| !$omp target data map(alloc:dummy) use_device_addr(ee,ff) |
| if (.not.present(ee) .or. .not.present(ff)) stop 95 |
| if (.not.associated(ee) .or. .not.associated(ff)) stop 96 |
| if (.not.c_associated(c_loc(ee)) .or. .not.c_associated(c_loc(ff))) stop 97 |
| c_eptr = c_loc(ee) |
| c_fptr = c_loc(ff) |
| eptr => ee |
| fptr => ff |
| if (.not.c_associated(c_eptr) .or. .not.c_associated(c_fptr)) stop 98 |
| if (.not.associated(eptr) .or. .not.associated(fptr)) stop 99 |
| !$omp end target data |
| if (.not.present(ee) .or. .not.present(ff)) stop 100 |
| if (.not.associated(ee) .or. .not.associated(ff)) stop 101 |
| if (.not.c_associated(c_loc(ee)) .or. .not.c_associated(c_loc(ff))) stop 102 |
| if (.not.c_associated(c_eptr) .or. .not.c_associated(c_fptr)) stop 103 |
| if (.not.associated(eptr) .or. .not.associated(fptr)) stop 104 |
| |
| ! check c_loc ptr once |
| call copy3_array(c_eptr, c_fptr, N) |
| !$omp target update from(ff) |
| if (any(abs(ee - 555.0_c_float) > 10.0_c_float * epsilon(ee))) stop 105 |
| if (any(abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ee))) stop 106 |
| |
| ! check c_loc ptr again after target-value modification |
| ee = 5555.0_c_float |
| !$omp target update to(ee) |
| call copy3_array(c_eptr, c_fptr, N) |
| !$omp target update from(ff) |
| if (any(abs(ee - 5555.0_c_float) > 10.0_c_float * epsilon(ee))) stop 107 |
| if (any(abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ee))) stop 108 |
| |
| ! check Fortran pointer after target-value modification |
| ee = 55555.0_c_float |
| !$omp target update to(ee) |
| call copy3_array(c_loc(eptr), c_loc(fptr), N) |
| !$omp target update from(ff) |
| if (any(abs(ee - 55555.0_c_float) > 10.0_c_float * epsilon(ee))) stop 109 |
| if (any(abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ff))) stop 110 |
| !$omp end target data |
| |
| if (any(abs(ee - 55555.0_c_float) > 10.0_c_float * epsilon(ee))) stop 111 |
| if (any(abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ee))) stop 112 |
| end subroutine test_dummy_opt_callee_2 |
| end module test_dummies_opt |
| |
| |
| |
| ! Test nullptr |
| module test_nullptr |
| use iso_c_binding |
| implicit none (type, external) |
| private |
| public :: test_nullptr_1 |
| contains |
| subroutine test_nullptr_1() |
| real(c_float), pointer :: aa(:), bb(:) |
| real(c_float), pointer :: ee(:), ff(:) |
| |
| real(c_float), allocatable, target :: gg(:), hh(:) |
| |
| type(c_ptr) :: c_aptr, c_bptr, c_eptr, c_fptr, c_gptr, c_hptr |
| real(c_float), pointer :: aptr(:), bptr(:), eptr(:), fptr(:), gptr(:), hptr(:) |
| |
| aa => null() |
| bb => null() |
| ee => null() |
| ff => null() |
| |
| if (associated(aa) .or. associated(bb)) stop 113 |
| !$omp target data map(to:aa) map(from:bb) use_device_addr(aa,bb) |
| if (c_associated(c_loc(aa)) .or. c_associated(c_loc(bb))) stop 114 |
| c_aptr = c_loc(aa) |
| c_bptr = c_loc(bb) |
| aptr => aa |
| bptr => bb |
| if (c_associated(c_aptr) .or. c_associated(c_bptr)) stop 115 |
| if (associated(aptr) .or. associated(bptr, bb)) stop 116 |
| if (associated(aa) .or. associated(bb)) stop 117 |
| !$omp end target data |
| if (c_associated(c_aptr) .or. c_associated(c_bptr)) stop 118 |
| if (associated(aptr) .or. associated(bptr, bb)) stop 119 |
| if (associated(aa) .or. associated(bb)) stop 120 |
| |
| if (allocated(gg)) stop 121 |
| !$omp target data map(tofrom:gg) use_device_addr(gg) |
| if (c_associated(c_loc(gg))) stop 122 |
| c_gptr = c_loc(gg) |
| gptr => gg |
| if (c_associated(c_gptr)) stop 123 |
| if (associated(gptr)) stop 124 |
| if (allocated(gg)) stop 125 |
| !$omp end target data |
| if (c_associated(c_gptr)) stop 126 |
| if (associated(gptr)) stop 127 |
| if (allocated(gg)) stop 128 |
| |
| call test_dummy_opt_nullptr_callee_1(ee, ff, hh, c_eptr, c_fptr, c_hptr, eptr, fptr, hptr) |
| end subroutine test_nullptr_1 |
| |
| subroutine test_dummy_opt_nullptr_callee_1(ee, ff, hh, c_eptr, c_fptr, c_hptr, eptr, fptr, hptr) |
| ! scalars |
| real(c_float), optional, pointer :: ee(:), ff(:) |
| real(c_float), optional, allocatable, target :: hh(:) |
| |
| type(c_ptr), optional :: c_eptr, c_fptr, c_hptr |
| real(c_float), optional, pointer :: eptr(:), fptr(:), hptr(:) |
| |
| if (.not.present(ee) .or. .not.present(ff)) stop 129 |
| if (associated(ee) .or. associated(ff)) stop 130 |
| |
| !$omp target data map(to:ee) map(from:ff) use_device_addr(ee,ff) |
| if (.not.present(ee) .or. .not.present(ff)) stop 131 |
| if (associated(ee) .or. associated(ff)) stop 132 |
| if (c_associated(c_loc(ee)) .or. c_associated(c_loc(ff))) stop 133 |
| c_eptr = c_loc(ee) |
| c_fptr = c_loc(ff) |
| eptr => ee |
| fptr => ff |
| if (c_associated(c_eptr) .or. c_associated(c_fptr)) stop 134 |
| if (associated(eptr) .or. associated(fptr)) stop 135 |
| !$omp end target data |
| |
| if (c_associated(c_eptr) .or. c_associated(c_fptr)) stop 136 |
| if (associated(eptr) .or. associated(fptr)) stop 137 |
| |
| if (allocated(hh)) stop 138 |
| !$omp target data map(tofrom:hh) use_device_addr(hh) |
| if (c_associated(c_loc(hh))) stop 139 |
| c_hptr = c_loc(hh) |
| hptr => hh |
| if (c_associated(c_hptr)) stop 140 |
| if (associated(hptr)) stop 141 |
| if (allocated(hh)) stop 142 |
| !$omp end target data |
| if (c_associated(c_hptr)) stop 143 |
| if (associated(hptr)) stop 144 |
| if (allocated(hh)) stop 145 |
| end subroutine test_dummy_opt_nullptr_callee_1 |
| end module test_nullptr |
| |
| |
| |
| ! Test local variables |
| module tests |
| use iso_c_binding |
| use target_procs |
| implicit none (type, external) |
| private |
| public :: test_main_1, test_main_2 |
| contains |
| ! map + use_device_addr + c_loc |
| subroutine test_main_1() |
| integer, parameter :: N = 1000 |
| |
| real(c_float), target, allocatable :: cc(:), dd(:) |
| real(c_float), pointer :: ee(:), ff(:) |
| |
| allocate(cc(N), dd(N), ee(N), ff(N)) |
| |
| cc = 33.0_c_float |
| dd = 44.0_c_float |
| ee = 55.0_c_float |
| ff = 66.0_c_float |
| |
| !$omp target data map(to:cc) map(from:dd) use_device_addr(cc,dd) |
| call copy3_array(c_loc(cc), c_loc(dd), N) |
| !$omp end target data |
| if (any(abs(cc - 33.0_c_float) > 10.0_c_float * epsilon(cc))) stop 146 |
| if (any(abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(cc))) stop 147 |
| |
| !$omp target data map(to:ee) map(from:ff) use_device_addr(ee,ff) |
| call copy3_array(c_loc(ee), c_loc(ff), N) |
| !$omp end target data |
| if (any(abs(ee - 55.0_c_float) > 10.0_c_float * epsilon(ee))) stop 148 |
| if (any(abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ee))) stop 149 |
| |
| deallocate(ee, ff) ! pointers, only |
| end subroutine test_main_1 |
| |
| ! Save device ptr - and recall pointer |
| subroutine test_main_2 |
| integer, parameter :: N = 1000 |
| |
| real(c_float), target, allocatable :: cc(:), dd(:) |
| real(c_float), pointer :: ee(:), ff(:) |
| |
| real(c_float) :: dummy |
| type(c_ptr) :: c_cptr, c_dptr, c_eptr, c_fptr |
| real(c_float), pointer :: cptr(:), dptr(:), eptr(:), fptr(:) |
| |
| allocate(cc(N), dd(N), ee(N), ff(N)) |
| |
| cc = 333.0_c_float |
| dd = 444.0_c_float |
| ee = 555.0_c_float |
| ff = 666.0_c_float |
| |
| !$omp target data map(to:cc) map(from:dd) |
| !$omp target data map(alloc:dummy) use_device_addr(cc,dd) |
| c_cptr = c_loc(cc) |
| c_dptr = c_loc(dd) |
| cptr => cc |
| dptr => dd |
| !$omp end target data |
| |
| ! check c_loc ptr once |
| call copy3_array(c_cptr, c_dptr, N) |
| !$omp target update from(dd) |
| if (any(abs(cc - 333.0_c_float) > 10.0_c_float * epsilon(cc))) stop 150 |
| if (any(abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(cc))) stop 151 |
| |
| ! check c_loc ptr again after target-value modification |
| cc = 3333.0_c_float |
| !$omp target update to(cc) |
| call copy3_array(c_cptr, c_dptr, N) |
| !$omp target update from(dd) |
| if (any(abs(cc - 3333.0_c_float) > 10.0_c_float * epsilon(cc))) stop 152 |
| if (any(abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(cc))) stop 153 |
| |
| ! check Fortran pointer after target-value modification |
| cc = 33333.0_c_float |
| !$omp target update to(cc) |
| call copy3_array(c_loc(cptr), c_loc(dptr), N) |
| !$omp target update from(dd) |
| if (any(abs(cc - 33333.0_c_float) > 10.0_c_float * epsilon(cc))) stop 154 |
| if (any(abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(cc))) stop 155 |
| !$omp end target data |
| |
| if (any(abs(cc - 33333.0_c_float) > 10.0_c_float * epsilon(dd))) stop 156 |
| if (any(abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(dd))) stop 157 |
| |
| |
| !$omp target data map(to:ee) map(from:ff) |
| !$omp target data map(alloc:dummy) use_device_addr(ee,ff) |
| c_eptr = c_loc(ee) |
| c_fptr = c_loc(ff) |
| eptr => ee |
| fptr => ff |
| !$omp end target data |
| |
| ! check c_loc ptr once |
| call copy3_array(c_eptr, c_fptr, N) |
| !$omp target update from(ff) |
| if (any(abs(ee - 555.0_c_float) > 10.0_c_float * epsilon(ee))) stop 158 |
| if (any(abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ee))) stop 159 |
| |
| ! check c_loc ptr again after target-value modification |
| ee = 5555.0_c_float |
| !$omp target update to(ee) |
| call copy3_array(c_eptr, c_fptr, N) |
| !$omp target update from(ff) |
| if (any(abs(ee - 5555.0_c_float) > 10.0_c_float * epsilon(ee))) stop 160 |
| if (any(abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ee))) stop 161 |
| |
| ! check Fortran pointer after target-value modification |
| ee = 55555.0_c_float |
| !$omp target update to(ee) |
| call copy3_array(c_loc(eptr), c_loc(fptr), N) |
| !$omp target update from(ff) |
| if (any(abs(ee - 55555.0_c_float) > 10.0_c_float * epsilon(ee))) stop 162 |
| if (any(abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ff))) stop 163 |
| !$omp end target data |
| |
| if (any(abs(ee - 55555.0_c_float) > 10.0_c_float * epsilon(ee))) stop 164 |
| if (any(abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ee))) stop 165 |
| |
| deallocate(ee, ff) |
| end subroutine test_main_2 |
| end module tests |
| |
| |
| program omp_device_addr |
| use tests |
| use test_dummies |
| use test_dummies_opt |
| use test_nullptr |
| implicit none (type, external) |
| |
| call test_main_1() |
| call test_main_2() |
| |
| call test_dummy_call_1() |
| call test_dummy_call_2() |
| |
| call test_dummy_opt_call_1() |
| call test_dummy_opt_call_2() |
| |
| call test_nullptr_1() |
| end program omp_device_addr |