在Intel Core i3/i7中,缓存集合被驱逐后数据去哪里?

8
L1/L2缓存在英特尔中是包含的,L1/L2缓存是8路关联性,意味着在一个集合中存在8个不同的缓存行。缓存行作为一个整体操作,这意味着如果我想从缓存行中删除一些字节,整个缓存行将被删除,而不仅仅是我想删除的那些字节。我说得对吗?
现在,我的问题是每当一组中的缓存行通过某个其他进程或使用CLFLUSH(手动清除缓存行/块)被删除/淘汰时,系统是否会将该缓存行的淘汰数据存储在某个地方(任何缓冲区、寄存器等),以便下次可以从那个地方加载数据,以减少与从主内存或更高级别的缓存中加载数据相比的延迟,还是它总是简单地使缓存中的数据无效,并下次从更高级别的缓存中加载数据。
任何建议或文章链接将不胜感激。先谢谢了。
2个回答

6
L1/L2不一定是包含的,只有最后一级缓存已知是包含的,对于i7来说,就是L3。你说缓存行是基本缓存单元是正确的,为了填写新的缓存行(或作废单个缓存行时),必须抛弃整个缓存行。你可以在这里阅读更多信息 - http://www.tomshardware.com/reviews/Intel-i7-nehalem-cpu,2041-10.html 当移除一行时,采取的操作取决于其MESI状态(MESI及其派生物是缓存一致性维护协议)。如果该行被修改(“M”),则必须将数据“写回”到下一级缓存(如果未命中,则可能分配在那里,或者“写通”到下一级-取决于缓存维护的策略)。请注意,当到达最后一级缓存时,您必须命中,因为它是包容性的。从最后一级缓存中驱逐一行时-必须将其写入内存。无论哪种方式,未能写回修改的行将导致一致性丢失,这很可能会导致执行不正确。
如果该行没有被修改(无效,独占或共享),则CPU可以在不需要写回的情况下将其静默丢弃,从而节省带宽。顺便说一句,在更复杂的缓存协议(如MESIF或MOESI)中还有其他几种状态。
您可以通过谷歌搜索“缓存一致性协议”找到许多解释。如果您喜欢更可靠的来源,可以参考任何CPU架构或缓存设计教材,我个人推荐Hennessy&Patterson的“计算机体系结构,定量方法”,其中有一个关于缓存性能的整章,但这有点离题。
小更新:从Skylake开始,一些CPU(服务器片段)不再具有包容性L3,而是具有非包容性L3(以支持增加的L2)。这意味着干净的行也可能会在L2老化时被写回,因为L3通常不会保存它们的副本。
更多细节:https://www.anandtech.com/show/11550/the-intel-skylakex-review-core-i9-7900x-i7-7820x-and-i7-7800x-tested/4

感谢Leeor的回答。我得到了这个链接,在那里他们说L2和L3都是包容性的。http://www.bit-tech.net/hardware/cpus/2009/09/08/intel-core-i5-and-i7-lynnfield-cpu-review/我们如何确认我们自己系统中L1/L2/L3的包容性/排除性属性?有没有命令行方式或者我们需要遵循英特尔架构手册? - bholanath
这意味着干净的行也很可能被写回。你是不是指脏行更有可能直接进入DRAM,当从L2中驱逐出去?我认为SKX不会浪费带宽将干净的行写回。但无论如何,这很有趣。我本来以为L2驱逐仍然会在L3中分配,而不是绕过它,因此稍后读取该数据可能会在L3中命中。不这样做将使L3成为只读缓存,除了其他核心请求的脏行。 - Peter Cordes
@HadiBrais,一行干净的代码并不需要被删除以确保正确性,所以我在这里很小心——例如,一些死块预测机制可能会预测某些行可以被静默地丢弃。至于一致性的损失,我承认我的错误。保留M行而不阻塞其他读取操作将导致一致性问题。 - Leeor
关于驱逐 - 引用并不太有意义(如果一行被驱逐,它就...被驱逐了?),但文章没有提到死块预测。非包容性并不需要它,它只是允许高效地完成这项工作,因为您可以从L2中静默地删除行而不必担心写回。 - Leeor
1
@PeterCordes,你为什么不同意?请注意,我并没有说你总是分配驱逐,只是可能会这样做。实际行为很可能是基于预测的,可以从他们在最新(2020年)优化手册中的描述中推断出来:“根据访问模式、代码和数据访问的大小以及缓存块之间的核心共享行为,最后一级缓存可能会出现作为中间级缓存的受害者缓存”(https://software.intel.com/content/www/us/en/develop/download/intel-64-and-ia-32-architectures-optimization-reference-manual.html)。 - Leeor
显示剩余6条评论

3
L1/L2缓存在Intel处理器中具有包容性。就缓存包容性而言,Intel x86处理器分为以下几类:
1. 三级缓存:L3包含L2和L1。L2与L1是非包容性、非排他性的(NINE策略)。此类处理器包括以下处理器:(1)所有实现Core微架构的客户端处理器,包括Rocket Lake及以下,但不包括针对客户端市场的Core X和Xeon W处理器系列。这还包括面向客户端市场的Xeon W-10000系列。(2)所有实现Core微架构的服务器处理器,包括BDX及以下,以及(3)所有Xeon E3,Xeon E和Xeon W-1200处理器。
2. 两级缓存:L2与L1是非包容性、非排他性的(NINE策略)。所有Atom处理器(包括Tremont)属于此类。所有旧的Intel处理器(仅有两个缓存级别)也属于此类。
3. 两级缓存:L2包容L1D,且L1I是非包容性、非排他性的(NINE策略)。KNL和KNM处理器属于此类。对于KNC和KNF可用的信息显示,L2包容L1,尽管这可能不准确,L2在这些处理器上也可能仅包容L1D。有关MCDRAM的详细信息请参见下文。
4. 三级缓存:L3和L2都是非包容性、非排他性的(NINE策略)。此类处理器包括以下处理器:(1)所有具有三个缓存级别的Pentium 4处理器,(2)所有Xeon SP处理器的各代,(3)Xeon D-2100,Skylake Core X系列处理器,Skylake Xeon W系列处理器,它们都使用SKX未核心而不是SKL未核心,以及(4)所有Tiger Lake处理器。
5. Lakefield处理器具有三层缓存层次结构。4个Tremont内核共享一个NINE L2,而Sunny Cove内核有自己的NINE L2。这5个内核都共享一个LLC,可以配置为包容性或非包容性。
某些处理器具有L4缓存或内存侧缓存。这些缓存是非包容性的。在KNL和KNM中,如果MCDRAM完全或部分配置为运行在缓存模式下,则被修改的L2(因此也是L1)具有包容性,这意味着包容性仅适用于L2中的脏行(处于M一致状态)。对于支持Optane DIMM的CSL处理器,如果PMEM DIMM完全或部分配置为以缓存模式运行,则DRAM DIMM的工作方式如下:
根据Cascade Lake: Next Generation Intel Xeon Scalable Processor,Cascade Lake处理器使用了一种新颖的缓存管理方案,其中使用包含和非包含DRAM缓存的组合来减少DRAM写入时的带宽开销,同时消除在DRAM缓存中包含行从处理器缓存中逐出时管理失效的复杂性。
KNL / KNM中的MCDRAM缓存和CSL中的DRAM缓存不属于包容性、独占性和NINE的任何传统包容性类别。我认为我们可以将它们描述为具有“混合包容性”。
AMD处理器: - Zen家族:L2具有包容性,L3具有NINE。 - Bulldozer家族:L2具有NINE,L3也是NINE。 - Jaguar和Puma:L2具有包容性。没有L3。 - K10和Fusion:L2具有独占性。没有L3。 - Bobcat:我不确定L2。没有L3。 - K7(第3个型号及以上)和K8:L2具有独占性。没有L3。 - K7(第1个和第2个型号)以及更早的型号:L2具有包容性。没有L3。 没有现有的AMD处理器具有L4高速缓存或超出L3的内存侧缓存。
VIA处理器: - Nano C和Eden C:我不确定L2。没有L3。 - 所有旧处理器:L2具有独占性。没有L3。 这涵盖了所有当前的VIA处理器。
大多数英特尔处理器的L1 / L2缓存都是8路关联,这意味着在一个集合中存在8个不同的高速缓存线路。
唯一的例外是NetBurst微体系结构,其中单个L2路包含两个相邻的高速缓存线路,称为扇区。
虽然8路关联是典型的,但有不同的关联性并不罕见。例如,Sunny Cove中的L1D是12路关联。请参阅:如何使用Ice Lake的48KiB L1数据缓存的索引?
高速缓存行作为整体操作,这意味着如果我想从高速缓存行中删除几个字节,则整个高速缓存行将被删除,而不是仅删除我想要删除的那些字节。

这是由于每个缓存级别的每个缓存条目关联的一致性状态存在限制,一个缓存行的所有字节只有一个状态。

系统是否将该缓存行驱逐的数据存储在某个地方(任何缓冲区、寄存器等)以便下次可以从那个地方加载数据以减少延迟?

有几个因素影响这个决定:(1)缓存行是否脏数据,(2)更高级别缓存的包容性属性(如果有),(3)缓存行是否预测在不久的将来访问,以及(4)如果我没记错,如果一行内存类型从可缓存变为不可缓存,它将被驱逐,并且不会在任何其他级别进行缓存,无论前面的因素如何。

因此,一个适用于所有处理器的懒惰答案是“可能”。


Skylake L2在SKL客户端中为256kiB / 4路(从Broadwell的8路降至)或在SKX服务器中为1MiB / 16路(用于某些高端i7型号)。有趣的是,我不记得读过SKX具有包容性L2缓存。https://en.wikichip.org/wiki/intel/microarchitectures/skylake_(server)没有提到这一点。https://www.anandtech.com/show/11550/the-intel-skylakex-review-core-i9-7900x-i7-7820x-and-i7-7800x-tested/4声称Skylake客户端和服务器都具有包容性L2缓存(但我不太相信它,如果我没记错,其中还有其他不准确之处)。 - Peter Cordes
英特尔当前的优化手册(https://software.intel.com/sites/default/files/managed/9e/bc/64-ia-32-architectures-optimization-manual.pdf)没有提到SKX具有包容性L2。根据RWT上的Kanter(https://www.realworldtech.com/haswell-cpu/5/)所说,Haswell具有非包容性(NINE)L2,因此这将是SKX的变化,但我在查看的任何内容中都没有看到提到这一点。 - Peter Cordes
@PeterCordes 很好的发现,伙计!从InstLatx64获取的cpuid叶子4转储显示SKX中的L2(和L3)是非包含的(并且没有cpuid勘误)。非英特尔来源广泛报道这些处理器中的L2是包含的。甚至许多研究论文都提到L2是包含的。我没有想到这可能是错误的。 - Hadi Brais
1
奇怪,我想知道那个错误信息是从哪里来的。对我来说,这似乎很令人惊讶,因为它并不被共享。唯一我能想到的包容性的原因是如果窥探过滤器只是概率性的,那么包容性的L2可以使L1免受核心没有的一些失效/写回请求的影响。但是,如果窥探过滤器跟踪所有内容,那么这种情况不会经常发生,所以也就无关紧要了。而且L2不使用大的行大小。(顺便说一下,https://en.wikipedia.org/wiki/CPU_cache#Exclusive_versus_inclusive列出了一些可能的优点)。 - Peter Cordes
1
@PeterCordes 除了过滤嗅探之外,使写回缓存具有包容性的另一个潜在好处是使写回缓存能够有效地处理来自较低编号缓存的写回。这是可能的,因为写回永远不会错过更高编号的包容性缓存,所以在设计中没有必要处理这种情况。(请注意,这个好处不适用于写直通缓存。)这正是为什么KNL/KNM中的缓存模式MCDRAM是修改包容性的原因。关于Zen/Zen2,AMD手册确实说L2是包容性的。 - Hadi Brais
显示剩余7条评论

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