英特尔和 AMD 使用哪种缓存一致性协议?
Which cache-coherence-protocol does Intel and AMD use?
为了完成我的学士论文,我必须分析错误共享对多核系统的影响。因此,寻找我在维基百科上遇到的不同缓存一致性协议类型,英特尔开发了 MESIF 缓存一致性协议,但没有信息表明英特尔也使用它。
查看手册 Intel® 64 and IA-32 Architectures Developer's Manual: Vol. 3A 除了 MESI 协议,我找不到任何关于 MESIF 的信息。所以问题是,英特尔不使用自己的缓存一致性协议吗?还是我在错误的文档中搜索它。
英特尔使用 MESIF 协议 (http://www.realworldtech.com/common-system-interface/5/, https://en.wikipedia.org/wiki/MESIF_protocol) in QuickPath and AMD uses MOESI protocol (https://en.wikipedia.org/wiki/MOESI_protocol, http://www.m5sim.org/MOESI_hammer),在 HyperTransport 中使用或不使用 Probe Filter。但这些协议用于芯片间通信(AMD 推土机插座在 MCM 中有 2 个芯片)。据我所知,在这两种处理器中,芯片内一致性都是在 L3 缓存中实现的。
可用于检查 NUMA 性能问题的工具是 numagrind:
http://dx.doi.org/10.1109/IPDPS.2011.100
此答案适用于具有包容性 L3 缓存和 Sandy Bridge 样式环形总线的英特尔 CPU(即不是 Nehalem/Westmere EX 那种),这是 Sandy Bridge 之后直到 Skylake 服务器的所有服务器 CPU。
普遍认为英特尔使用MESIF,但AFAICT,内核中不存在F状态。核心 (*) 行将处于 MESI 状态,因为使用包容性 L3 缓存,如果数据存在于 1 个以上的核心中,则会直接从 L3 中读取数据。不需要专用的 F 状态。然而,它确实存在于具有非包容性 L3 的 skylake 服务器的核心中。
内核将 IDI 数据包发送到处理该地址范围的 L3 缓存片 Cbo(控制器)(它基于地址的缓存集选择器位的上部部分的哈希函数交错社区组织)。当内核请求一条不属于内核的线路时,它会发送 DRd 数据包,如果它存在于其他内核中,它会以 S 状态接收它,如果它不存在于其他内核中,则它会以 E 状态接收它。 L3缓存片Cbo使用监听过滤器来决定是return它处于E状态(不在其他核心但在L3中/不在L3中),还是S状态(在L3中并存在于另一个核心中) ; 发送降级到该核心 E->S)。通过使行的第一个请求默认为 E 状态(如果它不属于其他内核而不是 S 状态)是一种优化,因为内核不必执行 RFO,L3 缓存片的轻微缺陷具有将降级发送到核心(与执行 RFO 会导致的实际延迟相比,这只是后台的额外流量)。
当线路根本不被拥有时,RFO 数据包被发送到 LLC 切片 Cbo,因为核心即将对其执行写入,在这种情况下,CBo 需要发送无效,如果它拥有多个核心,或者如果它只拥有一个核心,则监听无效,因为 CBO 不知道这是否被修改,以及监听拥有跨套接字地址的归属代理,并且return是通往核心的线路,也是对其进行升级。当线路拥有处于S状态时,它会向L3切片CBo发送一个write invalidate WiL
,然后它将使其他核心失效并将请求者升级到E状态。它导致 S 状态更改为 E 并使其他核心无效。想必在数据包中有一个标志表示它处于S状态,以消除不必要的负载。
F状态只针对L3缓存(缓存代理)在其他缓存代理和本地节点中的本地代理之间的多套接字侦听上下文中,因为本地代理HitME缓存不包含任何插座的L3。在没有目录的源监听模式下,只有一个缓存代理(NUMA 节点中的一组 CBos)会响应广播监听(如果它具有 F 状态)而不是导致多个响应。在具有目录缓存 + 目录的 home snoop 模式中,目录缓存 + 目录位意味着在可能的情况下,无论如何只会发送一个请求,但是当它没有缓存并且发送广播时,F 状态会有所帮助,因为不是多重反应。因为高速缓存可能单方面丢弃(无效)处于 S 或 F 状态的行,所以可能没有高速缓存具有处于 F 状态的副本,即使存在处于 S 状态的副本。在这种情况下,来自主内存的对行的请求得到满足(效率较低,但仍然正确)(因为当它们处于 S 状态时没有缓存代理会响应)。
'home node home agent' 是 SAD 解码的相干 DRAM 地址交织到的归属代理(即拥有该地址的归属代理)。
Xeon E5 v2 的 2014 年性能监控手册中的 IDI 操作码(用于核心<->非核心通信)不显示任何 F 状态(只有 QPI 操作码显示,它谈论缓存代理和本地代理,并且用于非核心<->非核心通信),但 2017 年的性能监控手册显示 IDI 操作码也处理 F 状态,即 WbEFtoE 和 WbEFtoI 并谈论 'cores'。在文档中搜索 skylake 显示 skylake server 的结果,其中包含一个非包容性 L3,这说明了一切。
因为 L2 在最近的 Intel 台式机 CPU 上是不包含的,它 可能 意味着 L1i 和 L1d 实现了它们自己的 F 状态,这些状态可以被 L2 在内部使用它支持 2 个缓存(L1i、L1d,由核心中的两个超线程共享)用于缓存未命中,尽管如果 L1d 和 L1i 缓存能够在内部 query/invalidate 彼此,则这不是必需的,这似乎比去到 L2,然后 L2 必须查询请求并非源自的缓存,并且只有一个其他缓存要查询,尽管我实际上不认为 L1i 和 L1d 是连贯的,除了存在的任何 SMC 实现(自修改代码),我不知道其中的细节。 L2缓存当然不需要F状态。
为了完成我的学士论文,我必须分析错误共享对多核系统的影响。因此,寻找我在维基百科上遇到的不同缓存一致性协议类型,英特尔开发了 MESIF 缓存一致性协议,但没有信息表明英特尔也使用它。
查看手册 Intel® 64 and IA-32 Architectures Developer's Manual: Vol. 3A 除了 MESI 协议,我找不到任何关于 MESIF 的信息。所以问题是,英特尔不使用自己的缓存一致性协议吗?还是我在错误的文档中搜索它。
英特尔使用 MESIF 协议 (http://www.realworldtech.com/common-system-interface/5/, https://en.wikipedia.org/wiki/MESIF_protocol) in QuickPath and AMD uses MOESI protocol (https://en.wikipedia.org/wiki/MOESI_protocol, http://www.m5sim.org/MOESI_hammer),在 HyperTransport 中使用或不使用 Probe Filter。但这些协议用于芯片间通信(AMD 推土机插座在 MCM 中有 2 个芯片)。据我所知,在这两种处理器中,芯片内一致性都是在 L3 缓存中实现的。
可用于检查 NUMA 性能问题的工具是 numagrind: http://dx.doi.org/10.1109/IPDPS.2011.100
此答案适用于具有包容性 L3 缓存和 Sandy Bridge 样式环形总线的英特尔 CPU(即不是 Nehalem/Westmere EX 那种),这是 Sandy Bridge 之后直到 Skylake 服务器的所有服务器 CPU。
普遍认为英特尔使用MESIF,但AFAICT,内核中不存在F状态。核心 (*) 行将处于 MESI 状态,因为使用包容性 L3 缓存,如果数据存在于 1 个以上的核心中,则会直接从 L3 中读取数据。不需要专用的 F 状态。然而,它确实存在于具有非包容性 L3 的 skylake 服务器的核心中。
内核将 IDI 数据包发送到处理该地址范围的 L3 缓存片 Cbo(控制器)(它基于地址的缓存集选择器位的上部部分的哈希函数交错社区组织)。当内核请求一条不属于内核的线路时,它会发送 DRd 数据包,如果它存在于其他内核中,它会以 S 状态接收它,如果它不存在于其他内核中,则它会以 E 状态接收它。 L3缓存片Cbo使用监听过滤器来决定是return它处于E状态(不在其他核心但在L3中/不在L3中),还是S状态(在L3中并存在于另一个核心中) ; 发送降级到该核心 E->S)。通过使行的第一个请求默认为 E 状态(如果它不属于其他内核而不是 S 状态)是一种优化,因为内核不必执行 RFO,L3 缓存片的轻微缺陷具有将降级发送到核心(与执行 RFO 会导致的实际延迟相比,这只是后台的额外流量)。
当线路根本不被拥有时,RFO 数据包被发送到 LLC 切片 Cbo,因为核心即将对其执行写入,在这种情况下,CBo 需要发送无效,如果它拥有多个核心,或者如果它只拥有一个核心,则监听无效,因为 CBO 不知道这是否被修改,以及监听拥有跨套接字地址的归属代理,并且return是通往核心的线路,也是对其进行升级。当线路拥有处于S状态时,它会向L3切片CBo发送一个write invalidate WiL
,然后它将使其他核心失效并将请求者升级到E状态。它导致 S 状态更改为 E 并使其他核心无效。想必在数据包中有一个标志表示它处于S状态,以消除不必要的负载。
F状态只针对L3缓存(缓存代理)在其他缓存代理和本地节点中的本地代理之间的多套接字侦听上下文中,因为本地代理HitME缓存不包含任何插座的L3。在没有目录的源监听模式下,只有一个缓存代理(NUMA 节点中的一组 CBos)会响应广播监听(如果它具有 F 状态)而不是导致多个响应。在具有目录缓存 + 目录的 home snoop 模式中,目录缓存 + 目录位意味着在可能的情况下,无论如何只会发送一个请求,但是当它没有缓存并且发送广播时,F 状态会有所帮助,因为不是多重反应。因为高速缓存可能单方面丢弃(无效)处于 S 或 F 状态的行,所以可能没有高速缓存具有处于 F 状态的副本,即使存在处于 S 状态的副本。在这种情况下,来自主内存的对行的请求得到满足(效率较低,但仍然正确)(因为当它们处于 S 状态时没有缓存代理会响应)。
'home node home agent' 是 SAD 解码的相干 DRAM 地址交织到的归属代理(即拥有该地址的归属代理)。
Xeon E5 v2 的 2014 年性能监控手册中的 IDI 操作码(用于核心<->非核心通信)不显示任何 F 状态(只有 QPI 操作码显示,它谈论缓存代理和本地代理,并且用于非核心<->非核心通信),但 2017 年的性能监控手册显示 IDI 操作码也处理 F 状态,即 WbEFtoE 和 WbEFtoI 并谈论 'cores'。在文档中搜索 skylake 显示 skylake server 的结果,其中包含一个非包容性 L3,这说明了一切。
因为 L2 在最近的 Intel 台式机 CPU 上是不包含的,它 可能 意味着 L1i 和 L1d 实现了它们自己的 F 状态,这些状态可以被 L2 在内部使用它支持 2 个缓存(L1i、L1d,由核心中的两个超线程共享)用于缓存未命中,尽管如果 L1d 和 L1i 缓存能够在内部 query/invalidate 彼此,则这不是必需的,这似乎比去到 L2,然后 L2 必须查询请求并非源自的缓存,并且只有一个其他缓存要查询,尽管我实际上不认为 L1i 和 L1d 是连贯的,除了存在的任何 SMC 实现(自修改代码),我不知道其中的细节。 L2缓存当然不需要F状态。