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



我对缓存一致性系统在现代多核CPU中的作用有些困惑。我已经看到,基于窥探的协议,如基于MESIF/MOSI窥探的协议已经在英特尔和AMD处理器中使用,另一方面,基于目录的协议似乎对多核更有效,因为它们不广播,而是向特定节点发送消息。

AMD或Intel处理器中的现代缓存一致性解决方案是什么?它是基于窥探的协议(如MOESI和MESIF),还是仅基于目录的协议,还是两者的结合(用于同一节点内元素之间的通信的基于窥探的协议,以及用于节点到节点通信的基于目录)?

MESI是根据窥探共享总线来定义的,但不,现代CPU实际上并不是这样工作的每个缓存行的MESI状态都可以通过消息和窥探过滤器(基本上是一个目录)来跟踪/更新,以避免广播这些消息,而这正是英特尔(MESIF)和AMD(MOESI)实际所做的。

例如,Intel CPU中共享的包含L3的高速缓存(在Skylake服务器之前)允许L3标签充当窥探过滤器;除了跟踪MESI状态,他们还记录哪个核心#(如果有的话)有一行的私有副本。英特尔酷睿i7处理器使用了哪种缓存映射技术?

例如,Sandybridge系列CPU带有环形总线(现代客户端芯片、服务器芯片,最高可达Broadwell)。核心#0读取一行。这条线在1号核心上处于修改状态。

  • 核心#0上的L1d和L2缓存中的读取未命中,导致在环形总线上向包含该行的L3切片发送请求(通过一些物理地址位上的哈希函数进行索引)

  • L3的那部分得到消息,检查它的标签。如果此时发现tag=Shared,则响应可以通过双向环形总线返回数据。

  • 否则,L3标签告诉它,核心#1拥有一行的独占所有权:exclusive,可能已升级为Modified=dirty。

  • L3的该切片中的L3高速缓存逻辑将生成一条消息,要求核心#1写回该行。

  • 消息到达核心#1的环形总线站点,并使其L2或L1d写回该线路。

    IDK,如果一条环形总线消息可以由Core#0以及L3缓存的相关切片直接读取,或者如果消息可能必须一直到L3切片并,则从那里到Core#0。(最坏情况下的距离=对于双向环,基本上是整个环,而不是一半。)

这是超级波浪形;关于确切的细节,不要相信我的话,但发送共享请求、RFO或回写等消息的一般概念是正确的心理模型BeeOnRope有一个答案,通过类似的步骤分解,包括uop和存储缓冲区,以及MESI/RFO。


在类似的情况下,如果core#1只获得了Exclusive所有权,但从未写入,那么它可以在没有修改的情况下静默地丢弃该行。(缓存中未命中的加载默认为加载到Exclusive状态,因此单独的存储不必对同一行执行RFO)。在这种情况下,我假设没有线路的核心必须发回一条消息来表明这一点。或者,它可能会直接向也在环形总线上的一个存储器控制器发送消息,而不是往返于L3切片以强制它这样做。

显然,像这样的事情可以同时发生在每个核心。(每个核心都可以有多个等待中的未决请求:单个核心内的内存级并行。在英特尔,L2超级队列在一些微体系结构上有16个条目,而L1 LFB有10或12个。)

四插槽和更高版本的系统在插槽之间具有窥探过滤器;Broadwell和更早版本的E5-xxxx CPU的双插槽Intel系统只是通过QPI链路对彼此进行垃圾邮件窥探。(除非您在双插槽系统中使用了支持四插槽的CPU(E7-xxxx))。多套接字很难,因为本地L3中的丢失并不一定意味着该使用DRAM了;其他套接字可能已修改了该行。

也相关:

  • https://www.realworldtech.com/sandy-bridge/Kanter的SnB文章涵盖了英特尔的环形总线设计IIRC,尽管它主要是关于每个核心的内部结构。共享包容性L3在Nehalem是新的(当Intel开始使用"core i7"品牌名称时),https://www.realworldtech.com/nehalem/
  • 为什么Skylake在单线程内存吞吐量方面比BroadwellE好得多?-对于具有更多内核的Intel CPU,在环形总线上跳得越多会损害L3和DRAM延迟,因此带宽=最大并发/延迟
  • MOESI缓存一致性协议相对于MESI有什么好处?更多链接

最新更新