CUDA:NVCC 给出控制表达式是断言时的持续警告

Posted

技术标签:

【中文标题】CUDA:NVCC 给出控制表达式是断言时的持续警告【英文标题】:CUDA: NVCC gives controlling expression is constant warning on assert 【发布时间】:2009-11-11 02:55:26 【问题描述】:

我在这样的断言语句中收到警告controlling expression is constant

assert(... && "error message");

为什么在这个断言上出现这个警告?如何取消此警告?

NVCC 是 NVIDIA cuda 编译器,我认为它是基于 LLVM 的。当使用 GCC 或 Visual C++ 编译器可以正常编译时,为什么会给出这个警告?

【问题讨论】:

编译器应该根据 NVCC2.0 参考在 linux 上默认为 gcc。 而 gcc(至少 3.4.4 和 4.3.2)不会给出这样的警告。也许尝试通过#ifdef __GNUC__ / __GNUG__ 验证编译器? 我什至无法重现警告,而且我没有 gcc 有任何标志来抑制该警告。很奇怪。 【参考方案1】:

可移植的替代方案(可能包装在宏中)类似于:

 
     const bool error_message = true;
     assert([...] && error_message);
 

澄清我的意思:

#define myAssert(msg, exp)  const bool msg(true); assert(msg && (exp)); 
// usage:
myAssert(ouch, a && b);

... 给出例如:

断言“哎哟&&(a && b)”失败[...]

【讨论】:

【参考方案2】:

在代码开头附近的某处添加以下内容:

#pragma diag_suppress boolean_controlling_expr_is_constant

请注意,这将抑制“控制表达式是常量”的所有编译器警告,而不仅仅是与您的断言相关的警告。

我有时会在检查编译时定义(或可以派生)的常量或属性时收到此警告,因此根据我的经验,该警告通常是良性的,可以忽略。

【讨论】:

您也可以使用#pragma diag_warning boolean_controlling_expr_is_constant 重新打开警告。但是,这些pragmas 不能在设备代码中。就 CUDA 工具包而言,它们也完全没有文档记录,所以如果有一天它们停止运行,我不会感到惊讶......【参考方案3】:

我遇到了这个确切的问题,最后找到了一种方法来禁用设备上的警告。以下是详细信息...

要禁用特定警告,您需要将 -Xcudafe 标志与此页面上列出的令牌 (http://www.ssl.berkeley.edu/~jimm/grizzly_docs/SSL/opt/intel/cc/9.0/lib/locale/en_US/mcpcom.msg) 结合使用。例如,要禁用“控制表达式是常量”警告,请将以下内容传递给 NVCC:

-Xcudafe "--diag_suppress=boolean_controlling_expr_is_constant"

这对我有用!有关其他警告,请参阅上面的链接。

【讨论】:

【参考方案4】:

如果它是基于 LLVM 的,那么你可以使用这样的东西:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wmultichar"

char b = 'df'; // no warning.

#pragma clang diagnostic pop

来自Controlling Diagnostics via Pragmas。

【讨论】:

【参考方案5】:

试试#pragma warning

【讨论】:

以上是关于CUDA:NVCC 给出控制表达式是断言时的持续警告的主要内容,如果未能解决你的问题,请参考以下文章

cuda nvcc 使 __device__ 有条件

NVCC和NVRTC在编译为PTX时的差异

cuda安装完成后nvcc -V报错

编译时的CUDA设备属性和计算能力

CUDA compiler driver nvcc 散点

nvcc -arch sm_52 给出错误“未为选项‘gpu-architecture’定义值‘sm_52’”