Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CUDA条件线程同步_C++_Parallel Processing_Cuda_Synchronization - Fatal编程技术网

C++ CUDA条件线程同步

C++ CUDA条件线程同步,c++,parallel-processing,cuda,synchronization,C++,Parallel Processing,Cuda,Synchronization,CUDA编程指南指出: __条件代码中允许使用syncthreads(),但仅当 条件值相同 穿过整个螺纹块, 否则,很可能会执行代码 悬挂悬挂或产生意料之外的一面 效果 因此,如果我需要通过一个块上的条件分支来同步线程,其中一些线程可能会也可能不会接受包含\u syncthreads()调用的分支,这是否意味着它无法工作 我在想象,在各种情况下,你可能需要这样做;例如,如果您有一个二进制掩码,并且需要有条件地对像素应用特定操作。假设,如果(掩码(x,y)!=0)则执行包含\uu syncthr

CUDA编程指南指出:

__条件代码中允许使用syncthreads(),但仅当 条件值相同 穿过整个螺纹块, 否则,很可能会执行代码 悬挂悬挂或产生意料之外的一面 效果

因此,如果我需要通过一个块上的条件分支来同步线程,其中一些线程可能会也可能不会接受包含
\u syncthreads()
调用的分支,这是否意味着它无法工作


我在想象,在各种情况下,你可能需要这样做;例如,如果您有一个二进制掩码,并且需要有条件地对像素应用特定操作。假设,
如果(掩码(x,y)!=0)
则执行包含
\uu syncthreads()
的代码,否则不执行任何操作。怎么做?

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

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

从3.0开始,您可以使用warp vote函数来完成syncthreads无法完成的任务:

仅支持扭曲投票函数 通过计算能力为1.2的设备

int-all(int谓词)谓词 适用于经纱和经纱的所有线 当且仅当 谓词的计算结果为非零 都是

int\u任意(int谓词) 对谓词求值 所有经线和回程线 非零当且仅当谓词 对于其中任何一个,计算结果均为非零

无符号整数投票(整数谓词) 计算的所有线程的谓词 扭曲并返回一个整数,其 当且仅当 谓词的计算结果为非零 经纱的第n根线。这 功能仅受设备支持 计算能力2.x

除此之外,还有原子位函数

atomicAnd、atomicOr、atomicXor


参见《cuda编程指南》的B.11节

这个答案有点过时,但它在搜索结果中显示得很高。我发现另一个答案与今天的CUDA功能更相关:。也许这个答案需要更新?@梁:理论上,这个答案还是正确的;CUDA模型规定块内的所有线程都必须到达屏障。您引用的帖子描述了为什么早期退出可以工作,但它不能在所有GPU(G80)上工作,也不能保证它会一直工作。