mbe*_*dev 9 multithreading caching multicore state-machine false-sharing
对于我的学士论文,我必须分析虚假共享对多核系统的影响.因此,我在维基百科上看到了不同的缓存一致性协议类型,英特尔已经开发出MESIF缓存一致性协议,但英特尔也没有使用此信息.
查看手册英特尔®64和IA-32架构开发人员手册:Vol.3A我找不到任何关于MESIF但是MESI协议的内容.所以问题是,英特尔不使用自己的缓存一致性协议.或者我在错误的文件中搜索它.
小智 9
英特尔使用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)具有或不具有在超传输探头过滤.但这些协议用于芯片间通信(AMD推土机插座在MCM中有2个芯片).据我所知,在两个处理器中,芯片内部的一致性都是在L3缓存中进行的.
您可以用来检查NUMA性能问题的工具是numagrind:http://dx.doi.org/10.1109/IPDPS.2011.100
此答案适用于具有包容性 L3 缓存和 Sandy Bridge 式环形总线的 Intel CPU(即不是 Nehalem/Westmere EX 总线),这是 Sandy Bridge 之后直到 Skylake 服务器的所有服务器 CPU。
人们普遍认为Intel使用MESIF,但AFAICT,核心中不存在F状态。核心 (*) 行将处于 MESI 状态,因为使用包含式 L3 缓存,如果数据存在于 1 个以上的核心中,则会直接从 L3 中读取数据。不需要专用的 F 状态。然而,它确实存在于具有非包容性 L3 的 Skylake 服务器的内核中。
内核将 IDI 数据包发送到处理该地址范围的 L3 缓存切片 Cbo(控制器)(它基于地址的缓存集选择器位的上部的哈希函数以 CBos 的数量为模)进行交错。当核心请求一条不属于核心的线路时,核心会发送 DRd 数据包,如果其他核心中存在该线路,则它会以 S 状态接收该数据包,如果其他核心中不存在该数据包,则它会以 E 状态接收该数据包。L3 缓存切片 Cbo 使用线路的监听过滤器来决定是将它返回到 E 状态(没有其他内核,但在 L3/不在 L3 中)或 S 状态(在 L3 中并存在于另一个内核中;发送降级到那个核心 E->S)。如果某行的第一个请求不属于其他内核而不是 S 状态,则将其默认为 E 状态是一种优化,因为内核不必执行 RFO,
当线路根本没有被拥有时,一个 RFO 数据包被发送到 LLC 切片 Cbo,因为内核即将对其执行写操作,在这种情况下,如果它拥有超过一个核,或者一个snoop如果只在一个核中就失效了,因为CBo不知道这个有没有被修改,以及跨socket监听拥有地址的家乡代理,将线路返回给核心以及升级它。当该线路在 S 状态下拥有时,它会向WiLL3 切片 CBo发送写无效,这将使其他核心无效并将请求者升级到 E 状态。它会导致 S 状态更改为 E 并使其他内核无效。想必是在包里有一个标志表示它处于S状态,以消除不必要的负载。
F 状态仅适用于其他缓存代理和归属节点中的归属代理之间的多套接字侦听上下文中的 L3 缓存(缓存代理),因为归属代理 HitME 缓存不包含任何套接字的 L3。在没有目录的源侦听模式下,如果广播侦听具有 F 状态而不是导致多个响应,则只有一个缓存代理(NUMA 节点中的一组 CBos)将响应广播侦听。在具有目录缓存 + 目录的家庭监听模式中,目录缓存 + 目录位意味着在可能的情况下,无论如何只会发送一个请求,但是当它没有被缓存并发送广播时,F 状态会有所帮助,因为那里不是多重响应。因为缓存可能会单方面丢弃(无效)处于 S 或 F 状态的一行,所以可能没有缓存在 F 状态有副本,即使存在 S 状态的副本。在这种情况下,对行的请求从主内存得到满足(效率较低,但仍然正确)(因为当它们处于 S 状态时没有缓存代理会响应)。
“归属节点归属代理”是SAD解码的相干DRAM地址交织到的归属代理(即拥有该地址的归属代理)。
2014 年至强 E5 v2 性能监控手册中的 IDI 操作码(用于核心 <-> 非核心通信)未显示任何 F 状态(只有 QPI 操作码显示,其中涉及缓存代理和归属代理,并且用于非核心< ->uncore 通信),但 2017 年的性能监控手册显示了 IDI 操作码处理 F 状态,即 WbEFtoE 和 WbEFtoI 并谈论“核心”。在文档中搜索 skylake 会显示 skylake server 的结果,其中包含一个非包容性的 L3,它说明了一切。
因为 L2 在最近的 Intel 台式机 CPU 上是非包容性的,这可能意味着 L1i 和 L1d 实现了自己的 F 状态,它可以由它支持的 2 个缓存之间的 L2 内部使用(L1i、L1d 由两个超线程共享)核心)用于缓存未命中,尽管如果 L1d 和 L1i 缓存能够在内部相互查询/无效,则这不是必需的,这似乎比转到 L2 然后 L2 必须查询请求并非源自的缓存更快,并且只有一个其他缓存要查询,尽管我实际上不认为 L1i 和 L1d 是一致的,除了存在的任何 SMC 实现(自我修改代码),我不知道详细信息。L2 缓存当然不需要 F 状态。