一、问题提出
假如使用nvcc
对cuda
代码进行编译时,如果代码中使用了Eigen
库(头文件),编译时可能会显示很多warning information
,如下图红框中所示:
这些warning信息虽然不会影响代码的实际运行,但会令编译提示很乱,不便于按照编译器给出的信息进行debug。
本文将介绍如何在cuda代码中去除eigen库相关的、我们并不关心的warning信息。
二、解决方法
0. 基本思路
其实按照上图中的提示(黄框):
Remark: The warnings can be suppressed with "-diag-suppress <warning-number>"
可以看出,只要给nvcc
编译器添加参数-diag-suppress <warning-number>
即可消除这些warning信息。
其中:
-diag-suppress
是nvcc
编译器的一个flag参数,用于Suppress specified diagnostic message(s) generated by the CUDA frontend compiler (note: does not affect diagnostics generated by the host compiler/preprocessor)
。<warning-number>
是warning信息的编号,例如上图中warning信息的编号就是20012
和20014
(上图中绿框中的编号),注意是20012
和20014
,不是20012-D
和20014-D
。
下面给出三种方法,都可以达到我们的目的。
方法一:在cmake代码中
在cmake 文件中添加如下语句
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS};-diag-suppress=20012,20014")
或者
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} -diag-suppress=20012,20014)
方法二、在执行cmake时
我们也可以在build目录下,执行cmake ..
生成make
文件时通过以下命令设置nvcc
的flag
# 在build目录下
cmake -DCMAKE_CUDA_FLAGS=-diag-suppress=20012,20014 ..
方法三、在CUDA代码中
其实eigen库官方也知道这个问题的存在,也提供了相应的头文件用于disable stupid warnings,我们也可以在包含eigen库头文件前的代码中手动加入以下代码用于消除eiegn的warning信息。
但我在使用下面代码时只能消除20012号信息,对20014不管用,不知道为什么 : (
...
#pragma nv_diag_suppress 20012
#pragma nv_diag_suppress 20014
#include <eigen/Eigen/Core>
#include <eigen3/Eigen/Dense>
...
三、参考
- NVIDIA CUDA Compiler Driver NVCC-4.2.8.14. --diag-suppress
- Disable NVCC warnings due to Eigen library code
- passing flags to nvcc via CMake
- https://gitlab.com/libeigen/eigen/-/blob/master/Eigen/src/Core/util/DisableStupidWarnings.h#L76-96