如何隐藏 NVCC 的“函数已声明但从未引用”警告?

Posted

技术标签:

【中文标题】如何隐藏 NVCC 的“函数已声明但从未引用”警告?【英文标题】:How to hide NVCC's "function was declared but never referenced" warnings? 【发布时间】:2018-04-14 21:35:55 【问题描述】:

在编译使用 Google Test 的 CUDA 程序时,nvcc 会发出误报警告:

函数 已声明但从未被引用

一个 MCVE:

// test.cu
#include <gtest/gtest.h>

namespace 

__global__ void a_kernel() 
    printf("Works");


TEST(ExampleTest, ExampleTestCase) 
    a_kernel<<<1, 1>>>();



编译它给出:

$ nvcc test.cu -lgtest -lgtest_main
test.cu(9): warning: function "<unnamed>::ExampleTest_ExampleTestCase_Test::ExampleTest_ExampleTestCase_Test()" was declared but never referenced

google test 和 CUDA 9.1 的 master 分支证实了这一点(我相信它从 CUDA 9.0 开始发生,并且该错误在 CUDA 8.0 中不存在)。如果测试位于全局命名空间中,则不会发生此问题。

有没有办法禁用这些警告?我知道我可以使用-w 禁用所有警告,但我想保留其他类型的警告。

【问题讨论】:

不是你问题的真正答案,但如果你需要一个解决方案来删除这个警告,并且 (a) 不介意在 gtest 内部更改一行并且 (b) 你可以使用 c ++11:转到gtest-internal.h 并将 替换为= default; 【参考方案1】:

你可以试试蛮力方法:

   #pragma push
   #pragma diag_suppress 177 // suppress "function was declared but never referenced warning"

   .. your function ..

   #pragma pop

【讨论】:

谢谢,这行得通。幸运的是,NVIDIA 在 CUDA 9.2 中修复了该问题,因此不再出现误报,但对于使用较旧编译器的用户来说,这仍然是件好事。只是,您能否更新答案并解释此177 代码来自何处(即如何找到此代码)?万一看到这个问题的人有类似的问题,会有不同的警告。那我就接受答案了。 很高兴你问到 :) 我花了很长时间试图找到 nvcc 的代码,一旦我因缺乏信息而感到沮丧,我编写了一个脚本,生成了一系列“ diag_suppress" 行从 0 到 5000 左右,然后手动二进制搜索正确的代码...我希望 NVidia 在某处有错误列表... @MaximMakhinya 我认为错误代码取决于前端,这里是一个列表 ssl.berkeley.edu/%7Ejimm/grizzly_docs/SSL/opt/intel/cc/9.0/lib/… ,这是一个带有数字代码的列表:ece.ualberta.ca/~cmpe490/documents/ghs/405/c_error_ref.pdf 。看起来您的数字代码与该特定警告不对应,或者数字前的零可能很重要。

以上是关于如何隐藏 NVCC 的“函数已声明但从未引用”警告?的主要内容,如果未能解决你的问题,请参考以下文章

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

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

cuda 8.0 中的 nvcc 警告

nvcc 警告设备变量是主机变量 - 为啥?

cuda nvcc 使 __device__ 有条件

如何隐藏缺少 phpmyadmin 警告?