创建CUDA共享库和libpthread的问题

时间:2012-08-09 14:22:43

标签: gcc linker cuda pthreads ld

我目前正在尝试使用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导出我需要的所有符号。

我现在编译纯粹的C main.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相关联。根据{{​​1}},lddlibtest.so都应该依赖于libpthread。

我在ArchLinux上使用gcc 4.6.3和nvidia驱动程序版本302.06.03使用CUDA 5(是的,我确实认为它是测试版)。

解决这个问题的一些帮助将不仅仅是值得赞赏的!

1 个答案:

答案 0 :(得分:4)

这是一个微不足道的例子......

// File: test.cu
#include <stdio.h>

__global__ void myk(void)
{
    printf("Hello from thread %d block %d\n", threadIdx.x, blockIdx.x);
}

extern "C"
void entry(void)
{
    myk<<<1,1>>>();
    printf("CUDA status: %d\n", cudaDeviceSynchronize());
}

编译/链接nvcc -m64 -arch=sm_20 -o libtest.so --shared -Xcompiler -fPIC test.cu

// File: main.c
#include <stdio.h>

void entry(void);

int main(void)
{
    entry();
}

编译/链接gcc -std=c99 -o main -L. -ltest main.c