Hi Tobias! On 2019-12-10T18:54:19+0100, Tobias Burnus <[email protected]> wrote: > PS: Besides adding tons of test cases, [r279858] also fixes the transient > issue > (which does only occur with -O1 ?!?)
(I saw it with different/differing optimization levels.)
> with the existing
> use_device_addr-{3,4}.f90 test case. That failed due to [...]. –
> Cf. https://gcc.gnu.org/ml/gcc-patches/2019-12/msg00499.html
ACK, thanks.
> PPS: I haven't tried polymorphic data types but I am positive they will
> fail. Cray pointers are also candidates for additional failures.
Please file PRs as appropriate.
> * testsuite/libgomp.fortran/use_device_ptr-optional-3.f90: New.
With 'dg-do run' added, on powerpc64le-unknown-linux-gnu without
offloading I'm seeing:
PASS: libgomp.fortran/use_device_ptr-optional-3.f90 -O0 (test for excess
errors)
FAIL: libgomp.fortran/use_device_ptr-optional-3.f90 -O0 execution test
PASS: libgomp.fortran/use_device_ptr-optional-3.f90 -O1 (test for excess
errors)
PASS: libgomp.fortran/use_device_ptr-optional-3.f90 -O1 execution test
PASS: libgomp.fortran/use_device_ptr-optional-3.f90 -O2 (test for excess
errors)
PASS: libgomp.fortran/use_device_ptr-optional-3.f90 -O2 execution test
PASS: libgomp.fortran/use_device_ptr-optional-3.f90 -O3
-fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions
(test for excess errors)
PASS: libgomp.fortran/use_device_ptr-optional-3.f90 -O3
-fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions
execution test
PASS: libgomp.fortran/use_device_ptr-optional-3.f90 -O3 -g (test for
excess errors)
PASS: libgomp.fortran/use_device_ptr-optional-3.f90 -O3 -g execution test
PASS: libgomp.fortran/use_device_ptr-optional-3.f90 -Os (test for excess
errors)
PASS: libgomp.fortran/use_device_ptr-optional-3.f90 -Os execution test
... with the '-O0' (only) execution test FAILing with 'STOP 1', and on
x86_64-pc-linux-gnu with offloading I'm seeing:
PASS: libgomp.fortran/use_device_ptr-optional-3.f90 -O0 (test for excess
errors)
PASS: libgomp.fortran/use_device_ptr-optional-3.f90 -O0 execution test
PASS: libgomp.fortran/use_device_ptr-optional-3.f90 -O1 (test for excess
errors)
PASS: libgomp.fortran/use_device_ptr-optional-3.f90 -O1 execution test
FAIL: libgomp.fortran/use_device_ptr-optional-3.f90 -O2 (test for excess
errors)
UNRESOLVED: libgomp.fortran/use_device_ptr-optional-3.f90 -O2
compilation failed to produce executable
FAIL: libgomp.fortran/use_device_ptr-optional-3.f90 -O3
-fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions
(test for excess errors)
UNRESOLVED: libgomp.fortran/use_device_ptr-optional-3.f90 -O3
-fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions
compilation failed to produce executable
FAIL: libgomp.fortran/use_device_ptr-optional-3.f90 -O3 -g (test for
excess errors)
UNRESOLVED: libgomp.fortran/use_device_ptr-optional-3.f90 -O3 -g
compilation failed to produce executable
FAIL: libgomp.fortran/use_device_ptr-optional-3.f90 -Os (test for excess
errors)
UNRESOLVED: libgomp.fortran/use_device_ptr-optional-3.f90 -Os
compilation failed to produce executable
... due to:
/tmp/cciVc43I.o:(.gnu.offload_vars+0x10): undefined reference to `A.12.4064'
[...]
..., which may be something like PR90779, PR85063, PR84592, PR90779,
PR80411, PR71536 -- or something else. ;-)
Grüße
Thomas
> --- /dev/null
> +++ b/libgomp/testsuite/libgomp.fortran/use_device_ptr-optional-3.f90
> @@ -0,0 +1,140 @@
> +! Check whether absent optional arguments are properly
> +! handled with use_device_{addr,ptr}.
> +program main
> + use iso_c_binding, only: c_ptr, c_loc, c_associated, c_f_pointer
> + implicit none (type, external)
> +
> + integer, target :: u
> + integer, target :: v
> + integer, target :: w
> + integer, target :: x(4)
> + integer, target, allocatable :: y
> + integer, target, allocatable :: z(:)
> + type(c_ptr), target :: cptr
> + type(c_ptr), target :: cptr_in
> + integer :: dummy
> +
> + u = 42
> + v = 5
> + w = 7
> + x = [3,4,6,2]
> + y = 88
> + z = [1,2,3]
> +
> + !$omp target enter data map(to:u)
> + !$omp target data map(to:dummy) use_device_addr(u)
> + cptr_in = c_loc(u) ! Has to be outside 'foo' due to 'intent(in)'
> + !$omp end target data
> +
> + call foo (u, v, w, x, y, z, cptr, cptr_in)
> + deallocate (y, z)
> +contains
> + subroutine foo (u, v, w, x, y, z, cptr, cptr_in)
> + integer, target, optional, value :: v
> + integer, target, optional :: u, w
> + integer, target, optional :: x(:)
> + integer, target, optional, allocatable :: y
> + integer, target, optional, allocatable :: z(:)
> + type(c_ptr), target, optional, value :: cptr
> + type(c_ptr), target, optional, value, intent(in) :: cptr_in
> + integer :: d
> +
> + type(c_ptr) :: p_u, p_v, p_w, p_x, p_y, p_z, p_cptr, p_cptr_in
> +
> + !$omp target enter data map(to:w, x, y, z)
> + !$omp target data map(dummy) use_device_addr(x)
> + cptr = c_loc(x)
> + !$omp end target data
> +
> + ! Need to map per-VALUE arguments, if present
> + if (present(v)) then
> + !$omp target enter data map(to:v)
> + else
> + stop 1
> + end if
> + if (present(cptr)) then
> + !$omp target enter data map(to:cptr)
> + else
> + stop 2
> + end if
> + if (present(cptr_in)) then
> + !$omp target enter data map(to:cptr_in)
> + else
> + stop 3
> + end if
> +
> + !$omp target data map(d) use_device_addr(u, v, w, x, y, z)
> + !$omp target data map(d) use_device_addr(cptr, cptr_in)
> + if (.not. present(u)) stop 10
> + if (.not. present(v)) stop 11
> + if (.not. present(w)) stop 12
> + if (.not. present(x)) stop 13
> + if (.not. present(y)) stop 14
> + if (.not. present(z)) stop 15
> + if (.not. present(cptr)) stop 16
> + if (.not. present(cptr_in)) stop 17
> + p_u = c_loc(u)
> + p_v = c_loc(v)
> + p_w = c_loc(w)
> + p_x = c_loc(x)
> + p_y = c_loc(y)
> + p_z = c_loc(z)
> + p_cptr = c_loc(cptr)
> + p_cptr_in = c_loc(cptr_in)
> + !$omp end target data
> + !$omp end target data
> + call check(p_u, p_v, p_w, p_x, p_y, p_z, p_cptr, p_cptr_in, size(x),
> size(z))
> + end subroutine foo
> +
> + subroutine check(p_u, p_v, p_w, p_x, p_y, p_z, p_cptr, p_cptr_in, Nx, Nz)
> + type(c_ptr), value :: p_u, p_v, p_w, p_x, p_y, p_z, p_cptr, p_cptr_in
> + integer, value :: Nx, Nz
> + integer, pointer :: c_u(:), c_v(:), c_w(:), c_x(:), c_y(:), c_z(:)
> + type(c_ptr), pointer :: c_cptr(:), c_cptr_in(:)
> +
> + ! As is_device_ptr does not handle scalars, we map them to a size-1 array
> + call c_f_pointer(p_u, c_u, shape=[1])
> + call c_f_pointer(p_v, c_v, shape=[1])
> + call c_f_pointer(p_w, c_w, shape=[1])
> + call c_f_pointer(p_x, c_x, shape=[Nx])
> + call c_f_pointer(p_y, c_y, shape=[1])
> + call c_f_pointer(p_z, c_z, shape=[Nz])
> + call c_f_pointer(p_cptr, c_cptr, shape=[1])
> + call c_f_pointer(p_cptr_in, c_cptr_in, shape=[1])
> + call run_target(c_u, c_v, c_w, c_x, c_y, c_z, c_cptr, c_cptr_in, Nx, Nz)
> + end subroutine check
> +
> + subroutine run_target(c_u, c_v, c_w, c_x, c_y, c_z, c_cptr, c_cptr_in, Nx,
> Nz)
> + integer, target :: c_u(:), c_v(:), c_w(:), c_x(:), c_y(:), c_z(:)
> + type(c_ptr) :: c_cptr(:), c_cptr_in(:)
> + integer, value :: Nx, Nz
> + !$omp target is_device_ptr(c_u, c_v, c_w, c_x, c_y, c_z, c_cptr,
> c_cptr_in) map(to:Nx, Nz)
> + call target_fn(c_u(1), c_v(1), c_w(1), c_x, c_y(1), c_z, c_cptr(1),
> c_cptr_in(1), Nx, Nz)
> + !$omp end target
> + end subroutine run_target
> +
> + subroutine target_fn(c_u, c_v, c_w, c_x, c_y, c_z, c_cptr, c_cptr_in, Nx,
> Nz)
> + !$omp declare target
> + integer, target :: c_u, c_v, c_w, c_x(:), c_y, c_z(:)
> + type(c_ptr), value :: c_cptr, c_cptr_in
> + integer, value :: Nx, Nz
> + integer, pointer :: u, x(:)
> + if (c_u /= 42) stop 30
> + if (c_v /= 5) stop 31
> + if (c_w /= 7) stop 32
> + if (Nx /= 4) stop 33
> + if (any (c_x /= [3,4,6,2])) stop 34
> + if (c_y /= 88) stop 35
> + if (Nz /= 3) stop 36
> + if (any (c_z /= [1,2,3])) stop 37
> + if (.not. c_associated (c_cptr)) stop 38
> + if (.not. c_associated (c_cptr_in)) stop 39
> + if (.not. c_associated (c_cptr, c_loc(c_x))) stop 40
> + if (.not. c_associated (c_cptr_in, c_loc(c_u))) stop 41
> + call c_f_pointer(c_cptr_in, u)
> + call c_f_pointer(c_cptr, x, shape=[Nx])
> + if (u /= c_u .or. u /= 42) stop 42
> + if (any (x /= c_x)) stop 43
> + if (any (x /= [3,4,6,2])) stop 44
> + end subroutine target_fn
> +end program main
signature.asc
Description: PGP signature
