dev*_*ium 4 concurrency x86 cpu-architecture memory-model
在阅读一致性模型(即 x86 TSO)时,作者通常会使用包含大量 CPU、相关存储缓冲区和私有缓存的模型。
如果我的理解是正确的,存储缓冲区可以被描述为队列,CPU 可以在其中放置他们想要提交到内存的任何存储指令。因此,顾名思义,它们是store缓冲区。
但是当我阅读这些论文时,他们倾向于谈论加载和存储的交互,诸如“稍后加载可以通过较早存储”之类的陈述有点令人困惑,因为它们几乎似乎在谈论存储缓冲区将同时具有加载和存储,当它没有时 - 对吗?
所以也必须有一个他们没有(至少明确地)谈论的负载存储。另外,这两者必须以某种方式同步,所以两者都知道什么时候可以从内存加载并提交到内存——或者我是否遗漏了什么?
任何人都可以对此有所了解吗?
编辑:
让我们看一下“内存一致性和缓存一致性入门”中的一段:
为了理解 TSO 中原子 RMW 的实现,我们将 RMW 视为紧跟在存储之后的负载。由于 TSO 的排序规则,RMW 的负载部分无法通过较早的负载。乍一看,RMW 的加载部分可能会传递写入缓冲区中较早的存储,但这是不合法的。如果 RMW 的加载部分通过较早的存储,则 RMW 的存储部分也必须通过较早的存储,因为 RMW 是原子对。但是由于在 TSO 中不允许 store 相互传递,因此 RMW 的负载部分也不能通过较早的 store
进一步来说,
由于 TSO 的排序规则,RMW 的负载部分无法通过较早的负载。乍一看,RMW 的加载部分可能会传递写入缓冲区中较早的存储
所以他们指的是在写入缓冲区中相互交叉的负载/存储(我认为这与存储缓冲区相同?)
谢谢
是的,写入缓冲区 = 存储缓冲区。
他们正在讨论是否将原子 RMW 拆分为单独的加载和存储,并且存储缓冲区延迟了另一个存储(到单独的地址),因此它在加载之后但仍在存储之前。
显然,这将使它成为非原子的,并且违反了所有 x86 原子 RMW 操作也是完全屏障的要求。(lock前缀也暗示了这一点。)
通常读者很难检测到这一点,但是如果“单独的地址”与原子 RMW 相邻,那么例如一个双字存储 + 一个双字 RMW 可以被另一个执行 64 位 qword 加载的线程观察到作为一个原子操作。
回复:标题问题:
加载缓冲区不会导致重新排序。他们等待尚未到达的数据;负载在读取数据时完成“执行”。
存储缓冲区根本不同;在数据变得全局可见之前,它们会保存数据一段时间。
x86 的 TSO 内存模型可以描述为顺序一致性 + 存储缓冲区(带有存储转发)。又见86 MFENCE和C ++内存屏障和评论对答案的事实,只是让StoreLoad重新排序更多的讨论不是一个线程重新加载数据,它只是存储在何处的情况下有足够的描述,特别是当负载部分近期门店重叠因此,HW 将来自存储缓冲区的数据与来自 L1d 的数据合并,以在存储全局可见之前完成加载。
另请注意,x86 CPU 会推测性地对加载进行重新排序(至少 Intel 是这样做的),但要消除错误推测以保留没有 LoadLoad 或 LoadStore 重新排序的 TSO 内存模型。因此,CPU 必须跟踪负载与存储排序。英特尔将组合存储+加载缓冲区跟踪结构称为“内存顺序缓冲区”(MOB)。请参阅英特尔硬件上的存储缓冲区大小?究竟什么是存储缓冲区?更多。
| 归档时间: |
|
| 查看次数: |
235 次 |
| 最近记录: |