[CUDA]去除Eigen库中的warning

一、问题提出

假如使用nvcccuda代码进行编译时,如果代码中使用了Eigen库(头文件),编译时可能会显示很多warning information,如下图红框中所示:

Eigen Warning 1
Eigen Warning 2

这些warning信息虽然不会影响代码的实际运行,但会令编译提示很乱,不便于按照编译器给出的信息进行debug。
本文将介绍如何在cuda代码中去除eigen库相关的、我们并不关心的warning信息。

二、解决方法

0. 基本思路

其实按照上图中的提示(黄框):
Remark: The warnings can be suppressed with "-diag-suppress <warning-number>"
可以看出,只要给nvcc编译器添加参数-diag-suppress <warning-number>即可消除这些warning信息。
其中:

  • -diag-suppressnvcc编译器的一个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信息的编号就是2001220014(上图中绿框中的编号),注意2001220014,不是20012-D20014-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>
...

三、参考

  1. NVIDIA CUDA Compiler Driver NVCC-4.2.8.14. --diag-suppress
  2. Disable NVCC warnings due to Eigen library code
  3. passing flags to nvcc via CMake
  4. https://gitlab.com/libeigen/eigen/-/blob/master/Eigen/src/Core/util/DisableStupidWarnings.h#L76-96

posted on 2023-11-19 11:27  刘好念  阅读(37)  评论(0编辑  收藏  举报  来源