我想知道,cuda 4.0支持遞歸使用本地內存或共享內存?我必須自己維護一個使用全局內存的堆棧,因爲系統級遞歸不能支持我的程序(可能遞歸的級別太多)。當遞歸變得更深時,線程停止工作。
所以我真的很想知道CUDA中的默認遞歸是如何工作的,它是否使用共享內存的本地內存?謝謝!如何cuda 4.0支持遞歸
3
A
回答
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。
相關問題
- 1. CUDA是否支持遞歸?
- 2. 遞歸支持
- 3. Tensorflow如何支持Cuda流?
- 4. ng-repeat支持遞歸嗎?
- 5. CUDA __syncthreads()和遞歸
- 6. 支持Android 4.0
- 7. 如何在CUDA上實現深遞歸
- 8. 對遞歸註釋的語言支持
- 9. 如何解析Android 4.0支持的xml?
- 10. sscanf()是否支持「遞歸」緩衝區?
- 11. 支持CUDA的設備
- 12. 叮噹中的CUDA支持
- 13. 如何在解析xml時支持遞歸包括
- 14. 如何開發對遞歸捆綁產品的支持?
- 15. CoreBluetooth僅支持藍牙4.0?
- 16. .net 4.0仍然支持asmx
- 17. 支持.NET 4.0中的DEVPATH
- 18. NHibernate支持.NET 4.0框架?
- 19. SPYDER和IPython 4.0支持
- 20. 當使用支持CUDA的OpenCV編譯ROS節點時,沒有CUDA支持
- 21. CUDA 4.0 vs 3.2
- 22. 如何創建分支遞歸?
- 23. 我如何遞歸遞歸?
- 24. MySQL不支持遞歸函數?爲什麼?從何時起?
- 25. 是否有任何數據庫支持相互遞歸查詢
- 26. Opencv錯誤:不支持GPU(庫不支持CUDA編譯)
- 27. cuda中的遞歸/堆棧和隊列
- 28. 使用CUDA計算遞歸數組
- 29. 如何編寫CUDA代碼來打印出支持CUDA的設備?
- 30. CUDA 4.0 - cudaHostUnregister很慢
都沒有。在支持它的硬件上,堆棧幀將分配在專用的運行時堆上。 – talonmies
prsent問題似乎與這一個部分多餘:http://stackoverflow.com/questions/7810740/where-does-cuda-allocate-the-stack-frame-for-kernels。使用遞歸需要使用ABI,這需要體系結構> = sm_20。 ABI具有函數調用約定,包括使用堆棧幀。堆棧幀被分配在本地存儲器中(「本地」表示「線程本地」,即線程專用)。對於深度遞歸函數,可能會耗盡堆棧。有一個CUD API來增加堆棧的大小,但是我不知道它在我頭頂。 – njuffa
設置堆棧大小的函數是cudaDeviceSetLimit()。請參閱http://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__DEVICE.html#group__CUDART__DEVICE_1gb8a22e29cc297634b0702db0b69f59e7 – njuffa