为啥 NVCC 对 constexpr 比非 constexpr 主机函数更严格?

Posted

技术标签:

【中文标题】为啥 NVCC 对 constexpr 比非 constexpr 主机函数更严格?【英文标题】:Why is NVCC more strict with constexpr than non-constexpr host functions?为什么 NVCC 对 constexpr 比非 constexpr 主机函数更严格? 【发布时间】:2021-09-01 17:58:46 【问题描述】:

考虑以下代码:

constexpr __host__   void foo()   

__global__ void baz()

    if constexpr(1==2)  foo(); 

这个fails to compile 带有 CUDA 11.3.1 的 NVCC。但是,如果我删除constexpr - 它是does compile。

怎么会?这是一个错误吗?

【问题讨论】:

这是一个stated limitation。当您删除两个 constexpr 关键字中的第一个关键字时,事情起作用的原因是因为 C++ 的另一个方面允许它这样做。但是由于执行空间装饰器不是 C++ 语言的一部分,编译器可以按照它认为合适的顺序执行这些规则,并按照它认为合适的顺序。如果您认为这是一个错误,请随时 file a bug。 @RobertCrovella:但是:我的代码没有打破限制:它不会从函数的__device__ 版本调用 foo。如果它被认为是调用它,那么第二个版本也不应该编译。 【参考方案1】:

这是一个错误。我已将其提交给 NVIDIA:

https://developer.nvidia.com/nvidia_bug/3328502

(很难访问他们的错误跟踪系统,尝试先通过https://developer.nvidia.com登录,然后查看您的错误,然后替换错误编号。)

现在显然正在进行修复!

【讨论】:

以上是关于为啥 NVCC 对 constexpr 比非 constexpr 主机函数更严格?的主要内容,如果未能解决你的问题,请参考以下文章

我们对 nvcc 的#pragma unroll 的“强度”了解多少?

CUDA compiler driver nvcc 散点

为啥我的注意力模型比非注意力模型差

为啥整数上的 in_array 严格模式比非严格模式慢?

为啥这个 constexpr 静态成员函数在调用时不被视为 constexpr?

为啥**不**将函数声明为`constexpr`?