为什么“if-else”语句(在GPU代码中)会将性能降低一半

时间:2017-08-17 11:40:17

标签: opencl gpu gpgpu

我读过这篇文章:

FPGA or GPU? - The evolution continues

有人在评论中写道:

  

由于GPU是SIMD,任何带有“if-else”语句的代码都会削减你的   表现一半。一半的核心将执行if的一部分   声明,而一半核心处于空闲状态,然后另一半处于空闲状态   核心将在核心的前半部分进行其他计算   保持闲置。

我无法理解为什么?

为什么在使用if-else时使用GPU(即OpenCL),性能会降低一半?

1 个答案:

答案 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中,以避免分歧,从而避免性能损失。