2013-09-25 76 views
3

我想知道,cuda 4.0支持遞歸使用本地內存或共享內存?我必須自己維護一個使用全局內存的堆棧,因爲系統級遞歸不能支持我的程序(可能遞歸的級別太多)。當遞歸變得更深時,線程停止工作。
所以我真的很想知道CUDA中的默認遞歸是如何工作的,它是否使用共享內存的本地內存?謝謝!如何cuda 4.0支持遞歸

+0

都沒有。在支持它的硬件上,堆棧幀將分配在專用的運行時堆上。 – talonmies

+0

prsent問題似乎與這一個部分多餘:http://stackoverflow.com/questions/7810740/where-does-cuda-allocate-the-stack-frame-for-kernels。使用遞歸需要使用ABI,這需要體系結構> = sm_20。 ABI具有函數調用約定,包括使用堆棧幀。堆棧幀被分配在本地存儲器中(「本地」表示「線程本地」,即線程專用)。對於深度遞歸函數,可能會耗盡堆棧。有一個CUD API來增加堆棧的大小,但是我不知道它在我頭頂。 – njuffa

+0

設置堆棧大小的函數是cudaDeviceSetLimit()。請參閱http://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__DEVICE.html#group__CUDART__DEVICE_1gb8a22e29cc297634b0702db0b69f59e7 – njuffa

回答

11

遞歸的使用需要使用ABI,這需要體系結構> = sm_20。 ABI有一個函數調用約定,包括使用堆棧幀。堆棧幀分配在本地內存中(「本地」表示「線程本地」,即線程專用的存儲器)。有關CUDA內存空間的基本信息,請參閱CUDA C編程指南。另外,您可能需要查看以前的這個問題:Where does CUDA allocate the stack frame for kernels?

對於深度遞歸函數,可能會超出默認堆棧大小。例如,在我目前的系統上,默認堆棧大小爲1024字節。您可以通過CUDA API函數cudaDeviceGetLimit()檢索當前的堆棧大小。你可以通過CUDA API函數cudaDeviceSetLimit()調整的堆棧大小:

cudaError_t stat; 
size_t myStackSize = [your preferred stack size]; 
stat = cudaDeviceSetLimit (cudaLimitStackSize, myStackSize); 

注意的存儲器所需的堆棧幀的總量爲至少每線程大小乘以在指定的線程數內核啓動。由於分配粒度的緣故,它通常會更大。所以增加堆棧大小可以很快消耗內存,並且您可能會發現深度遞歸功能需要的本地內存比可以在GPU上分配的要多。

儘管現代GPU支持遞歸,但由於函數調用的開銷,它的使用會導致性能相當低的代碼,因此您可能需要檢查是否存在迭代版本的算法,可能會更好適合GPU。