如何禁用特定的nvcc编译器警告

时间:2013-02-12 11:05:02

标签: cuda compiler-warnings pragma nvcc

我想用nvcc禁用特定的编译器警告,特别是

  

警告:不允许NULL引用

我正在处理的代码使用NULL引用是SFINAE的一部分,因此无法避免。

理想的解决方案是在我们要禁用警告的源文件中只有#pragma,但编译器标志也可以,如果存在,只关闭有问题的警告。

6 个答案:

答案 0 :(得分:20)

实际上可以使用NVCC禁用设备上的特定警告。我花了很长时间才弄清楚如何去做。

您需要将-Xcudafe标记与this page上列出的标记结合使用。例如,要禁用“控制表达式为常量”警告,请将以下内容传递给NVCC:

-Xcudafe "--diag_suppress=boolean_controlling_expr_is_constant"

有关其他警告,请参阅上面的link

答案 1 :(得分:11)

只是添加上一个关于-xcudafe的答案(还没有足够的声誉留下评论)

你可以在pragma中本地完成:

#pragma push
#pragma diag_suppress = code_is_unreachable 
...
#pragma pop

cudaFE显然是爱迪生设计集团的Nvidia定制版C ++前端版。您可以在此处找到它的文档:http://www.edg.com/docs/edg_cpp.pdf具有诊断的pragma指令。它只提到了“微软上下文”中的推送和弹出,但我在我的代码中测试了它们(Mac,而不是MSVC)并且它们有效。

编辑:用户手册的新版本(2018年8月5日)更改了推送/弹出语法,并添加了本地化警告严重性控制的新方法。

新的推/弹语法:

#pragma push_macro(“identifier”)
#pragma pop_macro(“identifier”)

您可以在第77页上看到2018手册(2018年8月v 5.0)。我没有在最新版本的CUDA上对此进行过测试,但@einpoklum指出,只是在初始帖子中执行push / pop不再有效 - 即#pragma push会生成一个警告,忽略它。同样,我还没有测试过push_macro / pop_macro是否适用于push / pop中推送/弹出pragma语句。但是,在本v5.0手册的第75页上,他们将介绍如何在没有push / pop的情况下进行本地化诊断严重性控制:

  

以下示例禁止“无意义的朋友声明”   关于A类声明的警告:

#pragma diag_suppress 522
class A { friend class A; };
#pragma diag_default 522
class B { friend class B; };

#pragma diag_default将警告返回到默认状态。所以在我的例子中它将是:

#pragma diag_suppress = code_is_unreachable
...
#pragma diag_default = code_is_unreachable

等号是可选的。

答案 2 :(得分:2)

要扩大user2333829的答案:如果您知道警告名称,则可以这样禁用它:

-Xcudafe "--diag_suppress=boolean_controlling_expr_is_constant"

如果您不知道名字,可以通过以下方式获得警告编号:

-Xcudafe --display_error_number

然后加上:

-Xcudafe --diag_suppress=<warning_number>

(注意:这两个选项显然无法同时使用。)

答案 3 :(得分:1)

我努力为我的警告找到匹配的-Xcudafe。所以这是另一种方式。

您可以将编译器标志传递给CL.exe,以禁用特定警告。例如,要禁用有关未经检查的迭代器的警告,您可以传递/wd4996

warning C4996: 'std::_Copy_impl': Function call with parameters that may be
unsafe - this call relies on the caller to check that the passed values are 
correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See 
documentation on how to use Visual C++ 'Checked Iterators'

这里棘手的是默认情况下,主机编译器设置中的参数不会传递给nvcc,因此您需要通过CUDA C/C++对话框添加它。

enter image description here

答案 4 :(得分:0)

您可以使用w标志来禁止警告  nvcc -w

答案 5 :(得分:0)

我在ubuntu g ++编译器(例如openmpi mpic ++)中使用了nvcc。对于g ++编译器的“ -Wunused-result”,相应的消息抑制为“ -Wno-unused-result”。因此,在像-Xcompiler“ -Wno-unused-result”这样的nvcc中传递它对我有用。