gpt4 book ai didi

x86 - 为什么原子 RMW 指令的加载部分不能将较早的存储传递到 TSO(x86) 内存一致性模型中的不相关位置?

转载 作者:行者123 更新时间:2023-12-04 09:43:34 26 4
gpt4 key购买 nike

众所周知,由于使用了写缓冲区,x86 架构没有实现顺序一致性内存模型,因此可以进行 store->load 重新排序(可以提交稍后的加载,而较早的存储仍然驻留在写缓冲区中等待提交) L1缓存)。

A Primer on Memory Consistency and Coherence我们可以阅读 Total Store Order(TSO) 内存一致性模型中的 Read-Modify-Write(RMW) 操作(应该与 x86 非常相似):

... we consider the RMW as a load immediately followed by a store. The load part of the RMW cannot pass earlier loads due to TSO’s ordering rules. It might at first appear that the load part of the RMW could pass earlier stores in the write buffer, but this is not legal. If the load part of the RMW passes an earlier store, then the store part of the RMW would also have to pass the earlier store because the RMW is an atomic pair. But because stores are not allowed to pass each other in TSO, the load part of the RMW cannot pass an earlier store either.



好的,原子操作必须是原子的,即RMW访问的内存位置在RMW操作期间不能被其他线程/内核访问,但是如果较早的存储通过原子操作的加载部分,则与RMW 访问的内存位置?假设我们有以下几条指令(伪代码):
store int32 value in 0x00000000 location
atomic increment int32 value in 0x10000000 location

第一个存储被添加到写缓冲区并等待轮到它。同时,原子操作从另一个位置(甚至在另一个缓存行中)加载值,传递第一个存储,然后将存储添加到第一个之后的写入缓冲区中。在全局内存顺序中,我们将看到以下顺序:

加载(原子的一部分)-> 存储(序数)-> 存储(原子的一部分)

是的,从性能的角度来看,这可能不是最好的解决方案,因为我们需要将原子操作的缓存行保持在读写状态,直到写入缓冲区中的所有先前存储都已提交,但是, 撇开性能考虑不谈,是否有任何违反 TSO 内存一致性模型的情况?我们是否允许 RMW 操作的加载部分将较早的存储传递到不相关的位置 ?

最佳答案

您可以针对不同地址的任何存储 + 加载对提出相同的问题:由于乱序执行,加载可能比旧存储更早在内部执行。在 X86 中这是允许的,因为:

Loads may be reordered with older stores to different locations but not with older stores to the same location



(来源: Intel 64 Architecture Memory Ordering White Paper)

但是,在您的示例中,锁定前缀会阻止这种情况,因为(来自同一组规则):

Locked instructions have a total order



这意味着锁会强制一个内存屏障,就像一个 mfence(实际上一些编译器使用一个锁定的操作作为一个栅栏)。这通常会使 CPU 停止执行加载,直到存储缓冲区耗尽,从而迫使存储首先执行。

关于x86 - 为什么原子 RMW 指令的加载部分不能将较早的存储传递到 TSO(x86) 内存一致性模型中的不相关位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42820121/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com