2012-10-09 44 views
4

根據CUDA 5.0編程指南,如果我同時使用L1和L2高速緩存(在費米或開普勒上),所有全局內存操作都是使用128字節內存事務完成的。但是,如果我僅使用L2,則將使用32字節的內存事務(章節F.4.2)。CUDA全局內存事務的成本

讓我們假設所有緩存都是空的。如果我有一個warp,每個線程以完全對齊的方式訪問單個4字節字,這將導致L1 + L2情況下的1x128B事務,以及L2情況下的4x32B事務。是對的嗎?

我的問題是 - 4 32B交易是否比單個128B交易慢? 我對費米前硬件的直覺表明它會變慢,但也許這在新硬件上不再是真的?或者,也許我應該看看帶寬利用率來判斷我的內存訪問效率?

回答

5

是的,在高速緩存模式下,將生成一個128byte事務(從L1高速緩存級別看)。在非高速緩存模式下,將生成四個32byte事務(從L2高速緩存級別看 - 它仍然是單個)在你描述的情況下,對於完全合併的訪問,四個32字節的事務不會更慢,無論緩存模式還是非緩存模式。內存控制器(在給定的GPU上)應該生成相同的事務以滿足任何情況下的warp請求。由於內存控制器由多個(最多6個)「分區」組成,每個分區具有64位寬的路徑,因此最終會使用多個內存事務(可能會跨越多個分區)來滿足請求(4x32byte或1x128byte)。不同分區之間的交易和組織的具體數量可能因GPU而異(並不是你的問題的一部分,但帶有DDR內存的GPU將在每個內存事務中爲每個分區返回16字節,並且使用QDR抽取的內存,每個內存事務每個分區將返回32bytes)。這不是CUDA 5特有的。您可能需要查看此材料的NVIDIA®webinars之一,特別是「CUDA優化:內存帶寬有限的內核」。即使你不想看video,快速瀏覽slides也會提醒你所謂的「緩存」和「非緩存」訪問(這是指L1)之間的各種差異,並且還會給你提供編譯器開關需要嘗試每種情況。

查看幻燈片的另一個原因是它會提醒您在什麼情況下您可能想嘗試「未緩存」模式。特別是,如果您的經線有分散(未合併)的訪問模式,則非緩存模式訪問可能會產生改進,因爲從內存請求32字節數量以滿足單線程請求時的「浪費」較少,而128字節數量。但是,爲了迴應您的最終問題,對其進行分析相當困難,因爲大概您的代碼是有序和無序訪問模式的混合。由於通過編譯器開關打開了非緩存模式,幻燈片中給出的建議僅僅是「雙向嘗試您的代碼」並查看哪個運行更快。根據我的經驗,以非緩存模式運行很少產生性能改進。

編輯:對不起,我有錯誤的演示文稿的鏈接和標題。修復幻燈片/視頻鏈接和網絡研討會的標題。

+3

與L1對齊的,合併的32位加載請求爲128字節。如果L1中的加載請求未命中,則L1將向L2發出4個32字節的加載請求。所有L2事務都是32字節。高速緩存運算符可以使用內聯PTX以每條指令爲基礎進行控制。 –