1

假设我有一个变量 x。

x = 0

然后我生成一些线程,它们中的每一个都可能会或可能不会在不使用原子的情况下运行以下表达式。

x |= 1

在所有线程都加入我的主线程之后,主线程在值上分支。

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

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

另外,如果您碰巧提供了相反的答案,请提供一个逐个说明的示例!

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

详细信息: 我正在尝试将提前退出添加到我的 OpenCL 基数排序实现中,以跳过基数传递,如果数据是带状的(即上面的 'x' 将是 x[RADIX] 并且我将拥有所有工作组,对在部分减少数据后,通过“x”指示 RADIX 箱中是否存在元素)。

4

1 回答 1

0

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

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

于 2013-03-25T17:12:48.467 回答