如果您在wavefront中执行了工作项,并且存在条件,例如:
if(x){
...
}
else{
....
}
工作项执行什么?是这样的情况,波前的所有工作项都将执行第一个分支(即x == true
)。如果没有x为false的工作项,则跳过其余的条件?
如果一个工作项采用替代路径会发生什么。我是否告诉所有工作项也将执行备用路径(因此执行两个路径?)。为什么会这样呢?它如何不搞乱程序执行
答案 0 :(得分:14)
NVIDIA gpus使用条件执行来处理SIMD组内的分支差异(“warp”)。在if..else
示例中,两个分支都由分叉warp中的每个线程执行,但是那些不遵循给定分支的线程会被标记并执行null操作。这是经典的分支差异惩罚 - interwarp分支差异需要两次通过代码部分才能退出为warp。这并不理想,这就是面向性能的代码试图最小化这一点的原因。经常引人注意的一件事就是假设分歧路径的哪个部分“先”执行。由于在不同的扭曲中猜测执行的内部顺序,导致了一些非常微妙的错误。
对于更简单的条件,NVIDIA GPU支持ALU的条件评估,这不会引起分歧,对于整个warp遵循相同路径的条件,显然也没有惩罚。