减少GPU应用中的分支方法[1]

来源:互联网 发布:西南交大网络教学学费 编辑:程序博客网 时间:2024/06/10 03:31

这篇文章中作者主要是研究一个WARP中的分支情况,提出了两种减少分支以提高性能的方法:

(1)延迟迭代(Iteration Delay)

这个方法主要内容是在不同线程第i次循环中,执行同一个path的线程就一起执行,剩余不同path的线程就延迟到下一次循环再同时执行,这个想法的主要意义在于可以充分利用warp的SIMT性质,理论上来说是比原来的warp中分支并行变串行的效率要高。这个方法有一个问题要解决的是如何绝对第i次循环是执行那个path的线程跑,文章中给出了两种决策方案:

a、少数服从(majority-vote),每轮循环由warp里的线程投票选出path票数最多的线程,这样的好处的最大程度减少了每轮要延迟的线程,坏处就是对于某些极端情况某些线程可能要延迟到其他线程执行完然后再执行导致性能更差。

b、轮流(round-robin),就是第一轮是if path,第二轮就是else path。。。每一轮的path是前一轮的相反。这种决策的优点是避免了极端情况,缺点是可能会导致某轮循环空转,可以考虑去掉空转,但是增加的指令会导致overhead。

(2)提取分支(Branch Distribution)

这个方法主要内容是针对如果分支语句不同path的指令结构一样的话,可以把公共的结构提取出来放到非分支部分,但是这方法不一定能取得性能上的提高,原因有三:

a、带来额外的指令overhead(我也没太看懂这点),因为这方法能提高性能的唯一决定因素在于如果提取的部分大到带来的好处足以抵消所带来的overhead(貌似是句废话?)。

b、这方法会增加寄存器的使用,因为提取出来的部分需要在分支里用临时变量保存一些值,如果提取的部分比较大,那么可能warp里面的寄存器不够用。

c、会减少指令级并行ILP,由于大的基本块经提取之后变成小的基本块了。

文章的实验部分也是做的很全面(毕竟发在GPGPU上的),以不同优化方法为一个维度,分支块占总块(分支+非分支)的比例为另一个维度去测试。结果显示如果分支块的比重比较小那么性能可能比不上未优化的版本,当比重增加到一定程度,性能得到比较大的提升。


参考:

[1] Han T D, Abdelrahman T S. Reducing branch divergence in GPU programs[C]//Proceedings of the Fourth Workshop on General Purpose Processing on Graphics Processing Units. ACM, 2011: 3.

0 0
原创粉丝点击