首页 > 解决方案 > 我在编译包含使用 nvcc 编译的 .cu 文件和使用 gcc 编译的 .cpp 文件的代码时遇到问题

问题描述

我有一个相当大的 C++ 代码(超过 60 个单独的文件),我正在尝试使用 CUDA-9 框架将一些计算切换到 GPU。该代码通常可以使用 gcc (v 7) 正常编译。作为练习,我将其中一个源文件的扩展名从 .cpp 更改为 .cu,而没有更改其中的任何代码。我运行了 make,它用 g++ 编译 .cpp 文件,用 nvcc 编译 .cu 文件,我得到了一个可执行文件。但是,当我运行可执行文件时,我几乎立即得到一个段错误。不用说,使用 gcc 编译时代码运行良好。事实上,它也可以与英特尔编译器一起编译和运行。这些是传递给 nvcc 编译器的标志

nvcc -g -Xcudafe "--diag_suppress=code_is_unreachable" -Xcudafe "--diag_suppress=extra_semicolon"

而 g++ 的标志是

g++ -fPIC -O3 -g -Wno-unused-variable -Wno-comment -Wno-maybe-uninitialized -Wno-strict-aliasing -Wno-long-long -Wno-sign-compare -Wno-deprecated -ftemplate-depth- 39 -Wno-variadic-maris -m64

由于代码的大小,我想避免将所有文件重命名为 .cu。而且,它依赖于已经用gcc编译的库,因此将整个问题切换到nvcc是不切实际的,更不用说nvcc与gcc相比似乎很慢。cuda-9.0/bin 中 gcc 的符号链接指向 gcc-7。我还尝试将开关--device-c 添加到 nvcc,但在这种情况下,它不会链接......感谢任何帮助。

标签: gcccuda

解决方案


这绝对听起来像是一个链接问题。在这里查看有关将 cuda 设备代码与 c++ 代码链接的综合说明:https ://devblogs.nvidia.com/separate-compilation-linking-cuda-device-code/

不幸的是,您没有提供链接命令。我会尽量使我的建议尽可能笼统。缺点是只有 nvcc 了解如何将设备代码链接到 CPU 目标代码,因此它需要参与链接过程,而不仅仅是作为编译器。查看上面链接中的“使用设备代码链接”和“高级用法:使用不同的链接器”部分。您可以使用 nvcc 作为编译器和链接器,也可以使用 nvcc 使用 -dlink 选项将组合的 cpu 和设备代码目标文件链接在一起,然后您可以正常链接所有内容。在这两种情况下,您都应该在编译包含设备代码的源文件时将 -dc 选项传递给 nvcc(这表明您希望稍后将设备代码链接在一起)

另请注意,nvcc 可以编译 .cpp 文件;默认情况下,它将假定 .cpp 文件仅包含 cpu 代码。您无需重命名仅 cpu 的源文件即可使用 nvcc 编译它们。


推荐阅读