GPU程式設計

在CUDA中,將__syncthreads()寫在「if (threadIdx.x < 16)」之內,使只有部分執行緒會通過。下列何者是可能發生的情況?

  1. A僅16個執行緒完成同步,可正確運作
  2. B由於其他執行緒永遠不會抵達,區塊會停住,或結果變得不確定
  3. C__syncthreads()會被自動忽略,因此什麼事都不會發生
查看答案與解析

正確答案:B. 由於其他執行緒永遠不會抵達,區塊會停住,或結果變得不確定

__syncthreads()會等待區塊中所有執行緒抵達,因此若寫在只有部分執行緒會通過的分支內,就會有等不到的執行緒。規格中未定義其行為,實際上可能會停住,或即使碰巧能運作,結果也會出錯。原則是將同步寫在分支之外、所有執行緒必定會通過的位置。

  • A. 這是會等待區塊全員抵達的指令。
  • B. 正確。必須寫在區塊全員都會通過的位置。
  • C. 不會被忽略。
練習這個領域 前往領域頁面

GPU程式設計的其他題目

  1. 關於CUDA共享記憶體的記憶庫衝突(bank conflict),下列說明何者正確?
  2. 將32×32的float表格放在共享記憶體中,由線程束的32個執行緒沿著行的方向(縱向)讀取時會發生記憶庫衝突。下列何者是常用的對策?
  3. 以GPU計算大型矩陣的乘積時,將矩陣分成小的圖塊(tile)讀入共享記憶體,其理由下列何者正確?
  4. 在GPU核心函式中,若每個執行緒的暫存器使用量過多,下列何者是可能發生的情況?
  5. 關於GPU的佔用率(occupancy),下列說明何者正確?

這個領域的比較