CUDA条件线程同步

时间:2011-03-27 11:45:31

标签: c++ parallel-processing cuda synchronization

CUDA编程指南指出

  

__ syncthreads()在条件代码中是允许的,但仅限于   条件评估相同   在整个线程块中,   否则代码执行很可能   悬挂或产生意外的一面   的效果。

因此,如果我需要在一个块上使用条件分支同步线程,其中一些线程可能会或可能不会采用包含__syncthreads()调用的分支,这是否意味着它不起作用?< / p>

我想象可能存在各种各样的情况,你可能需要这样做;例如,如果您有二进制掩码并需要有条件地对像素应用某个操作。比如说,if (mask(x, y) != 0)然后执行包含__syncthreads()的代码,否则什么都不做。怎么做?

2 个答案:

答案 0 :(得分:8)

如果你需要走这条路,你可以将身体分成两个阶段:

if (condition)
{
    // code before sync
}
__syncthreads();
if (condition) // or remember a flag or whatever
{
    // code after sync
}

或者,您可以使用条件设置禁用某些操作的标志,例如,如果您正在计算增量更新,则可以执行以下操作:

// *ALL* compute a delta update, those threads that would have failed the condition
// simply compute garbage.
// This can include syncthreads
if (condition)
    // apply update

答案 1 :(得分:1)

从3.0开始,你可以使用warp vote函数来完成__syncthreads所不能做到的事情:

  

仅支持扭曲投票功能   由计算能力1.2的设备

     

int __all(int谓词); 谓词   对于经线和线程的所有线程   当且仅当返回非零时返回非零   谓词的计算结果为非零   他们都是。

     

int __any(int predicate);   评估谓词   warp的所有线程并返回   当且仅当谓词时,非零   任何一个都评估为非零。

     

unsigned int __ballot(int predicate);   评估所有线程的谓词   warp并返回一个整数   当且仅当设置了第N位   谓词的计算结果为非零   经线的第N个线程。这个   功能仅受设备支持   计算能力2.x。

否则还有Atomic Bitwise函数

  

atomicAnd,atomicOr,atomicXor

参见cuda编程指南B.11节