Hi Sandra,

Sandra Loosemore wrote:
This patch adds support for the case where #pragma omp declare variant
with append_args is used inside a #pragma omp dispatch interop that
specifies fewer interop args than required by the variant; new interop
objects are implicitly created and then destroyed around the call to the
variant, using the GOMP_interop builtin.

Thanks for the patch! It mostly looks okay, but I found two issues.

(A) Result without 'device' clause

(That likely happened as this part of code was in a flux
and only settled late in the GOMP_interop patch.)

Background:

GCC's behavior of the default device is a bit confusing as
-1 was original "= not specified", i.e. the current
default device.

But then OpenMP 5.2 (or was it 5.1?) added omp_initial_device == -1
and omp_invalid_device.

Thus, GCC now suddenly needs to handle special: An absent argument
and a user-specified omp_initial_device cannot both map to -1.


New:

OpenMP 6.1 will additionally add 'omp_default_device' as constant.

In anticipation of that change, the GOMP_interop patch
already added internally support for it - and uses it:
GOMP_DEVICE_DEFAULT_OMP_61 (== -5) is what will become
omp_default_device, but it is not yet exposed to the user
via omp.h/omp_lib.


Thus, please useGOMP_DEVICE_DEFAULT_OMP_61 for:

+         if (dispatch_device_num == NULL_TREE)
+           /* Not remapping device number.  */
+           dispatch_device_num = build_int_cst (integer_type_node,
+                                                GOMP_DEVICE_ICV);


* * *

(B) prefer_type & Fortran

The other issue is exposed by the attached testcase. It has

append_args(interop(target),
    interop(prefer_type("cuda","hip"), targetsync),
    interop(target,targetsync,prefer_type({attr("ompx_foo")})))

but the prefer_type is not passed on.

I assume that's my fault by not handling it correctly in
gcc/fortran/trans-openmp.cc, but if you could have a look?

(The C testcase works, i.e. it really must be my fault!)

And I am delighted that VALUE is correctly handled. :-)

Otherwise, the patch looks good to me.

Thanks!

Tobias

PS: Reminder (also to self):
We need to fix prefer_type with C++ templates as
exposed by testcase g++.dg/gomp/append-args-1.C.

PPS: As we now have runtime support, someone (myself?)
should write a libgomp/testsuite/ runtime check for this.
module m
use omp_lib
contains
subroutine g(x,y,z)
  integer(omp_interop_kind) :: x, y, z
  value :: y
end
subroutine f()
  !$omp declare variant(f: g) append_args(interop(target), interop(prefer_type("cuda","hip"), targetsync), interop(target,targetsync,prefer_type({attr("ompx_foo")}))) match(construct={dispatch})
end
end

use m
!$omp dispatch
  call f()
!$omp dispatch device(99)
  call f()
end

Reply via email to