线程是不是可以自动更新共享内存的 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;

【问题讨论】:

不,它不能以原子方式执行,在一般情况下,abcd 是任意的,和/或 x、@987654327 @、zw 均为 32 位或更大。 “原子地”是指使用硬件提供的原子 RMW 操作。您可以使用临界区来实现这样的事情,可能会付出相当大的性能成本、代码复杂性和脆弱性。另一种选择是重铸您的算法以使用某种形式的并行缩减。 我明白了,谢谢。我将围绕这个限制重新考虑我的算法。顺便说一句,这条评论看起来像是一个有效的答案。 【参考方案1】:

没有,特殊情况除外。

这不能以原子方式执行,在一般情况下,abcd 是任意的(即不一定相邻)和/或 x、@987654330 @、zw 均为 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章) 多线程

如何在web页面下做自动化测试?

在多核的系统中,同一个进程的2个线程可以分别同时运行在不同的核(cpu)上吗?

从共享内存中读取 int 数组是不是会排除银行冲突?