20

对于我的学士论文,我必须分析虚假共享对多核系统的影响。因此,寻找我在维基百科上遇到的不同缓存一致性协议类型,英特尔开发了 MESIF 缓存一致性协议,但没有信息表明英特尔也使用它。

查看手册英特尔® 64 和 IA-32 架构开发人员手册:卷。3A除了 MESI 协议,我找不到任何关于 MESIF 的信息。所以问题是,英特尔不使用自己的缓存一致性协议。还是我在错误的文档中搜索它。

4

2 回答 2

16

Intel 在 QuickPath 中使用 MESIF 协议 ( http://www.realworldtech.com/common-system-interface/5/ , https://en.wikipedia.org/wiki/MESIF_protocol ) 而 AMD 使用 MOESI 协议 ( https:// en.wikipedia.org/wiki/MOESI_protocol , http://www.m5sim.org/MOESI_hammer)在 HyperTransport 中带有或不带有探针过滤器。但这些协议用于芯片间通信(一个 AMD 推土机插座在 MCM 中有 2 个芯片)。据我所知,在这两个处理器中,芯片内的一致性都是在 L3 缓存中实现的。

可用于检查 NUMA 性能问题的工具是 numagrind: http ://dx.doi.org/10.1109/IPDPS.2011.100

于 2015-09-16T19:06:24.670 回答
9

此答案适用于具有包容性 L3 缓存和 Sandy Bridge 样式环形总线(即不是 Nehalem/Westmere EX 之一)的 Intel CPU,这是从 Sandy Bridge 到 Skylake 服务器之前的所有服务器 CPU。

普遍说Intel用的是MESIF,但是AFAICT,内核中不存在F状态。核心 (*) 行将处于 MESI 状态,因为在包含 L3 缓存的情况下,如果数据存在于 1 个以上的核心中,则直接从 L3 中读取数据。不需要专用的 F 状态。但是,它确实存在于具有非包含 L3 的 Skylake 服务器的核心中。

内核将 IDI 数据包发送到处理该地址范围的 L3 缓存片 Cbo(控制器)(它基于地址的缓存集选择器位的上部的哈希函数以 CBo 的数量为模进行交错)。当核心请求一条不属于核心的线路时,核心会发送一个 DRd 数据包,如果它存在于其他核心中,它会以 S 状态接收它,或者如果它不存在于其他核心中,它会以 E 状态接收它。L3 高速缓存切片 Cbo 对线路使用 snoop 过滤器来决定是在 E 状态(在没有其他核心但在 L3 中/不在 L3 中)或 S 状态(在 L3 中并存在于另一个核心中;发送降级到那个核心 E->S)。通过使线路的第一个请求默认为 E 状态(如果它不属于其他核心而不是 S 状态)是一种优化,因为核心不必执行 RFO,

当线路完全不拥有时,RFO 数据包将发送到 LLC 切片 Cbo,因为内核即将对其执行写入,在这种情况下,如果 CBo 拥有超过一个核心,或者如果它只属于一个核心,则监听无效,因为 CBo 不知道这是否被修改,以及监听拥有地址跨套接字的家乡代理,并将线路返回给核心以及升级它。当线路在 S 状态下拥有时,它会向 L3 切片 CBo 发送写入无效WiL,然后它将使其他内核无效并将请求者升级到 E 状态。它导致 S 状态变为 E 并使其他内核无效。想必在数据包中有一个标志表明它处于S状态,以消除不必要的负载。

F 状态仅适用于其他缓存代理和主节点中的主代理之间的多套接字侦听上下文中的 L3 缓存(缓存代理),因为主代理 HitME 缓存不包含任何套接字的 L3。在没有目录的源侦听模式下,只有一个缓存代理(NUMA 节点中的一组 CBos)将响应广播侦听,如果它具有 F 状态,而不是导致多个响应。在具有目录缓存 + 目录的 home snoop 模式中,目录缓存 + 目录位意味着在可能的情况下,无论如何只会发送一个请求,但是当它没有被缓存并且发送广播时,F 状态会有所帮助,因为那里不是多重响应。因为缓存可能会单方面丢弃(无效)处于 S 或 F 状态的行,所以有可能没有缓存有处于 F 状态的副本,即使存在 S 状态的副本。在这种情况下,从主内存(因为没有缓存代理会在它们处于 S 状态时响应)满足对行的请求(效率较低,但仍然正确)。

“本地节点本地代理”是 SAD 解码的相干 DRAM 地址交错到的本地代理(即拥有该地址的本地代理)。

2014 年 Xeon E5 v2s 性能监控手册中的 IDI 操作码(用于核心<->非核心通信)没有显示任何 F 状态(只有 QPI 操作码有,它谈论缓存代理和本地代理,并且用于非核心< -> 非核心通信),但 2017 年性能监控手册显示 IDI 操作码也处理 F 状态,即 WbEFtoE 和 WbEFtoI 并谈论“核心”。在文档中搜索 skylake 会显示 skylake 服务器的结果,其中包含一个非包含的 L3,这说明了一切。

因为 L2 在最近的 Intel 台式机 CPU 上不包含在内,这可能意味着 L1i 和 L1d 实现了它们自己的 F 状态,这可以由 L2 在它支持的 2 个缓存之间在内部使用(L1i、L1d 由两个超线程共享核心)用于缓存未命中,尽管如果 L1d 和 L1i 缓存能够在内部相互查询/无效,则这不是必需的,这似乎比转到 L2 然后 L2 必须查询请求并非来自的缓存更快,并且只有一个其他缓存要查询,尽管我实际上不认为 L1i 和 L1d 是一致的,除了存在任何 SMC 实现(自我修改代码),我不知道细节。L2 缓存当然不需要 F 状态。

于 2020-05-10T20:48:30.070 回答