2017-08-17 89 views
4

切割性能我讀這篇文章:爲什麼一個「的if-else」語句(在GPU的代碼)將在半

FPGA or GPU? - The evolution continues

而且有人發表了評論,他寫道:

由於GPU是SIMD任何代碼用「的if-else」語句將削減一半的 性能。一半核心將執行 語句的if部分,而一半核心處於空閒狀態,然後另一半核心將執行其他計算,而核心的前一半 保持空閒狀態。

我不明白爲什麼?

爲什麼使用GPU(即OpenCL)使用if-else時性能會下降一半?

+0

GPU的設計本質上不利於枝術,你應該考慮調整你的代碼的這一特點。 – tibetty

回答

10

分行一般不會影響業績,但分行分歧呢。也就是說,兩條線程採用不同的路徑(例如一個滿足if條件,另一個不滿足)。由於GPU的所有線程都執行相同的「代碼行」,因此某些線程必須等待,而不是其路徑一部分的代碼纔會執行​​。
嗯,這是不是隻在一個經編(NVIDIA)或波陣面(AMD)執行相同的「行代碼」的所有線程真的。 (目前,NVIDIA GPU的扭曲大小爲32,AMD GPU的海平面大小爲64.)

因此,如果在內核中存在if-else塊,則最壞情況的性能確實會下降50%。甚至更糟糕:如果有可能的分支,則性能可以降低到沒有分歧的性能的1/n(即沒有分支或者經線/波陣面中的所有線程都採用相同的路徑)。當然,對於這種情況,您的整個內核必須嵌入在if-else(或switch)構造中。

但是,如上所述,只有在採用不同路徑的線程處於相同的warp/wafefront中時纔會發生這種情況。因此,編寫代碼/重新排列數據/選擇算法/ ...可以儘可能避免分支分歧。

T1; DR:可以有分支,但是如果不同的線程採用不同的分支,它們必須位於不同的彎曲/水平面以避免發散並因此導致性能損失。

+0

大多數時候,人們一讀到分歧就會害怕GPU上的分支。但是,大多數時候內核在最高性能上運行得並不快,但由於內存帶寬,共享內存或缺少可用的warp而限制了吞吐量。那麼分歧對績效影響很小。 –

+0

@JanLucas:你是對的,幾乎從未達到最佳表現,但分支分歧更糟糕。當然,對於可以在峯值性能附近運行的內核來說,性能的平分會導致更大的性能損失,但只能是絕對數量,而不是相對數量。我認爲更好的理由不用擔心分歧太多,通常情況下內核通常只在內核的一小部分內分裂成分支(例如,只有10%受分支影響,因此性能下降非常低) 。 – Shadow

+0

@JanLucas:但它從來都不是壞的去想分歧,因爲它往往齊頭並進一個壞的數據佈局,這導致未聚內存訪問以及爲此寶貴的內存帶寬的浪費。 – Shadow

相關問題