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

时间:2015-08-07 11:37:27

标签: multithreading caching multicore state-machine false-sharing

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

查看手册product_attribute.list我找不到任何关于MESIF但MESI协议的内容。所以问题是,英特尔是否使用自己的缓存一致性协议。或者我在错误的文件中搜索它。

2 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:2)

此答案适用于具有内置L3缓存和Sandy Bridge样式环形总线(即不是Nehalem / Westmere EX总线)的Intel CPU,它是Sandy Bridge之后直到Skylake服务器的所有服务器CPU。

众所周知,英特尔使用MESIF,但AFAICT核心中不存在F状态。核心(*)行将处于MESI状态,因为如果包含一个以上的L3高速缓存,则数据会直接从L3中读取,如果它们存在于多个内核中。不需要专用的F状态。

核心将IDI数据包发送到L3缓存片。当核心请求不属于该核心的线路时,DRd数据包将由核心发送,如果其他核心中存在该DRd数据包,则以S状态接收该数据包;如果其他核心中不存在该数据包,则以E接收该数据包。 L3缓存切片使用该行的探听过滤器来决定是返回E状态(在其他任何内核中,但不在L3中/不在L3中)还是S状态(在L3中并存在于另一个内核中;将降级发送给该核心E-> S)。如果行的第一个请求不是由其他内核拥有而不是由S状态设置为默认状态为E状态,这是一种优化,因为该内核不必执行RFO,这在L3缓存切片具有将降级发送到核心(与执行RFO的实际延迟相比,这只是后台的额外流量)。

不拥有该线路时,将发送RFO数据包,即使其他内核包含S状态,也将请求RFO数据包排他,从而使它们无效,因为该内核将要对其进行写操作。当线路处于S状态且准备写入该线路时,也会发送该消息。这导致将S状态更改为E,并使其他内核无效。可能在包中有一个标志来指示它处于S状态,以消除不必要的负载。

如果该行不在L3高速缓存中(假定使用HS模式,使用目录+ OSB + HitME高速缓存),则请求高速缓存行的高速缓存代理将不会广播侦听。相反,它将请求转发到归属节点中的HA,HA然后将侦听消息发送到可能拥有该行的其他缓存代理。 Haswell-EP还包括目录缓存(HitMe),以加速目录查找。但是,每个HA只有14 KiB,因此这些缓存非常小。因此,只有频繁在节点之间传输的缓存行才存储在HitMe缓存中。目录高速缓存存储8位向量,该向量指示8个节点中的哪一个具有高速缓存行的副本。当请求到达本地节点时,将检查目录缓存。如果它包含所请求行的条目,则按目录缓存指示发送监听。如果请求在目录高速缓存中未命中,则HA从内存中的地址获取并读取目录位,并在某些套接字中对其进行修改后相应地发送监听(HA支持一个附加的2位“目录”,该目录随每个存储高速缓存行以DRAM ECC位表示。该目录用于过滤对远程套接字或节点控制器的侦听;侦听成功后,它将在目录高速缓存中分配一个条目;首先侦听目录高速缓存,然后侦听目录(如果目录不可用)。然后必须广播,否则缓存一致性将被破坏,因为对L1缓存的写入应该是全局可见的。该目录编码3种状态:在任何节点中均不存在,在1个节点中进行修改,在多个节点中共享)或直接发送数据如果不需要侦听且不分配条目,则从内存中获取。

在其他缓存代理与本地节点中的本地代理之间进行多套接字侦听的情况下,F状态仅用于L3缓存(缓存代理)。在没有目录的源侦听模式下,只有一个座席具有F状态才能响应广播侦听,而不是导致多个响应。在具有目录高速缓存+目录的本地侦听模式下,目录高速缓存+目录位意味着在可能的情况下,无论如何仅将发送一个请求,但是当不对其进行高速缓存并发送广播时,F状态会有所帮助。因为缓存可能会单方面丢弃(或无效)处于S或F状态的行,所以即使存在S状态的副本,也可能没有缓存具有F状态的副本。在这种情况下,来自主内存的行请求得到了满足(效率较低,但仍然正确)(因为当它们处于S状态时,没有缓存代理会响应)。

我认为“归属节点归属代理”是SAD解码的DRAM地址与之交织的归属代理(即拥有该地址的归属代理)。

Xeon E5 v2的2014年性能监视手册中的

IDI操作码(用于L2 <-> L3通信)不显示任何F状态(仅QPI操作码显示,这涉及缓存代理和本地代理,并且(L3→L3通讯),但是2017年的性能监控手册显示了IDI操作码也处理F状态,即WbEFtoE和WbEFtoI并讨论“核心”。在文档中搜索skylake会显示skylake服务器的结果,该服务器包含一个非包容性L3,说明了一切。

(*)因为L2在Intel上不包含在内,所以可以表示L1i和L1d实现自己的F状态,这可由L2在其支持的2个缓存之间内部使用( L1i,L1d(由内核中的两个超线程共享)用于高速缓存未命中,尽管如果L1d和L1i高速缓存能够在内部相互查询/使之无效,则这不是必需的,这似乎比去L2和L2更快查询不是来自请求的缓存,而且由于无论如何也只有一个其他缓存要查询,它甚至不需要F状态。二级缓存当然不需要F状态