cuda动态并行性连接错误extern c

时间:2015-03-11 15:31:45

标签: gcc cuda nvcc linkage dynamic-parallelism

我试图按照以下方式链接 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

但是:当我使用相同的程序编译没有动态Parellelism的CUDA代码时,该程序可以运行。

有人知道我该怎么做才能使这个编辑有效吗?

1 个答案:

答案 0 :(得分: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项目。