“警告:默认功能上的__host__批注将被忽略” <-为什么?

ein*_*ica 5 destructor cuda compiler-warnings nvcc

从CUDA 8.0切换到CUDA 9.0 RC,我收到以下警告:

__host__ __device__ ~Foo() = default;
Run Code Online (Sandbox Code Playgroud)

警告是:

path/to/Foo.cuh(69): warning: __host__ annotation on a defaulted function("~Foo") is ignored
Run Code Online (Sandbox Code Playgroud)

我以前没用过。我真的应该得到这个警告吗?指示要在设备和主机端都使用默认析构函数有什么问题?

tal*_*ies 7

指示您希望在设备端和主机端都使用默认析构函数有什么问题?

但这不是代码所说的。它表示您希望在主机和设备中使用相同的简单默认析构函数,这就是为什么会出现警告,因为编译器(主机和设备)都不会潜在地发出相同的默认析构函数(并且因为编译轨迹的工作方式是不可能发生)。

NVIDIA声称最近的设备工​​具链支持N2346。如果您想要这种行为(并且真正理解它的含义),那么正确的代码应该是:

~Foo() = default;
Run Code Online (Sandbox Code Playgroud)

两个编译器都会在代码中自动发出自己的默认析构函数,一切都会正常工作。

如果您想要对现有代码库采取一种巧妙的解决方法,请添加

-Xcudafe="--diag_suppress=2886" 
Run Code Online (Sandbox Code Playgroud)

尽管我建议不要抑制警告,但您的 nvcc 构建命令应该消除警告。

[添加答案作为评论讨论摘要,以将问题从 CUDA 标签的未答复列表中删除。]