【发布时间】: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