为啥 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 的“强度”了解多少?