或者等于常量作为还原操作(例如值| = 1)线程安全吗?

时间:2013-03-25 06:58:49

标签: thread-safety opencl

假设我有一个变量x。

x = 0

然后我产生了一些线程,并且每个线程都可以运行或不运行以下表达式而不使用atomics。

x |= 1

在所有线程都加入了我的主线程后,主线程就会对值进行分支。

if(x) { ... } else { ... }

在这种情况下是否有竞争条件?我的想法说不,因为在读取和写入'x'之间线程是否被另一个线程中断似乎并不重要(在两种情况下,'x == 1'或'x == 1' )。也就是说,我想确保我不会错过任何明显或可笑的愚蠢的东西。

此外,如果您碰巧提供了相反的答案,请提供逐个教学的示例!

上下文 我试图在OpenCL中让我的线程表明任何工作项中是否存在某个功能。如果任何线程指示存在该功能,我的主机应该能够分支结果。我正在考虑使用上述方法。如果你们有更好的建议,这也有效!

详情: 我正在尝试将早期退出添加到我的OpenCL基数排序实现中,如果数据被绑定则跳过基数传递(即上面的'x'将是x [RADIX]并且我将拥有所有工作组,就在部分之后减少数据,通过'x'表示RADIX箱中元素的存在与否。

1 个答案:

答案 0 :(得分:0)

它可能在工作组中起作用。在测试x之前,您需要插入一个屏障。我不确定它会比使用原子增量更快。

它不适用于多个工作组。想象一下,你有1000个工作组在20个核心上运行。通常,只有少量工作组可以驻留在单个核心上,例如4个,这意味着在给定时间内,只有80个工作组可以在GPU内部飞行。一旦工作组完成执行,它就会退役,并启动另一个工作组。在执行过程中暂停内核以等待所有1000个工作组到达同一点是不可能的。