现代x86 CPU使用什么缓存一致性方案?

8
我对现代多核CPU中缓存一致性系统的工作原理有些困惑。我看到像MESIF/MOESI这样基于嗅探的协议被用于Intel和AMD处理器中,而基于目录的协议似乎更适用于多核心,因为它们不广播消息,而是向特定节点发送消息。
在AMD或Intel处理器中,现代的缓存一致性解决方案是什么?它是基于MOESI和MESIF这样的嗅探协议,还是只有基于目录的协议,或者两种协议都有(嗅探协议用于同一节点内元素之间的通信,目录协议用于节点之间的通信)?
1个回答

9
MESI是基于共享总线的嗅探定义的,但是现代CPU并不实际工作。Intel(MESIF)和AMD(MOESI)实际上使用消息和嗅探过滤器(基本上是一个目录)来跟踪/更新每个缓存行的MESI状态,以避免广播这些消息。例如,Intel CPU中共享包容性L3高速缓存({{link1:Skylake server之前}})让L3标签充当嗅探过滤器;除了跟踪MESI状态外,它们还记录哪个核心#(如果有)具有该行的专用副本。例如,具有环形总线的Sandybridge系列CPU(现代客户端芯片,服务器芯片直到Broadwell)。Core#0读取一行。该行在Core#1上处于修改状态。
  • 在核心#0的L1d和L2缓存中读取未命中,导致通过环形总线向包含该行的L3片发送请求(通过某些物理地址位上的哈希函数进行索引)。

  • 那个L3片收到消息后,检查它的标签。如果此时找到tag = Shared,则响应可以通过双向环形总线返回数据。

  • 否则,L3标签告诉它核心#1独占一条线:Exclusive,可能已经被提升为Modified=dirty。

  • L3缓存逻辑在那个L3片中将生成一条消息,要求核心#1写回该行。

  • 消息到达核心#1的环形总线停靠处,并使其L2或L1d写回该行。

    我不知道一个环形总线消息是否可以直接被核心#0以及相关的L3缓存片读取,还是消息必须全部走到L3片,然后从那里到核心#0。(最坏情况下的距离基本上是沿着环形走了一圈,而不是一半,对于双向环形来说。)

这非常模糊;对于确切细节请不要完全听从我的话,但以发送消息(例如分享请求、RFO或写回)的一般概念为正确的思维模型。 BeeOnRope有一个答案,其中包括uops和存储缓冲区以及MESI / RFO的类似步骤分解。
在类似的情况下,如果核心#1只获得了独占权但从未修改过该行,则可能会静默地删除该行。(错失缓存的负载默认为加载到独占状态,因此不必进行RFO以执行相同的存储操作)。在这种情况下,我认为没有该行的核心最终必须发送一条消息来指示这一点。或者它直接向环形总线上的一个内存控制器发送消息,而不是回到L3片上进行往返以强制执行该操作。

显然,对于每个核心,这样的事情都可以并行发生。(每个核心都可以有多个等待中的请求:单个核心内存级别的并行性。在Intel上,L2超级队列在某些微架构上具有16个条目,而有10或12个L1 LFB。)

四路及以上系统在不同CPU之间有嗅探过滤器;而Broadwell及更早版本的Intel双路系统仅通过QPI链路相互发送嗅探(除非您在双路系统中使用了四路处理器(E7-xxxx))。多路系统很难处理,因为本地L3缺失并不一定意味着需要访问DRAM;其他CPU可能已经修改了该行。

另外相关:


1
实际的一致性实现与教科书上的描述不同的另一个重要方面是它们不是单层的。也就是说,教科书上的MESI通常描述了一个具有单层缓存和主内存的系统,但在现实中,我们有多个级别的缓存,并且整个系统需要保持一致并且性能良好。在实践中,这意味着缓存的各个级别之间具有某种类似于MESI的协议,即使像“这行处于M状态”这样的说法可能也不够精确。 - BeeOnRope
例如,L1中的一行可能相对于L2是干净的,但相对于RAM(和L3)总体上是脏的等等。层次结构的某些级别可能实现的功能比其他级别少。例如,当人们说Intel是MESIF时,我认为这通常是指最外层(例如,相对于DRAM的L3),而内部层可能仅实现MESI或具有外层不存在的某些其他优化。 - BeeOnRope
BeeOnRope 在某个地方有一个答案,解释了发送 MESI 消息的详细步骤,但我不记得在哪里了,不过可能性很大 :)。 - BeeOnRope
1
@BeeOnRope:我在写这篇文章时偶然发现了你的答案,正是我想到的答案:存储缓冲区和行填充缓冲区如何相互作用? - Peter Cordes
哦,是的,忘了那个。稍微更新了一下,提到存储器可能会流向LFB而不是阻塞在存储缓冲区中。 - BeeOnRope

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接