我目前正在嘗試使用CUDA例程創建庫,但我遇到了麻煩。我會用一個相當簡單的例子來解釋我的問題,我的實際庫會更大。創建CUDA共享庫和libpthread的問題
我已經成功地編寫了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
出口我所有需要的符號。
現在我編譯我的純粹ç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
,libtest.so
和main
都依賴於libpthread,因爲它應該是。
我在ArchLinux上使用gcc 4.6.3和nvidia驅動程序版本302.06.03使用CUDA 5(是的,我意識到它是一個測試版)。
有些幫助解決這個問題將不勝感激!
您確定這不僅僅是一個線程關聯問題嗎?無論哪個線程在設備上創建/保存上下文是唯一可以使用該設備的線程。如果您希望多個線程使用上下文,則需要使用上下文遷移API。 – talonmies 2012-08-09 14:50:23
因爲我不是分手或任何東西,如果我沒有大錯特錯的話,應該只有一個線程。 – Sarek 2012-08-09 15:14:07
不好意思問這個顯而易見的問題,但是你有一個支持CUDA的設備嗎?你有沒有檢查過其他CUDA代碼可以與相同的工具包/驅動程序兼容? – Tom 2012-08-10 11:42:41