GPU程式設計
將32×32的float表格放在共享記憶體中,由線程束的32個執行緒沿著行的方向(縱向)讀取時會發生記憶庫衝突。下列何者是常用的對策?
- A表格維持32×32,將讀取的順序改為隨機
- B不再使用共享記憶體,全部從全域記憶體讀取
- C將表格如32×33般多配置一欄,使每一列的記憶庫位置錯開
查看答案與解析
正確答案:C. 將表格如32×33般多配置一欄,使每一列的記憶庫位置錯開
若一列有32個float(128位元組),每一列都從同一個記憶庫開始,因此同一欄的元素全都落在同一個記憶庫,縱向讀取時32個執行緒會集中到一個記憶庫。若將一列改為33個,每前進一列記憶庫就會錯開一個,同一欄的32個元素便會全部分散到不同的記憶庫,一次即可讀完。這只是多加一欄用不到的記憶體,是個簡單的做法。
- A. 即使隨機化,衝突也不會減少。
- B. 全域記憶體慢得多,因此適得其反。
- C. 正確。以填補(padding)消除衝突。