我正在嘗試使用CUDA 2.0(NVIDIA 590)處理大型結構陣列。我想爲它使用共享內存。我嘗試過使用CUDA佔用計算器,試圖爲每個線程分配最大共享內存,以便每個線程都可以處理整個數組元素。 然而,在100%多處理器加載的計算器中,可以看到每個塊的共享內存(每塊的共享內存)/(每塊的線程數)爲32個字節,這對於單個元素(數量級)是不夠的。 對於(每個塊的共享內存)/(每個塊的線程),最大可能值爲32個字節? 是否可以說哪個alter4native更可取 - 在全局內存中分配數組的一部分,還是隻使用欠載的多處理器?或者它只能由實驗決定? 我能看到的另一種選擇是以幾次傳遞處理數組,但它看起來像是最後的手段。 這是我第一次嘗試一些非常複雜的CUDA,所以我可能會錯過一些其他選項......CUDA中的最大值(每塊的共享內存)/(CUDA中的線程),100%MP負載
1
A
回答
6
在設計CUDA內核時,需要記住許多硬件限制。這裏有一些約束,你需要考慮:
- ,你可以在一個單一的塊運行的最大線程數
- 你可以在流多一次
- 的最大數量加載模塊的最大數量每流多寄存器
- 每流多
無論你先出手這些限制共享內存最大量成爲限制你的通訊中斷約束pancy(最大佔用率是指「100%多處理器負載」?)。一旦你達到某個入住門檻,注意入住就變得不那麼重要了。例如,佔用33%並不意味着你只能達到GPU最大理論性能的33%。瓦西里沃爾科夫在2010年GPU技術大會上發表了一場精彩的演講,建議不要過多擔心佔用情況,而應儘量通過在內核中使用一些明確的緩存技巧(和其他內容)來儘量減少內存交易。您可以在這裏觀看演講:http://www.gputechconf.com/gtcnew/on-demand-GTC.php?sessionTopic=25&searchByKeyword=occupancy&submit=&select=+&sessionEvent=&sessionYear=&sessionFormat=#193
確保您使用的內核設計具有最佳性能的唯一方法是測試所有可能性。而且您需要爲每種類型的設備重新進行性能測試,因爲它們在某些方面都有不同的限制。這顯然可能很乏味,特別是當不同的設計模式導致根本不同的內核時。我在某種程度上通過使用模板引擎根據設備硬件規格在運行時動態生成內核來解決這個問題,但它仍然有點麻煩。
相關問題
- 1. CUDA共享內存
- 2. Cuda內存在每個線程中共享
- 3. CUDA在共享內存中找到最大值
- 4. CUDA中的全局vs共享內存
- 5. cuda:線程塊之間共享'常量'
- 6. CUDA共享內存佔用
- 7. CUDA:共享內存分配
- 8. cuda共享內存覆蓋?
- 9. 線程之間的CUDA共享對象
- 10. 每個網格的最大塊數:CUDA
- 11. 本地內存比CUDA中的共享內存慢嗎?
- 12. CUDA每個線程的最大寄存器數:sm_12 vs sm_20
- 13. 可存放在共享內存中的數據量CUDA
- 14. cuda nbody模擬 - 共享內存問題
- 15. 銀行衝突CUDA共享內存?
- 16. 何時使用volatile共享CUDA內存
- 17. 複製到cuda中的共享內存中
- 18. CUDA中的共享內存上的原子操作
- 19. CUDA非法內存訪問可能'不足'的共享內存
- 20. 可以兩個進程共享相同的GPU內存嗎? (CUDA)
- 21. CUDA,在共享memroy
- 22. CUDA:線程中的更大問題
- 23. CUDA:通過大型2D陣列共享內存
- 24. CUDA共享內存大小意味着什麼
- 25. CUDA的MEMCHECK未出界的報告共享內存訪問
- 26. 每個CUDA線程的本地內存量
- 27. 特斯拉M2050上CUDA內核的最大線程數
- 28. CUDA超過最大線程無錯誤?
- 29. CUDA 2D,3D線程塊
- 30. 使用Compute Prof(Cuda/OpenCL)爲每個塊靜態分配共享內存的大小
謝謝,那次演講幾乎回答了我的疑問 – mirror2image 2012-04-16 15:23:16