GPU程式設計

將32×32的float表格放在共享記憶體中,由線程束的32個執行緒沿著行的方向(縱向)讀取時會發生記憶庫衝突。下列何者是常用的對策?

  1. A表格維持32×32,將讀取的順序改為隨機
  2. B不再使用共享記憶體,全部從全域記憶體讀取
  3. C將表格如32×33般多配置一欄,使每一列的記憶庫位置錯開
查看答案與解析

正確答案:C. 將表格如32×33般多配置一欄,使每一列的記憶庫位置錯開

若一列有32個float(128位元組),每一列都從同一個記憶庫開始,因此同一欄的元素全都落在同一個記憶庫,縱向讀取時32個執行緒會集中到一個記憶庫。若將一列改為33個,每前進一列記憶庫就會錯開一個,同一欄的32個元素便會全部分散到不同的記憶庫,一次即可讀完。這只是多加一欄用不到的記憶體,是個簡單的做法。

  • A. 即使隨機化,衝突也不會減少。
  • B. 全域記憶體慢得多,因此適得其反。
  • C. 正確。以填補(padding)消除衝突。
練習這個領域 前往領域頁面

GPU程式設計的其他題目

  1. 以GPU計算大型矩陣的乘積時,將矩陣分成小的圖塊(tile)讀入共享記憶體,其理由下列何者正確?
  2. 在GPU核心函式中,若每個執行緒的暫存器使用量過多,下列何者是可能發生的情況?
  3. 關於GPU的佔用率(occupancy),下列說明何者正確?
  4. 下列何者是GPU隱藏記憶體長延遲(數百個時脈)的主要方法?
  5. 關於GPU的佔用率,下列何者正確?

這個領域的比較