使用可重定位设备代码编译 CUDA“hello, world”的分段错误

Posted

技术标签:

【中文标题】使用可重定位设备代码编译 CUDA“hello, world”的分段错误【英文标题】:Segmentation fault compiling CUDA "hello, world" with relocatable-device-code 【发布时间】:2013-06-24 04:52:30 【问题描述】:

我正在尝试使用relocatable-device-code 标志。我有一个大型项目,使用小代码块更容易维护。

我能够编译该项目。尝试运行它时,我遇到了严重的崩溃。使用调试器时:

(gdb) where
#0  0x0000000000000001 in ?? ()
#1  0x00007fffffffe39c in ?? ()
#2  0x0000000000000000 in ?? ()

我从未见过这样的堆栈跟踪!然后我减少了代码量,直到我得出一个奇点:main.cu 文件只包含

#include <iostream>

int main(void) 
    std::cout << "hello, world" << std::endl;
    return 0;

仍然失败。我正在使用以下标志来编译我的 main.cu 文件。

nvcc    -shared -rdc=true -arch=sm_20 -Xcompiler -fPIC -g -G

这些有意义吗?为什么这么简单的程序会出现分段错误?

【问题讨论】:

【参考方案1】:

移除-shared 开关。当您尝试生成可执行文件时,该选项不适用。

来自documentation:

在链接期间生成一个共享库。注意:当需要其他链接器选项来控制 dll 生成时,请使用选项 -Xlinker。

【讨论】:

以上是关于使用可重定位设备代码编译 CUDA“hello, world”的分段错误的主要内容,如果未能解决你的问题,请参考以下文章

编译原理

使用cmake和3.5计算功能编译CUDA代码

CUDA可分离编译+共享库->无效的设备功能/段错误

编译时的CUDA设备属性和计算能力

Makefile:来自相同源的两个目标使用不同的标志编译两次

编译原理绪论