这是有据可查的事实,关于L1D,L2是non-unclusive,这意味着L2不必包含L1DCache具有的所有行。
是否也会错过L2的L1d缺失(读取,RFO)会填充L1d线而不填充相应的L2线?英特尔公司对此有何解释? 更新:有。英特尔第3卷,有关内存类型的部分。
或以另一种方式改写问题:缺少L2的查找是否总是导致其行被填充?
经过一番挖掘,我自己找到了答案。它是回写存储器类型的属性,而不是高速缓存级别]
Write-back(WB)-读写系统内存是已缓存。读取来自缓存命中中的缓存行;读错原因缓存填充。
答案取决于外部缓存wrt的cache inclusion policy。 L1d。
在Intel上,NT预取可以绕过L2(例如,在包含L3的Intel CPU上仅填充L1d和L3的一种方式),但是正常需求负载是通过L2获取的,并且确实在L2中分配L1d。 (以及prefetchnta
以外的所有预取)
以上适用于大多数CPU(NINE L2)。但是某些微架构具有唯一的L2 / L1d,因此没有,仅在开始时才在L1d中分配,并且线路移至L2。与英特尔相比,AMD在专有缓存方面进行了更多的试验。
AMD已使用exclusive和/或victim caches构建了一些CPU,例如Zen的每CCX L3是该4核(https://en.wikichip.org/wiki/amd/microarchitectures/zen#Memory_Hierarchy,https://www.anandtech.com/show/11170/the-amd-zen-and-ryzen-7-review-a-deep-dive-on-1800x-1700x-and-1700/9)复合系统中L2缓存的牺牲品缓存。 Skylake-X / Cascade Lake的非包含L3也是L2的受害者缓存。
在那些CPU中,读取不在L3中分配,只有L2和L1d分配。 (或者L1i用于代码提取)。
[[巴塞罗那(又名K10)具有一个共享的L3和一个L1 / L2,彼此互斥(来源:David Kanter's excellent writeup)。因此,在K10上,肯定不会分配在L1d中分配的行在L2中。从L1d撤出以为新生产线腾出空间的生产线通常将移至L2,从L2撤出旧生产线。
K8具有与L1d相同的L2,但没有共享的L3。也相关:Which cache mapping technique is used in intel core i7 processor?
这是回写内存类型的属性,而不是高速缓存级别...Intel的vol.3手册只是对未来的证明而已。这只是保证它将被缓存在缓存层次结构中的某个位置。读取未命中会导致高速缓存填充。
对于预期在同一行中进行其他读取的所有理智的设计将包含在L1d中(立即的空间局部性非常常见)。但是根据设计,它不必立即包含L2甚至L3。也就是说,这并不意味着所有级别。
x86不能保证在纸上具有多于一层的缓存。 (或者甚至有一个[is
高速缓存,但ISA文档中有关高速缓存作为RAM模式的部分以及类似的内容除外。)这些文档是在假设CPU至少具有2个级别的情况下编写的,因为因为P6(以及带有主板的P5提供了L2缓存),但是类似clflush
的任何内容都应理解为“假设有缓存”。