首页 > 解决方案 > 线程是否可以自动更新共享内存的 4 个不同位置?

问题描述

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

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

标签: cuda

解决方案


不,除了特殊情况。

这不能原子地执行,在一般情况下ab, c, 和d是任意的(即不一定相邻),和/或x, y, z,w每个都是 32 位或更大。

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

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

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

要考虑的替代方案:

您可以使用临界区来实现这样的事情,可能会付出相当大的性能成本、代码复杂性和脆弱性。

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


推荐阅读