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