我正在開發一個使用CUDA的小應用程序。
我有一個巨大的2D數組(不適合共享內存),其中所有塊中的線程都會從隨機位置不斷讀取。
這個2d數組是一個只讀數組。
我應該在哪裏分配這個2d數組?全局內存?常量memroy?紋理內存?Cuda不同的內存分配
回答
根據設備紋理內存的大小,您應該在該區域實現它。事實上,紋理內存是基於順序局部高速緩存機制。這意味着,當連續標識符的線程嘗試到達相對靠近的存儲位置內的數據元素時,內存訪問得到優化。此外,本地實現2D訪問。因此,當每個線程到達存儲在紋理存儲器中的數組的數據元素時,就會遇到連續的2D訪問。因此,您充分利用了內存架構。
不幸的是,這個內存並不是那麼大,而且有着巨大的數組,你可能會使你的數據適合它。在這種情況下,您無法避免使用全局內存。
這個問題是具體的......「隨機的地方」。這對緩存來說不是好消息! – jmilloy 2010-12-09 05:03:26
沒錯,但是我們可以很容易地認爲將數據放置在紋理內存中是值得的,因爲它只需要在緩存未命中時花費相當於從設備內存中讀取數據!因此,即使隨機訪問,您肯定會到達緩存元素並從紋理緩存中受益。 – jopasserat 2010-12-09 08:47:17
如果它足夠小以適應它的不變或紋理,我會嘗試所有三種。
這裏沒有列出的一個有趣的選項是映射主機上的內存。您可以在可從設備訪問的主機上分配內存,而無需將其顯式傳輸到設備內存。根據您需要訪問的數組量,它可能比複製到全局內存和從那裏讀取更快。
我同意jHackTheRipper,一個簡單的解決方案是使用紋理內存,然後使用Compute Visual Profiler進行配置文件。下面是關於圖像卷積的不同存儲器類型的good set of slides from NVIDIA;它表明良好的共享內存使用率和全局讀取速度並不比使用紋理內存快得多。在你的情況下,你應該從texmemory中獲得一些你在訪問全局內存中的隨機值時通常不會獲得的聯合讀取。
- 1. CUDA:共享內存分配
- 2. CUDA內存分配性能
- 3. CUDA內核內部的內存分配
- 4. CUDA內存分配和訪問問題
- 5. 在CUDA設備中的內存分配不是預期的
- 6. Cuda的2D內存分配和複製問題
- 7. 在CUDA的設備內存上分配二維數組
- 8. cuda gpu釋放通過cudaMemcpyToSymbol分配的內存
- 9. CUDA:具有重疊邊框的共享內存分配
- 10. CUDA中的常量內存動態分配
- 11. NSDate的不同實例指向相同的分配內存?
- 12. 內存不重新分配
- 13. CUDA - 我必須每次都分配和釋放內存嗎?
- 14. Cuda內存錯誤(分配和複製成功)
- 15. CUDA內存分配用於主機和設備
- 16. CUDA在哪裏申明共享內存分配常量
- 17. CUDA:在不同內核之間使用共享內存
- 18. 內存分配
- 19. 內存分配
- 20. 內存分配
- 21. 內存分配
- 22. 內存分配
- 23. 內存分配
- 24. 內存分配
- 25. 內存分配
- 26. 分配內存
- 27. 內存分配
- 28. CUDA線程分配
- 29. CUDA紋理內存綁定全局內存的子部分
- 30. 動態內存分配不匹配
我確定你知道,但隨機讀取不是應用CUDA的最佳位置。紋理針對空間局部進行了優化,但如果您的閱讀是隨機的,則沒有空間局部性。基於這一點,我會與全球...但你可能看不到任何基於訪問模式的CPU執行速度增加。 – Marm0t 2010-12-09 22:33:19