Ошибка связи динамического параллелизма cuda c
Я пытаюсь связать свою программу динамического параллелизма в 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 без динамического пареллизма, программа работает.
Кто-нибудь знает, что я могу сделать, чтобы эта компиляция работала?
1 ответ
Похоже, что вам не хватает связи с -lcudadevrt
, Коды CDP должны быть связаны с временем работы устройства.
Вот полностью проработанный пример. Моя последовательность компиляции не идентична вашей, но довольно близка:
$ 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, которые демонстрируют, как компилировать и связывать проекты CDP.