CUDA 多编译器警告

Posted

技术标签:

【中文标题】CUDA 多编译器警告【英文标题】:CUDA Multiple Compiler Warnings 【发布时间】:2015-02-12 10:40:35 【问题描述】:

我一直在 Visual Studio 2012 中使用 CUDA v6.5 进行开发,但遇到了一个问题:编译 .cu 文件时,编译器会针对单行源代码输出多个警告。通常这不会是什么大不了的事,但它已经开始花费很长时间来构建,我怀疑这可能就是原因。例如:

int unused = 0;

四次产生以下错误:

1>.../GeometryManager.cu(188): warning : variable "unused" was declared but never referenced

这些是传递给 nvcc 的命令行参数:

-gencode=arch=compute_35,code=\"sm_35,compute_35\" --use-local-env --cl-version 2012
-ccbin "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin"
-I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\include"
-I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\include"
-I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\include"
-G   --keep-dir Debug -maxrregcount=0  --machine 32 --compile
-cudart static -arch sm_20  -g   -DNDEBUG -DWIN32 -D_DEBUG -D_CONSOLE
-D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Zi /RTC1 /MTd  "
-o Debug\GeometryManager.cu.obj "C:\...\GeometryManager.cu" 

编译 .cpp 文件时,警告似乎正常发出。到目前为止,我尝试将属性中 Code Generation 的值更改为 compute_35,sm_35,(之前列出了其中的几个)但没有帮助。

如果有 CUDA 或 nvcc 经验的人能对这种情况有所了解,我将不胜感激。有关如何使用 CUDA 减少构建时间的任何其他建议也会有所帮助。谢谢。

【问题讨论】:

也许从代码中删除未使用的变量可能有助于消除警告? 嗯,当然。这不是我担心的警告;我担心编译器会做额外的工作,这会使我的构建时间飞涨。 【参考方案1】:

它多次生成警告的原因是由于多个目标的规范,它正在多次编译您的代码:

-gencode=arch=compute_35,code=\"sm_35,compute_35\"

-arch sm_20

如果您不需要这两组目标,您可以通过删除其中一个(即从 Visual Studio 项目配置中删除)来减少产生的警告消息并缩短编译时间。 (在这种情况下,我认为您最终会收到 2 组警告而不是 4 组。)

【讨论】:

感谢您的回复。我删除了 -arch sm_20 选项,它确实给我带来了两个警告而不是四个。只是为了澄清我的理解, sm_ 参数告诉编译器为实际硬件生成二进制代码。 compute_ 参数告诉编译器生成特定类型的 PTX 代码,该代码在运行时编译和加载。我不明白为什么根据 NVCC 手册, sm_ 和 compute_ 参数必须兼容。它们似乎为编译器描述了两个互斥的后端。非常感谢您帮我解决这个问题。 对于给定的target,虚拟和物理架构必须兼容。您可以通过指定多个目标来指定包含“不兼容”架构(就像您的示例开始时一样。一个目标是 cc2.0 设备加 PTX,另一个目标是 cc3.5 设备加 PTX)。这已经是一个相当复杂的话题了。编译器设计者可能允许您在单个“目标”规范中指定给定的 PTX 版本和不同的(不兼容的)SASS 版本,但是(IMO)会变得非常混乱。 另外,-gencode 选项的变体允许您指定仅 PTX 目标(无 SASS),还有其他变体允许您指定仅 SASS(无 PTX ) 目标。所以已经有了相当大的灵活性。

以上是关于CUDA 多编译器警告的主要内容,如果未能解决你的问题,请参考以下文章

cuda 多计算能力支持

CUDA ptxas 警告(入口的堆栈大小)

CUDA ptxas警告(进入的堆栈大小)

ubuntu18.04 安装 cuda8 并多版本共存

如何在没有主机编译器的情况下创建 Cuda 模块

CUDA 7.5 安装:不支持的编译器错误