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

mi7gmzs6  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(130)

假设一个内核线程试图更新共享内存中的4个不同位置。如果有其他线程覆盖了这些位置,我可以使该操作失败并反转吗?具体来说,这可以原子地执行吗?

mem[a] = x;
mem[b] = y;
mem[c] = z;
mem[d] = w;
dbf7pr2w

dbf7pr2w1#

否,特殊情况除外。

在一般情况下,abcd是任意的(即,不一定相邻),和/或xyzw每个都是32位或更大。
我使用“原子地”来指代硬件提供的原子RMW操作。
这样的操作被限制为总共最多64位,所以4个32位或更大的数量不能工作。此外,所有数据必须是连续的并且“自然地”对齐,因此不能在单个原子周期中访问独立的位置。
在4个量是16位或8位量并且相邻和对齐的特殊情况下,您可以使用自定义原子。

可考虑的替代方案:

您可以使用临界区来实现这些功能,但可能需要付出相当大的性能代价、代码复杂性和脆弱性。
另一种方法是使用某种形式的parallel reduction来重构算法。由于您似乎是在线程块级别上进行操作,因此这可能是最好的方法。

相关问题