This email is probably a bit premature as the OpenMPv4.0 and OpenACC 2.0a specs do not seem to handle Fortran 2003's polymorphic variables. However, as I am currently thinking how to handle a similar problem for Fortran's coarray, I want to raise the issue for OpenMP/OpenACC to see whether something should be done in gfortran to solve the problem for OpenMP/OpenACC and coarrays at the same time. For coarrays, see also https://gcc.gnu.org/ml/fortran/2014-06/msg00132.html

The issue described below occurs when one needs to copy variables which are polymorphic or contain components which are polymorphic. That applies both to copying them to a thread-local variable or with offloading to the memory of an accelerator.

In case of Fortran, doing an assignment of a derived type (record type) will also copy the allocatable components, which in turn might have again allocatable components. For nonpolymorphic variables, one can simply recursively walk through all components and do the copying that way. That's how the Fortran FE does for intrinsic assignments – and what Jakub's recently committed OpenMPv4.0 patch does.

However, how to handle it for polymorphic types? In case of the intrinsic assignment, the variable/component has a pointer to a virtual table, which contains a function pointer to the type's copy function.

But how to handle it in case of OpenMP (v4.1?, v5.0?)? One could augment the vtable by a function pointer to an function which handles this for OpenMP/OpenACC, probably by calling some libgomp library function. In case of coarrays, I have (see link above) the same problem: I need to add library calls to transfer allocatable components forth to and back from a remote process. Thus, I am also thinking of adding a new entry to the virtual table

Another issue arises when one mixes code with and without -fopenmp/-facc/-fcoarray=lib. One either has to generate the vtable entry and function unconditionally – or only with that option, but then one might run into corner cases, where the function is not available.

One option* I see is some kind of generic function, which takes as additional argument a function pointer; this pointer could point either to libgomp or to the coarray library (for -fcoarray=lib), depending on the caller. In addition, it avoids issues with dependencies on the called library.

What do you think? Would this be a sensible way for OpenMPv5/OpenACCv3/coarrays? Or do you see pitfalls with this approach? One additional issue would be the way the arguments are passed, which one would have to agree on.

Comments? Suggestions? Questions?

Tobias

* The other option is to generate specific functions, but that is not only less flexible but also runs into issues like library dependencies. Those can be solved with weak symbols and stubs, but that's also not very elegant.

Reply via email to