2012-08-09 16 views
2

我目前正在嘗試使用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鏈接起來。根據lddlibtest.somain都依賴於libpthread,因爲它應該是。

我在ArchLinux上使用gcc 4.6.3和nvidia驅動程序版本302.06.03使用CUDA 5(是的,我意識到它是一個測試版)。

有些幫助解決這個問題將不勝感激!

+2

您確定這不僅僅是一個線程關聯問題嗎?無論哪個線程在設備上創建/保存上下文是唯一可以使用該設備的線程。如果您希望多個線程使用上下文,則需要使用上下文遷移API。 – talonmies 2012-08-09 14:50:23

+0

因爲我不是分手或任何東西,如果我沒有大錯特錯的話,應該只有一個線程。 – Sarek 2012-08-09 15:14:07

+0

不好意思問這個顯而易見的問題,但是你有一個支持CUDA的設備嗎?你有沒有檢查過其他CUDA代碼可以與相同的工具包/驅動程序兼容? – Tom 2012-08-10 11:42:41

回答

4

這裏有一個簡單的例子......與nvcc -m64 -arch=sm_20 -o libtest.so --shared -Xcompiler -fPIC test.cu

// 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()); 
} 

編譯/鏈接。

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

void entry(void); 

int main(void) 
{ 
    entry(); 
} 

編譯/鏈接gcc -std=c99 -o main -L. -ltest main.c

+0

我試過了,但它不起作用。標準輸出上沒有任何內容。我還增加了'entry()'函數來打印'cudaDeviceSynchronize()'的返回值,這與我自己的例子(38)相同,這意味着不能找到具有CUDA功能的設備。 – Sarek 2012-08-13 13:29:20

+0

順便說一句,我的例子假設你有一個費米設備或更新 - 舊設備不支持設備printf。如果你的設備是費米或開普勒,那麼如果其他CUDA代碼工作,那麼這是不應該的。您使用的是不受支持的發行版/ GCC,因此在庫或鏈接步驟中可能會出現一些奇怪現象,但不知道是什麼。你可以嘗試一箇舊的GCC或不同的發行版嗎? – Tom 2012-08-14 08:00:47

+0

我有一個費米設備(GeForce 560 Ti,GF114)。用另一個發行版進行測試會有點困難,但我現在要安裝gcc 4.5並再次測試。 – Sarek 2012-08-14 14:53:21