几乎在我读到的关于使用 CUDA 编程的任何地方,都提到了 warp 中的所有线程都做同样事情的重要性。
在我的代码中,我遇到了无法避免某种情况的情况。它看起来像这样:
// some math code, calculating d1, d2
if (d1 < 0.5)
{
buffer[x1] += 1; // buffer is in the global memory
}
if (d2 < 0.5)
{
buffer[x2] += 1;
}
// some more math code.
一些线程可能会进入一个条件,一些线程可能会同时进入,而其他线程可能不会进入任何一个。
现在为了让所有线程在条件之后再次回到“做同样的事情”,我应该在使用条件之后同步它们 __syncthreads()
吗?或者这是否以某种方式自动发生?
两个线程是否可以因为其中一个线程是一项操作而不能做同样的事情,从而为每个人毁掉它?或者是否有一些幕后的努力让他们在一个分支之后再次做同样的事情?