GPU程式設計

上述的(1)與(2)都是讓一半的執行緒執行A、其餘執行B。就線程束的效率而言,下列何者說明正確(設1個線程束為32個執行緒)?

if (threadIdx.x % 2 == 0) A(); else B();   // (1)
if ((threadIdx.x / 32) % 2 == 0) A(); else B();   // (2)
  1. A(1)的分支一致,因此效率較佳
  2. B(1)在所有線程束內分支都會分歧,而(2)在每個線程束內是一致的,因此(2)的效率較佳
  3. C兩者的效率完全相同
查看答案與解析

正確答案:B. (1)在所有線程束內分支都會分歧,而(2)在每個線程束內是一致的,因此(2)的效率較佳

(1)以偶數與奇數的執行緒來區分,因此任何一個線程束內都混有A側與B側的執行緒,所有線程束都得依序執行A與B。(2)則以執行緒編號除以32的值來區分,因此一個線程束的32個執行緒全都在同一側,每個線程束只會執行A或B其中之一。即使是相同的工作,只要讓條件以線程束為單位趨於一致,發散就會消失。

  • A. (1)在相鄰的執行緒之間條件就會改變。
  • B. 正確。讓分支條件以線程束為單位趨於一致,就是改善的方法。
  • C. 有無發散會造成很大的差異。
練習這個領域 前往領域頁面

GPU程式設計的其他題目

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

這個領域的比較