"warning: __host__ annotation on a defaulted function is ignored" <- 为什么?
"warning: __host__ annotation on a defaulted function is ignored" <- why?
从 CUDA 8.0 切换到 CUDA 9.0 RC,我收到一条警告:
__host__ __device__ ~Foo() = default;
警告是:
path/to/Foo.cuh(69): warning: __host__ annotation on a defaulted function("~Foo") is ignored
我以前没用过。我真的应该收到这个警告吗?指示您想要设备端和主机端的默认析构函数有什么问题?
What's wrong with indicating you want the default destructor on both the device and the host side?
但这不是代码所说的。它说你想要主机和设备中的 same 琐碎的默认析构函数,这就是为什么会有警告,因为编译器(主机和设备)都不会发出相同的默认析构函数(并且因为编译轨迹的工作方式是不可能发生的)。
NVIDIA 声称最近的设备工具链支持 N2346。如果你想要这种行为(并且真正理解它需要什么),那么正确的代码应该是:
~Foo() = default;
两个编译器都会自动在两个代码中发出它们自己的默认析构函数,一切都会正常工作。
如果您想要针对现有代码库的 hacky 解决方法,请添加
-Xcudafe="--diag_suppress=2886"
你的 nvcc 构建命令应该消除警告,尽管我建议不要抑制警告。
[答案已添加为评论讨论的摘要,以便将问题从 CUDA 标记的未回答列表中删除。 ]
从 CUDA 8.0 切换到 CUDA 9.0 RC,我收到一条警告:
__host__ __device__ ~Foo() = default;
警告是:
path/to/Foo.cuh(69): warning: __host__ annotation on a defaulted function("~Foo") is ignored
我以前没用过。我真的应该收到这个警告吗?指示您想要设备端和主机端的默认析构函数有什么问题?
What's wrong with indicating you want the default destructor on both the device and the host side?
但这不是代码所说的。它说你想要主机和设备中的 same 琐碎的默认析构函数,这就是为什么会有警告,因为编译器(主机和设备)都不会发出相同的默认析构函数(并且因为编译轨迹的工作方式是不可能发生的)。
NVIDIA 声称最近的设备工具链支持 N2346。如果你想要这种行为(并且真正理解它需要什么),那么正确的代码应该是:
~Foo() = default;
两个编译器都会自动在两个代码中发出它们自己的默认析构函数,一切都会正常工作。
如果您想要针对现有代码库的 hacky 解决方法,请添加
-Xcudafe="--diag_suppress=2886"
你的 nvcc 构建命令应该消除警告,尽管我建议不要抑制警告。
[答案已添加为评论讨论的摘要,以便将问题从 CUDA 标记的未回答列表中删除。 ]