現在、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.cu
libpthread()に対してリンクするのを忘れたため、最初の手順で、から実行可能ファイルを直接作成していたのとまったく同じ問題が発生しました-lpthread
。しかし、上で見ることができるように、私はすべてのソースファイルをlibpthreadに対してリンクしました。によるとldd
、とは両方ともlibpthreadlibtest.so
にmain
依存しています。
ArchLinuxでgcc4.6.3とnvidiaドライバーバージョン302.06.03でCUDA5を使用しています(はい、ベータ版であることに気づいています)。
この問題を解決するためのいくつかの助けをいただければ幸いです。