2

現在、CUDAルーチンを使用してライブラリを作成しようとしていますが、問題が発生しています。かなり最小限の例を使用して問題を説明します。実際のライブラリは大きくなります。

CUDA関数とそのラッパー(メモリの割り当てとコピー)test.cuを含むソースファイルを正常に作成しました。__global__次のコマンドを使用して、このファイルを共有ライブラリに正常にコンパイルすることもできます。

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.culibpthread()に対してリンクするのを忘れたため、最初の手順で、から実行可能ファイルを直接作成していたのとまったく同じ問題が発生しました-lpthread。しかし、上で見ることができるように、私はすべてのソースファイルをlibpthreadに対してリンクしました。によるとldd、とは両方ともlibpthreadlibtest.somain依存しています。

ArchLinuxでgcc4.6.3とnvidiaドライバーバージョン302.06.03でCUDA5を使用しています(はい、ベータ版であることに気づいています)。

この問題を解決するためのいくつかの助けをいただければ幸いです。

4

1 に答える 1

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ます。

于 2012-08-10T19:14:16.950 に答える