Caching MESI在英特尔64和IA-32上的作用是什么 MESI的要点是保留共享内存系统的概念 但是,对于存储缓冲区,事情很复杂: 一旦数据到达MESI实现缓存,内存就与下游一致 然而,在这一点的上游,根据每个核心的本地存储缓冲区中的内容,每个核心可能对内存位置X中的内容存在分歧 因此,从每个核心的角度来看,似乎记忆的状态是不同的——它是不连贯的 那么,我们为什么要费心“部分”地加强与MESI的一致性呢

Caching MESI在英特尔64和IA-32上的作用是什么 MESI的要点是保留共享内存系统的概念 但是,对于存储缓冲区,事情很复杂: 一旦数据到达MESI实现缓存,内存就与下游一致 然而,在这一点的上游,根据每个核心的本地存储缓冲区中的内容,每个核心可能对内存位置X中的内容存在分歧 因此,从每个核心的角度来看,似乎记忆的状态是不同的——它是不连贯的 那么,我们为什么要费心“部分”地加强与MESI的一致性呢,caching,concurrency,x86,cpu-architecture,mesi,Caching,Concurrency,X86,Cpu Architecture,Mesi,编辑:在进一步缩小让我困惑的范围后,进行了实质性的编辑。我试图保持这个问题的一般概念不变,以保持收到的伟大答案的相关性 Re:您的编辑,这似乎是一个新问题:对,存储转发“违反”了一致性。一个核心可以比任何其他核心更早地看到自己的存储。存储缓冲区不一致 x86内存排序规则要求加载以程序顺序全局可见,但允许内核在数据全局可见之前从自己的存储中加载数据。没必要 也相关;是违反通常内存排序规则的存储缓冲区+存储转发的一个具体示例。请参阅Linus Torvalds的邮件列表文章,其中解释了存储转发对内存

编辑:在进一步缩小让我困惑的范围后,进行了实质性的编辑。我试图保持这个问题的一般概念不变,以保持收到的伟大答案的相关性

Re:您的编辑,这似乎是一个新问题:对,存储转发“违反”了一致性。一个核心可以比任何其他核心更早地看到自己的存储。存储缓冲区不一致

x86内存排序规则要求加载以程序顺序全局可见,但允许内核在数据全局可见之前从自己的存储中加载数据。没必要

也相关;是违反通常内存排序规则的存储缓冲区+存储转发的一个具体示例。请参阅Linus Torvalds的邮件列表文章,其中解释了存储转发对内存排序的影响(以及它如何表示建议的锁定方案不起作用)


如果没有一致性,您将如何以原子方式递增共享计数器,或者实现其他原子读-修改-写操作,这些操作对于实现锁至关重要,或者直接在无锁代码中使用。(见附件)

lock add[shared_counter],同时在多个线程中1
不会丢失实际x86上的任何计数,因为
lock
前缀使内核在存储提交到L1d之前保持缓存线的独占所有权(从而变得全局可见)

没有一致缓存的系统将允许每个线程增加其自己的共享计数器副本,然后内存中的最终值将来自最后刷新该行的线程

即使在其他加载/存储发生时,允许不同的缓存长期保存同一行的冲突数据,并跨越内存障碍,也会带来各种奇怪的情况

这也违反了其他内核可以立即看到纯存储的假设。如果您根本没有一致性,那么内核可以继续使用共享变量的缓存副本。因此如果您想让读者注意到更新,您必须在每次读取共享变量之前
clflush
,这使得普通情况变得昂贵(自上次检查以来没有人修改数据)。

MESI就像一个推送通知系统,而不是强制每个读卡器在每次读取时重新验证其缓存

在共享数据结构未被修改的情况下,MESI(或通常的一致性)允许诸如RCU(读取副本更新)之类的东西为读卡器带来零开销(与单线程相比)。。看,还有。其基本思想是,编写器复制整个内容,修改副本,然后更新共享指针以指向新版本,而不是锁定数据结构。所以读者总是完全不必等待;它们只是取消引用(原子)指针,数据在L1d缓存中保持热状态



硬件支持的一致性非常有价值,几乎每个共享内存SMP体系结构都使用它。即使是内存排序规则比x86弱得多的ISA,如PowerPC,也使用MESI。

x86上的MESI与几乎任何多核/CPU系统上的MESI的要点相同:强制实现缓存一致性。x86上的缓存一致性部分不使用“部分一致性”:缓存是完全一致的。因此,可能的重新排序是一致缓存系统以及与核心本地组件(如加载/存储子系统(尤其是存储缓冲区)和其他无序机器)交互的结果

这种交互的结果是x86提供的体系结构强内存模型,只需有限的重新排序。如果没有一致的缓存,您根本无法合理地实现这个模型,或者几乎无法实现任何一个完全不弱的模型

你的问题似乎嵌入了这样一个假设,即只有可能的状态是“连贯的”和“所有其他的”。此外,还混合了缓存一致性的思想(主要是专门处理缓存,主要是一个隐藏的细节),以及内存一致性模型,后者在体系结构上定义并将由每个体系结构实现2。Wikipedia指出,缓存一致性和内存一致性之间的一个区别是前者的规则一次只适用于一个位置,而一致性规则适用于多个位置。在实践中,更重要的区别是内存一致性模型是唯一的体系结构文档化模型

简单地说,英特尔(和AMD一样)定义了一个特定的内存一致性模型,就内存模型而言,该模型相对较强,但仍弱于。与顺序一致性相比,被削弱的主要行为有:

  • 以后的装载可以通过以前的存储
  • 可以以不同于总存储顺序的顺序查看存储,但只能通过执行其中一个存储的内核来查看
为了实现这个记忆模型,各个部分必须按照规则来实现它。在所有最近的x86上,这意味着有序加载和存储缓冲区,从而避免了不允许的重新排序。使用存储缓冲区会导致两次重新排序