GPU程式設計

在一個線程束中,因條件分支使一半的執行緒走if側、另一半走else側(線程束發散,warp divergence)。一般會如何執行?

  1. A兩側同時執行,因此速度不變
  2. Belse側的執行緒不會被執行而遭捨棄
  3. C依序執行if側與else側,各自執行期間不符合的執行緒會閒置,因此效率下降
查看答案與解析

正確答案:C. 依序執行if側與else側,各自執行期間不符合的執行緒會閒置,因此效率下降

線程束的32個執行緒執行相同指令,因此分支一旦分歧,會先僅讓if側的執行緒有效並執行if側的指令,接著再以其餘執行緒執行else側。結果雖然正確,但各自執行期間有一半的執行緒什麼都沒做,所以時間會是兩條路徑的總和。若能調整資料或執行緒的排列方式,讓線程束內的分支趨於一致,效率就會提升。

  • A. 一個線程束同一時間只會執行一個指令。
  • B. 兩邊的執行緒都會被正確執行。
  • C. 正確。需要兩條路徑的時間。
練習這個領域 前往領域頁面

GPU程式設計的其他題目

  1. 上述的(1)與(2)都是讓一半的執行緒執行A、其餘執行B。就線程束的效率而言,下列何者說明正確(設1個線程束為32個執行緒)?
  2. 關於GPU的記憶體合併存取(coalescing),下列說明何者正確?
  3. 設各執行緒的編號為i,如上式每隔32個元素讀取陣列,會比讀取a[i]時更慢。主要原因為下列何者?
  4. 以GPU處理具有粒子位置x、y、z的資料時,就記憶體合併存取而言,下列何種排列方式較有利?
  5. 關於CUDA共享記憶體(shared memory)的特徵,下列何者正確?

這個領域的比較