2013-05-31 45 views
1

我運行CentOS版本5.9(最終)與CUDA,有一個特斯拉卡主要版本1和小版本3.以下是我的內核代碼:NVCC拒絕我使用malloc()在內核代碼的

__global__ void foo(int* pos, int t) 
{ 
    int index = blockDim.x * blockIdx.x + threadIdx.x; 
    t = pos [index + 1] - pos [index]; 
    char* temp = (char*)malloc(t); 
} 

我想動態分配t字節。

這給我的錯誤:

calling a host function("malloc") from a __device__/__global__ function("foo") is not allowed.

我能做些什麼來解決這個問題?

+0

請提供一個實際產生上述錯誤的例子,以及如何編譯它。您的問題中的代碼不會編譯,但由於括號不平衡。此外,CC 1.3的設備不支持內核內存分配;你至少需要CC 2.0。另外,爲了從內核分配內存,你應該調用'malloc',而不是'cudaMalloc'(儘管根據你的錯誤信息,這就是你在實際代碼中所做的)。 – aland

+0

謝謝你的指導 所以,你可以建議我任何解決同一個問題的另一種解決方案。 – sdy

回答

2

由於您使用的是計算1.3設備,因此不支持內核malloc和C++ new運算符(這在CUDA C編程指南中有明確說明)。

您的唯一選擇是要麼使用主機端內存分配(這將需要最小的最大值* *在GPU上啓動的線程數)預先分配全局內存區域。該內存既可以作爲命令參數傳遞,也可以寫入內核可以讀取的常量內存指針。您也可以將temp聲明爲內核中靜態大小的本地內存數組。如果事實證明你需要一個相對較小且先驗已知的值max(t),那麼模板化內核通過max(t)作爲模板參數可能會帶來性能優勢。

+0

感謝您的寶貴信息.. – sdy