2012-04-16 221 views
1

我正在嘗試使用CUDA 2.0(NVIDIA 590)處理大型結構陣列。我想爲它使用共享內存。我嘗試過使用CUDA佔用計算器,試圖爲每個線程分配最大共享內存,以便每個線程都可以處理整個數組元素。 然而,在100%多處理器加載的計算器中,可以看到每個塊的共享內存(每塊的共享內存)/(每塊的線程數)爲32個字節,這對於單個元素(數量級)是不夠的。 對於(每個塊的共享內存)/(每個塊的線程),最大可能值爲32個字節? 是否可以說哪個alter4native更可取 - 在全局內存中分配數組的一部分,還是隻使用欠載的多處理器?或者它只能由實驗決定? 我能看到的另一種選擇是以幾次傳遞處理數組,但它看起來像是最後的手段。 這是我第一次嘗試一些非常複雜的CUDA,所以我可能會錯過一些其他選項......CUDA中的最大值(每塊的共享內存)/(CUDA中的線程),100%MP負載

回答

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

確保您使用的內核設計具有最佳性能的唯一方法是測試所有可能性。而且您需要爲每種類型的設備重新進行性能測試,因爲它們在某些方面都有不同的限制。這顯然可能很乏味,特別是當不同的設計模式導致根本不同的內核時。我在某種程度上通過使用模板引擎根據設備硬件規格在運行時動態生成內核來解決這個問題,但它仍然有點麻煩。

+0

謝謝,那次演講幾乎回答了我的疑問 – mirror2image 2012-04-16 15:23:16