[PATCH] D79237: [CUDA][HIP] Fix constexpr variables for C++17
Artem Belevich via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue May 12 10:12:13 PDT 2020
tra added a comment.
> constexpr variables are compile time constants and implicitly const, therefore
> they are safe to emit on both device and host side. Besides, in many cases
> they are intended for both device and host, therefore it makes sense
> to emit them on both device and host sides if necessary.
>
> In most cases constexpr variables are used as rvalue and the variables
> themselves do not need to be emitted.
Agreed so far. constexpr values are usable on both sides.
> However if their address is taken, then they need to be emitted.
Agreed.
That's where the fun starts. Will this assertion trigger or not?
constexpr int ce = 42;
__global__ void kernel() {
assert(p == &ce);
}
void f() {
kernel<<<1,1>>>(&ce);
}
NVCC does not allow accessing ce, so this does not compile.
Clang allows taking a reference, but the variable is not emitted, so the failure will happen in ptxas.
If compiler does emit ce on device side, the addresses will be different, unless we rely on
CUDA runtime magic to translate addresses of shadows into real device-side address.
If we do that, then we should probably add an implicit __constant__ on the constexpr vars.
>
> The following example shows constexpr is available on device side without
> __device__ or __constant__ attribute
>
> https://godbolt.org/z/Uf7CgK
If you clear output filters, you will see that the reference to constexpr is emitted as `.extern .global .align 4 .u32 _ZN1B1bE;` and the varible's address is not actually available. If you were to actually compile the example, ptxas would complain about ti.
NVCC, predictably, allows using constexpr values, but not the variables themselves: https://godbolt.org/z/DXy65T
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D79237/new/
https://reviews.llvm.org/D79237
More information about the cfe-commits
mailing list