2011-05-17 17 views
0

嘿, 假設我有一個問題,每個線程都會計算某些內容(從常量內存中讀取一些參數並將它們用於計算)並將其存儲到全局內存矩陣中。這個矩陣永遠不會被讀取,只是寫入訪問...現在是否有任何感覺先使用共享內存來存儲所有計算的值,然後再將它們寫入全局內存?我認爲不是,因爲對全局內存的寫入保持完全一樣,所以對共享內存的寫入只是增加了我之前已經寫入的內容...... 謝謝!關於CUDA內存訪問的簡短提問

回答

3

取決於內核代碼中的訪問模式,可以有。使用共享內存緩衝區來「分級」輸出可能是確保寫入合併的有效方式,當天真寫入不會合並時。這對於CUDA兼容硬件(G80/G90)的前幾代性能非常重要。在較新的硬件中,這種情況不那麼強烈。費米卡有一個非常有效的L1和L2緩存方案,它可以(在合理的範圍內)接近以前只能使用共享內存而無需任何額外代碼才能實現的方案。

對這個問題並沒有真正的普遍答案,因爲它取決於任何給定代碼所做的很多具體細節,以及它期望運行良好的目標硬件。

+0

好的,謝謝,是的,合併訪問是我到目前爲止還不瞭解的東西......既不是在編程指南中,也不是在書中的「cuda by example」。網上有關於這個話題的簡單解釋嗎?你能否告訴我,在Fermi架構的GTX 460上需要做內存訪問合併?! – tim 2011-05-17 10:32:06

+0

@Col Heather:對於當前CUDA編程指南附錄G中每種NVIDIA GPU支持的合併規則和事務大小,有一個非常清晰的解釋,並附有圖表。我無法真正告訴你是否在運行代碼的硬件上需要它,因爲我無法訪問它。 – talonmies 2011-05-17 10:41:40