【问题标题】:How does the x86 TSO memory consistency model work when some of the stores being observed come from store-forwarding?当观察到的一些存储来自存储转发时,x86 TSO 内存一致性模型如何工作?
【发布时间】:2021-12-23 18:31:19
【问题描述】:

我有一个关于 x86 TSO 内存一致性模型的问题。从“内存一致性和缓存一致性入门”开始,在我看来,“全局存储顺序”(即内存顺序中的全局存储顺序)可能与所涉及的核心不同。

假设您有 2 个内核,每个内核都有一个 FIFO 写入缓冲区,如下面的模型所示:

每个核心按程序顺序发出/插入其写入缓冲区,我相信全局存储顺序基本上是 定义 由“内存开关”用于选择核心以“排出”的顺序他们的写缓冲区。

现在为绕过每个核心上的程序顺序最后存储的负载添加存储加载转发,在一个核心上运行的每个程序看到的加载顺序可能与在另一个核心上运行的程序看到的不同(即使从运行在内核上的程序发出的存储的子集实际上是在它的程序顺序中)。

也许我错过了一些观点......

【问题讨论】:

  • 你是对的,存储缓冲区让核心以不同于全局可见性顺序的顺序查看自己的存储,除非它使用mfence 或其他在加载之前耗尽存储缓冲区的东西.我在 Globally Invisible load instructions 上的回答涵盖了一些相同的领域,但这个问题是从不同的角度询问类似的主题,所以如果它是重复的,请 IDK。
  • 所以让我说“总存储顺序 (TSO)”这个名称实际上是指从连接到内存的假设代理可以看到来自所有内核的存储的唯一全局顺序?
  • 不,不是 DRAM,写回缓存的驱逐顺序可能完全不同。但是,是的,一个假设的代理,例如另一个核心,它是 MESI 一致性域的一部分,但它自己不做任何存储。全局顺序与 IRIW 石蕊测试之类的事情相关:两个读者以相反的顺序阅读其他两个独立作家写入的位置:读者永远不会对存储发生的顺序产生不同意见。 Will two atomic writes to different locations in different threads always be seen in the same order by other threads?
  • TSO 的另一部分是全局顺序是每个内核上程序顺序的某种交错。但是重新加载自己的商店总是很特别。它们不会对任何其他核心早期可见,但它们对你自己是可见的。另请参阅Can x86 reorder a narrow store with a wider load that fully contains it?,了解有关英特尔在其手册中解释这一点的方式的一些讨论。
  • 好的,所以仅限于全局可见的负载(即排除来自存储转发的负载),无论从哪个核心发出它们,它们都会看到相同的唯一全局存储顺序,对吗?

标签: x86 cpu-architecture memory-barriers consistency memory-model


【解决方案1】:

从收到的 cmets 开始,我会尝试回答我的问题。

让我们假设核心按照上述模型中的程序顺序执行加载和存储内存操作。每个核心都将自己的存储插入到其 FIFO 写入缓冲区(存储队列)中。

加载执行时有两种情况:

  1. 在写入缓冲区(存储队列)中至少有一个存储到与等待加载相同的地址:存储-加载转发发生并且存储队列中的加载得到满足并且它不会命中内存系统

  2. 没有存储到与存储队列中等待的负载相同的地址:必须从内存系统满足负载,因此核心实际上暂停等待“内存切换”选择它来服务负载并清空存储队列中的待处理存储

这种方式满足 TSO 内存一致性,其全局顺序由所有内核的存储变为全局可见的顺序定义(即根据“内存切换”定义的顺序从内核的存储队列中排入内存) )

【讨论】:

    猜你喜欢
    • 2020-04-08
    • 2021-11-05
    • 2017-08-06
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    相关资源
    最近更新 更多