【问题标题】:cuda dynamic parallelism linkage error extern ccuda动态并行链接错误外部c
【发布时间】:2015-03-12 23:49:29
【问题描述】:

我正在尝试如下链接我的 CUDA Kepler 的动态并行 程序:

nvcc -m32 -arch=sm_35 -dc -Xcompiler '-fPIC' DFS_Solving.cu
nvcc -m32 -arch=sm_35 -Xcompiler '-fPIC' -dlink DFS_Solving.o -o link.o
gcc  -shared -Wl,-soname,libdfs.so -o libdfs.so DFS_Solving.o link.o -L/usr/local/cuda/lib  -lcudart
gcc -c proxy.c
gcc -o proxy proxy.o -L. -ldfs

然后我得到以下错误:

./libdfs.so: undefined reference to `__fatbinwrap_66_tmpxft_000015c6_00000000_12_cuda_device_runtime_compute_50_cpp1_ii_5f6993ef'                    
collect2: error: ld returned 1 exit status

但是:当我执行相同的过程来编译没有动态并行的 CUDA 代码时,程序可以工作。

有人知道我可以做些什么来使这个编译工作吗?

【问题讨论】:

  • 你没有在我能看到的任何地方链接到-lcudadevrt。动态并行具有特殊的编译要求。您可能想查看 cuda 动态并行 sample code 中的 makefile。所以expects,你提供了一个完整的MCVE,而不仅仅是你的编译步骤。

标签: gcc cuda nvcc linkage dynamic-parallelism


【解决方案1】:

您似乎缺少与-lcudadevrt 的链接。 CDP 代码需要与device runtime 关联。

这是一个完整的例子。我的编译顺序和你的不一样,但非常接近:

$ cat DFS_Solving.cu
#include <stdio.h>

extern "C"{

  void cuda_test();

}

__global__ void child_kernel(){

  printf("hello\n");

}

__global__ void parent_kernel(){

  child_kernel<<<1,1>>>();
  cudaDeviceSynchronize();
}

void cuda_test(){

  parent_kernel<<<1,1>>>();
  cudaDeviceSynchronize();
}
$ cat proxy.c
void cuda_test();

int main(){

  cuda_test();

}

$ nvcc -arch=sm_35 -dc -Xcompiler '-fPIC' DFS_Solving.cu
$ nvcc -arch=sm_35 -Xcompiler '-fPIC' -dlink DFS_Solving.o -o link.o
$ gcc  -shared -Wl,-soname,libdfs.so -o libdfs.so DFS_Solving.o link.o -L/usr/local/cuda/lib64  -lcudart -lcudadevrt
$ gcc -c proxy.c
$ g++ -o proxy proxy.o -L. -ldfs
$ ./proxy
hello
$

还有各种cuda sample codes 演示如何编译和链接 CDP 项目。

【讨论】:

    猜你喜欢
    • 2013-10-20
    • 2023-03-17
    • 2012-08-30
    • 2014-03-23
    • 2015-01-18
    • 2012-12-03
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多