我目前正在尝试使用 CUDA 例程创建一个库,但我遇到了麻烦。我将使用一个相当简单的示例来解释我的问题,我的实际库会更大。
我已经成功编写test.cu
了一个源文件,其中包含一个__global__
CUDA 函数和一个围绕它的包装器(用于分配和复制内存)。我还可以使用以下命令成功将此文件编译到共享库中:
nvcc -c test.cu -o test.o -lpthread -lrt -lcuda -lcudart -Xcompiler -fPIC
gcc -m64 -shared -fPIC -o libtest.so test.o -lpthread -lrt -lcuda -lcudart -L/opt/cuda/lib64
结果libtest.so
导出了我需要的所有符号。
我现在编译我的纯 Cmain.c
并将其链接到我的库:
gcc -std=c99 main.c -o main -lpthread -ltest -L.
这一步也是成功的,但是在执行./main
所有被调用的 CUDA 函数时都会返回错误:
test.cu:17:cError(): cudaGetDeviceCount: [38] no CUDA-capable device is detected
test.cu:17:cError(): cudaMalloc: [38] no CUDA-capable device is detected
test.cu:17:cError(): cudaMemcpy: [38] no CUDA-capable device is detected
test.cu:17:cError(): cudaMemcpy: [38] no CUDA-capable device is detected
test.cu:17:cError(): cudaFree: [38] no CUDA-capable device is detected
(错误消息是通过我自己的调试功能创建的)
在我最初的步骤中,我遇到了完全相同的问题,因为我是直接从 中创建可执行文件test.cu
,因为我忘记链接 libpthread ( -lpthread
)。但是,正如您在上面看到的,我已经将所有源文件链接到 libpthread。根据ldd
,两者都libtest.so
依赖main
于 libpthread,因为它应该是。
我在 ArchLinux 上使用 CUDA 5(是的,我确实意识到它是一个测试版)和 gcc 4.6.3 和 nvidia 驱动程序版本 302.06.03。
解决这个问题的一些帮助将不胜感激!