英特尔和AMD使用哪种缓存一致性协议?

22

我本科毕业论文需要分析False Sharing对多核系统的影响。在查找不同的高速缓存一致性协议类型时,我在维基百科上发现Intel开发了MESIF高速缓存一致性协议,但没有信息表明Intel也使用了它。

在查阅Intel® 64 和 IA-32 架构软件开发者手册: Vol. 3A后,我没有找到有关MESIF的内容,只有MESI协议。因此,问题是,Intel是否使用自己的高速缓存一致性协议?或者我在错误的文档中查找?


你的问题是什么?“文档在哪里?”如果这是一个元问题。你想要找到什么信息?在谷歌上可以找到的MESIF相关信息可能就是所有公开的信息了。 - Jeff Hammond
2个回答

17

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

您可以使用numagrind工具检查NUMA性能问题:http://dx.doi.org/10.1109/IPDPS.2011.100


在现实世界的应用中,MESIF与MOESI在延迟和带宽方面是否有任何基准测试数据? - Tamas Ionut
取决于你所谓的真实世界应用是什么。在这篇论文中,作者使用了Splash 2,它主要由高性能计算和计算机图形程序组成。 - Bruno Coutinho

12

这个答案适用于具有包含式L3缓存和Sandy Bridge风格环形总线(即不是Nehalem / Westmere EX的)Intel CPU,这涵盖了从Sandy Bridge到Skylake服务器之后的所有服务器CPU。

广泛认为Intel使用MESIF,但据我所知,核心中不存在F状态。由于有包括式L3高速缓存,如果数据存在于多个核心中,则直接从L3中读取,因此核心 (*) 线路将处于MESI状态。无需专门的F状态。但它确实存在于Skylake服务器上的核心中,该服务器具有非包含式L3。

核心将 IDI 数据包发送到处理该地址范围的 L3 缓存片 Cbo(控制器)(它根据地址的高位缓存组选择器比特的哈希函数对其进行交错)。当核心请求不属于自己的行时,会发送 DRd 数据包,如果它在其他核心中存在,则以 S 状态接收它,如果在其他核心中不存在,则以 E 状态接收它。L3 缓存片 Cbo 使用嗅探过滤器来决定是否以 E 状态(在 L3 中没有其他核心但在 L3/不在 L3 中)或 S 状态(在 L3 中,并存在于另一个核心中;向该核心发送降级 E->S )返回该行。将第一次请求行的默认状态设为 E 状态而不是 S 状态是一种优化,因为核心不必执行 RFO,略微减少了 L3 缓存片发送降级到核心的负担(与执行 RFO 相比,这只是背景中的额外流量)。

当核心要对未被占用的行执行写操作时,会向LLC切片CBo发送RFO数据包。在这种情况下,如果该行被多个核心占用,则CBo需要发送使其失效的无效化信号;如果该行只被一个核心占用,则需要发送嗅探无效化信号。因为CBo不知道该行是否被修改,还需要嗅探跨套接字拥有地址的主代理,并将该行返回给核心并将其升级。当该行处于S状态时,它会向L3切片CBo发送写无效化(WiL),然后使其他核心失效并将请求者升级到E状态。这将导致S状态更改为E状态并使其他核心无效。假设数据包中有一个标志来指示该行处于S状态,以消除不必要的负载。

F状态仅适用于L3缓存(缓存代理)在多个缓存代理和主节点中的多插座窃听上下文中,因为主节点HitME缓存不包含任何插座的L3。在没有目录的源窃听模式下,只有一个缓存代理(NUMA节点中CBos的集体集合)会响应广播窃听,如果它具有F状态,而不是导致多个响应。在带目录缓存+目录的本地窥探模式下,目录缓存+目录位表示在可能的情况下,仅会发送一次请求,但当未缓存且发送了广播时,F状态有助于减少响应数。由于缓存可以单方面丢弃(失效)S或F状态中的行,即使S状态中存在副本,也可能没有任何缓存具有F状态中的副本。在这种情况下,从主存储器中满足(效率较低但仍然正确)该行的请求(因为当它们处于S状态时,没有缓存代理会响应)。

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

在2014年Xeon E5 v2的性能监测手册中,IDI操作码(用于核心<->不核心通信)没有显示任何F状态(仅QPI操作码显示,这些操作码涉及缓存代理和主机代理,并用于不核心<->不核心通信),但是在2017年的性能监测手册中,IDI操作码也处理F状态,例如WbEFtoE和WbEFtoI,并谈到“内核”。搜索文件以查找Skylake时,会出现Skylake服务器的结果,其中包含一个非全包含的L3,这说明了一切。

由于近期Intel桌面CPU上的L2是非全包含的,这可能意味着L1i和L1d实现了它们自己的F状态,这些F状态可以在L2支持的两个高速缓存之间(L1i、L1d,这两个高速缓存由同一核心中的超线程共享)用于缓存失效。尽管这在L1d和L1i高速缓存能够互相查询/使无效的情况下并不必要,这似乎比去L2然后L2必须查询请求未来源的缓存更快,只有另一个缓存需要查询,虽然我实际上认为L1i和L1d并不是一致的,除了存在的任何SMC实现(自修改代码),我不知道详细信息。但L2高速缓存肯定不需要F状态。


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