我试图按照以下方式链接 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代码时,该程序可以运行。
有人知道我该怎么做才能使这个编辑有效吗?
答案 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项目。