[cfe-dev] Implementing OpenMP function variants
Doerfert, Johannes via cfe-dev
cfe-dev at lists.llvm.org
Thu Dec 12 21:28:19 PST 2019
Background:
The prototype for OpenMPs 5.1 feature `begin/end declare variant` caused
a discussion that seems to be stuck. I'll briefly outline the semantics
of the OpenMP 5.0 `declare variant` and the `begin/end declare variant`
here before I present the two competing designs on a very high level. If
there is a need for more information, a summary of what was said, or
anything else, please feel free to ask for it.
---
OpenMP 5.0 `declare variant` allows you to define a variant of a base
function that is called instead of the base function if the context
specified with the variant matches at a call site.
As an example, the call to base below is replaced by a call to special
if the code is compiled with a compiler that identifies as "llvm".
```
void special();
#pragma omp declare variant(special) match(implementation={vendor(llvm)})
void base();
void test() {
base();
}
```
Context selectors for the match clause can be specific to the target,
the implementation, or the context in which the call is executed, e.g.,
syntactic inside a #omp parallel.
---
OpenMP 5.1 `begin/end declare variant` is an extension of the 5.0
version that (1) makes the user specific mangling obsolete, and (2)
guards the code in between the begin/end if the context selector does
not match at compile time. The use case can be simplified to the code
below in which we want the `sin` call to resolve to the NVIDIA specific
version if we are compiling for nvptx and to the one in math.h
otherwise. Note that the variant in the begin/end range has the same
name as the base it overloads.
```
#include "math.h"
#pragma omp begin declare variant match(device={arch(nvptx)})
double sin(double s) { return __nv_sin(s); }
#pragma omp end declare variant
double calc(double s) {
return sin(sin(sin(s)));
}
```
---
Now that we are all OpenMP experts, we need to decide how/where to
implement this. Oversimplified, these are the options being discussed:
Proposal 1, CodeGen:
Introduce aliases that redirect from one function to the other or
replace the callee in the CodeGen.
Proposal 2), SemaOverload:
Use the multi-version overloading for the 5.1 feature and introduce
another level of overload resolution for the 5.0 feature.
---
Thanks in advance for your time and input,
Johannes
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20191213/ca0ba744/attachment.sig>
More information about the cfe-dev
mailing list