CUDA 共享內存的 Bank Conflict 實例分析與優化
引言
cuda?將 shared memory 按照 4 字節或 8 字節(默認 4 字節,可以設置為 8 字節)被劃分到 32 個 bank (樓)中,不同?bank 之間的內存能同時讀寫,但是同一個 bank 的不同地址(同一棟樓的不同層)的數據則只能串行讀寫(如果是同一個 bank 的同一個地址則可以?broadcast,不會出現 bank conflict),因此當同一個 warp 的線程去訪問 shared memory 數據時,如果有兩個以上線程訪問了同一個 bank 的不同地址的數據,就會產生多余的內存事務(transaction)請求(后面有具體實例圖示)影響程序的性能.
假設在共享內存上申請了 1024 個 float 數據 ——?__shared__? float data[32][32],由于每個 float 正好是 4 字節,且 data 按行存儲,則?data[0][0] 就位于第 0 個bank,data[0][1] 位于第 1 個 bank,以此類推?data[row][col] 就被劃分在了第 col 個 bank 中,即 col 相同的數據劃分至了同一個 bank 的不同地址上。如果一個 warp 的線程按 col 處理 data 那么就會造成 bank conflict.
任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。