讓我們假設我們有16個線程運行在塊1上,另外16個線程運行在塊2上。在CUDA中跨塊合併訪問?
每個線程從內存中讀取1個double:塊1上的16個線程需要從內存地址讀取16個雙精度0-塊2上的127和16個線程需要從地址128-255中讀取。
我知道在塊1上的16個線程的內存讀取可以在一個內存事務中完成,因爲這些內存事務是通過合併訪問來完成的。
我的問題是,當我們考慮這兩個塊時,我們需要一個或兩個內存事務?換句話說,不同塊的內存訪問是否同時發生?
讓我們假設我們有16個線程運行在塊1上,另外16個線程運行在塊2上。在CUDA中跨塊合併訪問?
每個線程從內存中讀取1個double:塊1上的16個線程需要從內存地址讀取16個雙精度0-塊2上的127和16個線程需要從地址128-255中讀取。
我知道在塊1上的16個線程的內存讀取可以在一個內存事務中完成,因爲這些內存事務是通過合併訪問來完成的。
我的問題是,當我們考慮這兩個塊時,我們需要一個或兩個內存事務?換句話說,不同塊的內存訪問是否同時發生?
塊是完全獨立的 - 硬件可以選擇(也可能 - 將)在不同的多處理器上啓動它們。
來自不同塊的線程將在不同的線程中運行。因此不可能在它們之間合併存儲器訪問。
您至少需要兩次內存事務。確保每個塊的線程將在不同的線程中處理。
此外,即使線程已經形成一個warp或者佔用了相同的多處理器和共享L1緩存,因此warp中的地址被轉換爲128B或32B的行(取決於緩存/非緩存模式)緩存模式下,您至少需要2個事務,並且在非緩存模式8個事務的情況下。看看this非常有用的演示文稿,以更好地理解全局內存訪問。
此外,在您描述的場景中沒有任何好處。合併擴展到L1高速緩存行大小的最大值,即128字節。兩個128字節的請求將在兩個事務中處理,無論它們是從一個塊還是兩個塊開始。讀取對齊的相鄰雙打的16個線程將爲您提供可能的最大聯合收益。 – 2013-02-27 23:46:05