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)
- A(1)的分支一致,因此效率較佳
- B(1)在所有線程束內分支都會分歧,而(2)在每個線程束內是一致的,因此(2)的效率較佳
- C兩者的效率完全相同
查看答案與解析
正確答案:B. (1)在所有線程束內分支都會分歧,而(2)在每個線程束內是一致的,因此(2)的效率較佳
(1)以偶數與奇數的執行緒來區分,因此任何一個線程束內都混有A側與B側的執行緒,所有線程束都得依序執行A與B。(2)則以執行緒編號除以32的值來區分,因此一個線程束的32個執行緒全都在同一側,每個線程束只會執行A或B其中之一。即使是相同的工作,只要讓條件以線程束為單位趨於一致,發散就會消失。
- A. (1)在相鄰的執行緒之間條件就會改變。
- B. 正確。讓分支條件以線程束為單位趨於一致,就是改善的方法。
- C. 有無發散會造成很大的差異。