假设一个内核线程试图更新共享内存中的4个不同位置。如果有其他线程覆盖了这些位置,我可以使该操作失败并反转吗?具体来说,这可以原子地执行吗?
mem[a] = x; mem[b] = y; mem[c] = z; mem[d] = w;
dbf7pr2w1#
在一般情况下,a、b、c和d是任意的(即,不一定相邻),和/或x、y、z、w每个都是32位或更大。我使用“原子地”来指代硬件提供的原子RMW操作。这样的操作被限制为总共最多64位,所以4个32位或更大的数量不能工作。此外,所有数据必须是连续的并且“自然地”对齐,因此不能在单个原子周期中访问独立的位置。在4个量是16位或8位量并且相邻和对齐的特殊情况下,您可以使用自定义原子。
a
b
c
d
x
y
z
w
您可以使用临界区来实现这些功能,但可能需要付出相当大的性能代价、代码复杂性和脆弱性。另一种方法是使用某种形式的parallel reduction来重构算法。由于您似乎是在线程块级别上进行操作,因此这可能是最好的方法。
1条答案
按热度按时间dbf7pr2w1#
否,特殊情况除外。
在一般情况下,
a
、b
、c
和d
是任意的(即,不一定相邻),和/或x
、y
、z
、w
每个都是32位或更大。我使用“原子地”来指代硬件提供的原子RMW操作。
这样的操作被限制为总共最多64位,所以4个32位或更大的数量不能工作。此外,所有数据必须是连续的并且“自然地”对齐,因此不能在单个原子周期中访问独立的位置。
在4个量是16位或8位量并且相邻和对齐的特殊情况下,您可以使用自定义原子。
可考虑的替代方案:
您可以使用临界区来实现这些功能,但可能需要付出相当大的性能代价、代码复杂性和脆弱性。
另一种方法是使用某种形式的parallel reduction来重构算法。由于您似乎是在线程块级别上进行操作,因此这可能是最好的方法。