线程是不是可以自动更新共享内存的 4 个不同位置?
Posted
技术标签:
【中文标题】线程是不是可以自动更新共享内存的 4 个不同位置?【英文标题】:Is it possible for a thread to atomically update 4 different places of the shared memory?线程是否可以自动更新共享内存的 4 个不同位置? 【发布时间】:2019-04-25 13:30:54 【问题描述】:假设内核的一个线程试图更新共享内存上的 4 个不同位置。如果任何其他线程覆盖了这些位置中的任何一个,我能否导致该操作失败并被撤销?具体来说,这可以原子执行吗?
mem[a] = x;
mem[b] = y;
mem[c] = z;
mem[d] = w;
【问题讨论】:
不,它不能以原子方式执行,在一般情况下,a
、b
、c
和 d
是任意的,和/或 x
、@987654327 @、z
、w
均为 32 位或更大。 “原子地”是指使用硬件提供的原子 RMW 操作。您可以使用临界区来实现这样的事情,可能会付出相当大的性能成本、代码复杂性和脆弱性。另一种选择是重铸您的算法以使用某种形式的并行缩减。
我明白了,谢谢。我将围绕这个限制重新考虑我的算法。顺便说一句,这条评论看起来像是一个有效的答案。
【参考方案1】:
没有,特殊情况除外。
这不能以原子方式执行,在一般情况下,a
、b
、c
和 d
是任意的(即不一定相邻)和/或 x
、@987654330 @、z
、w
均为 32 位或更大。
我使用“原子”来指代an atomic RMW operation that the hardware provides。
此类操作最多限制为 64 位,因此 4 个 32 位或更大的数量无法工作。此外,所有数据必须是连续的并且“自然”对齐,因此不能在单个原子循环中访问独立的位置。
在 4 个数量为 16 位或 8 位数量且相邻且对齐的特殊情况下,您可以使用 custom atomic。
要考虑的替代方案:
您可以使用critical sections 来实现这些目标,但可能会付出相当大的性能成本、代码复杂性和脆弱性。
另一种选择是重铸您的算法以使用某种形式的parallel reduction。由于您似乎在线程块级别进行操作,因此这可能是最好的方法。
【讨论】:
以上是关于线程是不是可以自动更新共享内存的 4 个不同位置?的主要内容,如果未能解决你的问题,请参考以下文章
python+selenium自动化软件测试(第8章) 多线程