我读过这篇文章:
FPGA or GPU? - The evolution continues
有人在评论中写道:
由于GPU是SIMD,任何带有“if-else”语句的代码都会削减你的 表现一半。一半的核心将执行if的一部分 声明,而一半核心处于空闲状态,然后另一半处于空闲状态 核心将在核心的前半部分进行其他计算 保持闲置。
我无法理解为什么?
为什么在使用if-else
时使用GPU(即OpenCL),性能会降低一半?
答案 0 :(得分:13)
分支通常不会影响性能,但分支分歧会影响性能。也就是说,两个线程采用不同的路径(例如,一个满足if
条件,另一个不满足。因为GPU的所有线程都执行相同的代码行"某些线程必须等待执行不属于其路径的代码
嗯,这不是真的,因为只有一个warp(NVIDIA)或wavefront(AMD)中的所有线程执行相同的#34;代码行"。 (目前,NVIDIA GPU的warp大小为32,AMD GPU的wafefront大小为64.)
因此,如果内核中存在if-else
块,则最糟糕的情况是性能下降50%。更糟糕的是:如果有n
个可能的分支,性能可以降低到性能的1/n
而没有分歧(即没有分支或warp / wafefront中的所有线程都采用相同的路径)。当然,对于这种情况,您的整个内核必须嵌入if-else
(或switch
)构造中。
但如上所述,只有当采用不同路径的线程在同一个warp / wafefront中时,才会发生这种情况。因此,您可以编写代码/重新排列数据/选择算法/ ...以尽可能避免分支差异。
Tl; DR:可以有分支,但如果不同的线程采用不同的分支,则它们必须处于不同的warp / wafefronts中,以避免分歧,从而避免性能损失。