如果您在波前执行工作项并且有条件,例如:
if(x){
...
}
else{
....
}
工作项执行什么?波前中的所有工作项是否都将执行第一个分支(即
x == true
)。如果没有 x 为假的工作项,则跳过其余的条件?如果一个工作项采用替代路径会发生什么。我是否被告知所有工作项也将执行备用路径(因此执行两条路径?)。为什么会这样,怎么不打乱程序执行
最佳答案
NVIDIA GPU 使用条件执行来处理 SIMD 组内的分支分歧(“warp”)。在您的 if..else
例如,两个分支都由发散扭曲中的每个线程执行,但那些不遵循给定分支的线程被标记并执行空操作。这是经典的分支发散惩罚 - interwarp 分支发散需要两次通过代码部分才能退出 warp。这并不理想,这就是面向性能的代码试图将其最小化的原因。经常引起人们注意的一件事是假设“首先”执行不同路径的哪一部分。由于在发散扭曲中再次猜测内部执行顺序,导致了一些非常微妙的错误。
对于更简单的条件,NVIDIA GPU 支持 ALU 处的条件评估,这不会导致发散,而对于整个扭曲遵循相同路径的条件,显然也没有惩罚。
关于cuda - 在 GPU 编程中使用条件时,工作项执行什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5897454/