关于warp分歧的理解

看编程指南中说,任何流控制指令(if\switch\do\for\while)都会导致线程分歧,线程分歧时会顺序执行每个分子路径,而禁用不在此路径上的线程,直到所有路径完成,线程再重新汇合到同一执行路径。
我的理解是,如果同一束中有N个if/switch分支,束内的每个线程都会对每个分支进行判定,如果判定满足,就会执行分支内的代码,如果不满足,线程会暂停等到其他线程执行完成,然后再一起执行下一步。那么如果束内的32个线程,对于N个分支中,共有M个判定满足的,那么这个束的执行时间就是M个分支的执行时间之和,如果32个线程都只对N个分支中的一个分支满足,那么束的执行时间就是一个分支的执行时间,我的理解对嘛?
如果是while和for循环的话怎么理解呢,如果束内的每个线程的循环数都一样,是不是就是没发生分歧,如果循环数不一样,束的执行时间就是循环数最多的那个线程的耗时?
新手,望指教。

对头,你的理解很到位。

LZ您好:

您的理解基本是正确的。

如果一个warp的32个线程都只满足同一个分支,这是所谓的“分支按warp对齐”的形式,此时分支基本不影响执行效率。
如果一个warp的32个线程分别满足多个分支,那么不满足当前分支的线程可能会采用插入等待或者假执行(跟着一起算,但是不保留结果)的方式,总的运行时间是多个运行分支的时间之和,以及显然每次都有些线程不干活或者干无用功。

因为最小的执行单位就是warp,所以如果warp内不同线程的循环次数不同,那么这也是一种分支情况,并且时间是循环次数最多的那个线程所花费的时间。

大致如此,祝您编码顺利~

谢谢版主~:)

不客气的,欢迎您常来~

同时也感谢2# gpu 网友的热情回帖~

推荐看一下GPGPU-sim,里面比较详细地介绍GPU如何处理branch。

感谢wzk6_3_8提供此资料,该资料十分不错!不过该项目是第三方的研究项目,并非NV官方保证的,也请辩证地参考,综合手册,和实际运行情况予以解决实际问题。