【问题标题】:What is the benefit of the MOESI cache coherency protocol over MESI?MOESI 缓存一致性协议相对于 MESI 有什么好处?
【发布时间】:2018-10-03 15:16:13
【问题描述】:

我想知道 MOESI 与 MESI 缓存一致性协议相比有哪些优势,以及目前哪种协议更受现代架构的青睐。如果成本不允许,收益通常不会转化为实施。 MOESI 相对于 MESI 的定量性能结果也很高兴看到。

【问题讨论】:

  • MOESI 和 MESI 只是指定(稳定)状态和它们之间的转换。但是有很多方法可以实现它们(失效与更新、目录与窥探与混合、事务设计、缓存层次结构设计)。公平比较这两种协议的性能的唯一方法是使用实​​现这两种协议的单个真实处理器。没有这样的处理器 AFAIK。即使那样,比较也只是协议的许多不同实现中的两个。

标签: multithreading caching memory memory-management cpu-architecture


【解决方案1】:

在绝对性能方面,MOESI 几乎总是优于 MESI。然而,MESI 只需要每个高速缓存行 2 位来保持状态,而 MOESI 需要每个高速缓存行 3 位。因此,对于较小的缓存行,MOESI 的相对面积开销会增加。当目标域中的应用程序类型对共享缓存行的写入很少时,这可能不合理。即使是额外的功率或静态能量开销在某些域中也可能是无法容忍的。由于这些原因,MOESI 对于低能耗/低性能/小型处理器来说可能过于昂贵。也就是说,MOESI 在每瓦性能或每焦耳性能方面效率较低。 ARM11 uses MESIARM Cortex-A57 uses MESI at L1 and MOESI at L2。请注意,使用特定一致性协议的决定并不独立于有关缓存层次结构、互连和内核数量的其他方面的决定。这些参数相互影响。

【讨论】:

    【解决方案2】:

    AMD 使用 MOESI,英特尔使用 MESIF。 (我不知道非 x86 缓存的详细信息。)

    MOESI 允许直接在缓存之间发送脏缓存行,而不是写回共享的外部缓存然后从那里读取。链接的 wiki 文章有更多细节,但基本上是关于共享脏数据。 O拥有状态会跟踪哪个缓存负责写回脏数据。

    MESIF 允许缓存F将干净缓存行的副本转发到另一个缓存,而不是其他缓存必须从内存中重新读取它以获取另一个共享副本。 (英特尔,因为 Nehalem 已经为所有内核使用了一个大型共享 L3 缓存,所以在检查内存之前,所有请求最终都由一个 L3 缓存支持,但这是针对一个套接字上的所有内核。转发适用于多套接字系统中的套接字。在 Skylake-AVX512 之前,包含大型共享 L3 缓存。Which cache mapping technique is used in intel core i7 processor?)

    维基百科的 MESIF 文章(上面链接)对 MOESI 和 MESIF 进行了一些比较。


    在某些情况下,AMD 在 2 个内核之间共享同一缓存线的延迟较低。例如,请参阅this graph of inter-core latency,了解 Ryzen 与四核 Intel 与多核 Intel(环形总线:Broadwell)与 Skylake-X(最差)。

    很明显,英特尔和 AMD 设计之间存在许多影响内核间延迟的其他差异,例如英特尔使用环形总线或网状网络,而 AMD 使用交叉开关 /小集群的全对全设计。 (例如,Ryzen 具有共享 L3 的 4 个核心集群。这就是为什么 Ryzen 的核心间延迟从核心 #3 到核心 #4 又迈出了一步。)

    顺便说一句,请注意,对于 Intel 和 AMD,同一物理内核上的两个逻辑内核之间的延迟要低得多。 What are the latency and throughput costs of producer-consumer sharing of a memory location between hyper-siblings versus non-hyper siblings?.

    我没有寻找任何在其他相似模型上模拟 MESI 与 MOESI 的学术论文。

    MESIF 与 MOESI 的选择可能会受到其他设计因素的影响;英特尔使用包含标签的大型 L3 共享缓存作为一致性流量的支持,这是他们对 MOESI 解决的同一问题的解决方案:内核之间的流量通过写回 L3 得到有效处理,然后将数据从 L3 发送到请求内核,如果核心在私有 L2 或 L1d 中的线路处于修改状态。

    IIRC,一些 AMD 设计(如 Bulldozer 系列的某些版本)没有由所有内核共享的最后一级缓存,而是由多对内核共享更大的 L2 缓存。不过,性能更高的 BD 系列 CPU 也确实有共享缓存,因此至少干净的数据可以在 L3 中命中。

    【讨论】:

    • re: AMD 使用 MOESI,Intel 使用 MESIF:Intel 一直使用 SI 作为 L1 指令缓存以及 L1 数据和 L2 缓存的 MESI,直到 Pentium 4 中所有缓存都使用 MESI。至少从 Nehalem 到 Haswell,使用了 MESIF。在 Haswell-EP 中,实现了 MESIF 的复杂变体。我不确定更新的处理器。自 AMD K8 到 AMD Bulldozer 以来,大多数(如果不是全部)AMD 处理器都使用 MOESI。但是,从 AMD Bulldozer 开始,使用了更复杂的 protocol
    • AMD 不拥有 MOESI 的专利。显然没有人这样做。许多Oracle processors 使用 MOESI(有时使用不同缓存级别的 MESI)。英特尔拥有 MESIF 并仍在使用它的事实表明,英特尔对它非常满意并正在对其进行变体,而其他供应商则坚持使用 MOESI。
    • 您提到 Skylake 上的 L3 不包括在内。我很好奇在什么情况下 l3 将包括 l2 有什么以及什么时候没有。谢谢
    • @HCSF:也不是排他性的 (NINE),所以在 L1/L2/L3 未命中后,它们都会包含一行。但是可以从 L3 中逐出一条线(例如,为另一个内核的负载缺失腾出空间),而无需将其从内部缓存中逐出。请注意,这适用于 Skylake-server(SKX 和 AVX512),不适用于 Skylake-client (SKL)。
    • 我认为 F 实际上仅在您拥有像您提到的包容性 L3 时才对多套接字有用,因为不需要为共享状态设置专用内核,因为它是从 L3 中读取的.
    猜你喜欢
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2017-01-03
    相关资源
    最近更新 更多