我读了这篇文章:
FPGA还是GPU? - 演变仍在继续
有人在评论中写道:
由于GPU是SIMD,任何带有"if-else"语句的代码都会将性能降低一半.一半内核将执行语句的if部分,而一半内核处于空闲状态,然后另外一半内核将执行else计算,而前半部分内核保持空闲状态.
我不明白为什么?
为什么在使用if-else
性能时使用GPU(即OpenCL)会减少一半?
分支通常不会影响性能,但分支差异会影响性能.也就是说,两个线程采用不同的路径(例如,一个满足if
条件,另一个不满足条件).因为GPU的所有线程都执行相同的"代码行",所以某些线程必须等待执行不属于其路径的代码.
嗯,这不是真的,因为只有一个warp(NVIDIA)或wavefront(AMD)中的所有线程都执行相同的"代码行".(目前,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中以避免分歧并因此导致性能损失.