在我的单身汉论文中,我必须分析虚假共享对多核系统的影响。因此,寻找不同的缓存一致性协议类型,我在维基百科上看到,英特尔已经开发了MESIF高速缓存-一致性-协议,但没有信息表明英特尔也使用这个。
看看手册Intel 64和IA-32建筑开发商手册:第3A卷,我找不到关于MESIF的任何东西,只有MESI-协议。所以问题是,英特尔不使用自己的缓存一致性协议吗?还是我在错误的文件里搜索了它。
发布于 2015-09-16 19:06:24
发布于 2020-05-10 20:48:30
这个答案适用于具有包容性L3缓存和Sandy风格的环形总线(即Nehalem/Westmere )的Intel CPU,它是继Sandy之后直到Skylake服务器的所有服务器CPU。
人们普遍认为英特尔使用MESIF,但AFAICT,F状态并不存在于核心。核心(*)行将处于MESI状态,因为在包含L3缓存的情况下,如果数据存在于多个核心中,则直接从L3读取数据。不需要专用的F状态。然而,它确实存在于skylake服务器上的内核中,该服务器具有非包含性的L3。
核心将IDI数据包发送到处理该地址范围的L3缓存片Cbo (控制器)(基于地址的高速缓存集选择器位的哈希函数调制CBos的数量)。当核心请求一个不属于核心的行时,它会发送一个DRd数据包,如果它在其他内核中,它会以S状态接收它,或者如果它在其他内核中不存在,则接收它。L3缓存片Cbo使用行的snoop过滤器来决定是以E状态(没有其他内核,但不是在L3/非L3状态)还是以S状态(在L3中,在另一个内核中;向该核心E->S发送降级)。如果一条线的第一个请求默认为E状态(如果它不是其他内核所拥有的,而不是S状态),则这是一种优化,因为核心不需要执行RFO,在L3缓存片的微小缺陷中,必须将降级发送到内核(这只是背景中与执行RFO可能导致的实际延迟相比的额外通信量)。
当线路根本不属于LLC片Cbo时,RFO数据包会被发送到LLC片CBo,因为写将由内核执行,在这种情况下,如果它在多个核心中拥有,则CBo需要发送无效消息,或者如果它只在一个核心中拥有,则发送一个窥探无效信息,因为CBo不知道是否修改了它,并且窥探拥有地址交叉套接字的家庭代理,并将该行返回给内核并进行升级。当该行处于S状态时,它将向L3片CBo发送写无效的CBo,这将使其他内核失效,并将请求者升级到E状态。它导致S态变为E态,使其它核失效。大概有一个标志来指示它在数据包中处于S状态,以消除不必要的负载。
F状态仅适用于其他缓存代理和主节点中的主代理之间的多套接字窥探上下文中的L3缓存(缓存代理),因为主代理HitME缓存不包括任何套接字的L3。在没有目录的源窥探模式中,只有一个缓存代理( NUMA节点中的集合CBos )将响应具有F状态的广播窥探,而不是产生多个响应。在带有目录缓存+目录的家庭窥探模式中,目录缓存+目录位意味着在可能的情况下,无论如何只发送一个请求,但是当没有缓存并发送广播时,F状态会有所帮助,因为没有多个响应。由于缓存可能单方面地丢弃(无效)S或F状态中的一行,所以可能没有缓存具有F状态的副本,即使存在S状态的副本。在这种情况下,从主内存满足对行的请求(效率较低,但仍然是正确的)(因为当它们处于S状态时没有缓存代理响应)。
“归属节点归属代理”是SAD解码的相干DRAM地址交织到的归属代理(即拥有该地址的归属代理)。
在2014年的Xeon E5 v2s性能监测手册中,IDI操作码(用于核心<->非核心通信)中没有显示任何F状态(只有QPI操作码显示任何F状态,只有QPI操作码可以讨论缓存代理和本地代理,也用于uncore<->非核心通信),但2017年的性能监视手册显示,IDI操作码处理F状态,即WbEFtoE和WbEFtoI,以及谈论‘core’。搜索skylake文档会显示skylake服务器的结果,该服务器包含一个非包容的L3,它说明了一切。
由于L2在最近的英特尔桌面CPU上是不包括在内的,这可能意味着L1i和L1d实现了自己的F状态,这可以在它所支持的两个缓存之间( L1i,由内核中的两个超线程共享的L1d )内部用于缓存缺失,尽管如果L1d和L1i缓存能够在内部查询/失效,这似乎比去L2和L2查询请求所没有的缓存更快,而且只有另一个缓存需要查询,尽管我实际上并不认为L1i和L1d是一致的,除了存在任何SMC实现(自修改代码)之外,我不知道其中的细节。当然,L2缓存不需要F状态。
https://stackoverflow.com/questions/31876808
复制相似问题