我有一个相当大的C ++代码(超过60个单独的文件),并且我尝试使用CUDA-9框架将一些计算切换到GPU。该代码通常可以使用gcc(v 7)正常编译。作为练习,我将源文件之一的扩展名从.cpp更改为.cu,而没有更改其中的任何代码。我运行了make,它使用g ++编译.cpp文件,并使用nvcc编译.cu文件,并且我得到了一个可执行文件。但是,当我运行可执行文件时,我几乎立即遇到了段错误。不用说,使用gcc编译时代码运行良好。实际上,它也可以与Intel编译器一起编译并运行良好。这些是传递给nvcc编译器的标志
nvcc -g -Xcudafe“ --diag_suppress = code_is_unreachable” -Xcudafe“ --diag_suppress = extra_semicolon”
g ++的标志为
g ++ -fPIC -O3 -g -Wno未使用变量-Wno注释-Wno可能未初始化-Wno严格锯齿-Wno-long-long -Wno-sign-compare -Wno弃用 -ftemplate-depth-39 -Wno-variadic-maris -m64
由于代码的大小,我想避免不必将所有文件重命名为.cu。而且,它依赖于已用gcc编译的库,因此将整个问题切换到nvcc是不切实际的,更不用说与gcc相比nvcc似乎很慢的事实。 gcc的cuda-9.0 / bin中的符号链接指向gcc-7。我还尝试将开关--device-c添加到nvcc,但是在这种情况下,它不会链接... 任何帮助表示赞赏。
答案 0 :(得分:2)
这听起来确实像是链接问题。在此处查看有关将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进行编译。