一个线程是否可以原子地更新共享内存的 4 个不同位置?

Mai*_*tor 1 c++ cuda atomic gpu-shared-memory

假设内核的一个线程尝试更新共享内存中的 4 个不同位置。如果任何其他线程覆盖了这些位置中的任何一个,我是否会导致该操作失败并被逆转?具体来说,这可以原子地执行吗?

mem[a] = x;
mem[b] = y;
mem[c] = z;
mem[d] = w;
Run Code Online (Sandbox Code Playgroud)

Rob*_*lla 5

不可以,特殊情况除外。

这不能以原子方式执行,在一般情况下abc、 和d是任意的(即不一定相邻),和/或xyzw均为 32 位或更大。

我使用“原子地”来指代硬件提供的原子 RMW 操作

此类操作总共限制为最大 64 位,因此 4 个 32 位或更大的数量无法工作。此外,所有数据必须是连续的并且“自然”对齐,因此不能在单个原子周期中访问独立位置。

在 4 个数量为 16 位或 8 位数量且相邻且对齐的特殊情况下,您可以使用自定义的atomic

考虑的替代方案:

您可以使用关键部分来实现此类目标,但可能会付出相当大的性能成本、代码复杂性和脆弱性。

另一种选择是重新设计算法以使用某种形式的并行归约。由于您似乎是在线程块级别进行操作,因此这可能是最好的方法。