Som*_*ame 0 x86 assembly x86-64 cpu-architecture cpu-cache
L2是非排除性的,这是一个有据可查的事实,这意味着 L2 不必包含 L1DCache 拥有的所有行。
\n\nL1d miss (Read, RFO) 是否也错过了 L2 填充 L1d 行而不填充相应的 L2 行?英特尔 mans 中有对此有任何解释吗?更新:有。Intel Vol.3,有关内存类型的部分。
\n\n或者用另一种方式重新表述这个问题:缺少 L2 的查找是否总是会导致其行被填充?
\n\n经过一番挖掘后,我自己发现了答案。它是回写内存类型的属性,而不是缓存级别
\n\n\n\n回写 (WB) \xe2\x80\x94 对系统内存的写入和读取均被缓存。读取来自缓存命中时的缓存行;读取未命中导致\n 缓存已满。
\n
答案取决于外部缓存的缓存包含策略。 我们可以安全地假设读取分配发生在任何缓存级别,除非另有指定(独占缓存或受害者缓存)。
在 Intel 上,NT 预取可以绕过 L2(仅填充 L1d 和 L3 的单路,例如,在具有包容性 L3 的 Intel CPU 上),但正常的需求负载是通过 L2 获取的,并在 L2 和 L1d 中进行分配。(以及除 SW 预取之外的prefetchnta)
上述内容适用于大多数 CPU(9 个 L2)。但有些微架构具有独占的 L2/L1d,因此不会,首先只在 L1d 中分配,然后线路移动到 L2。AMD 在独占缓存方面的尝试比 Intel 更多。
AMD 已经构建了一些具有独占和/或受害者缓存的CPU ,例如 Zen 的 per-CCX L3 是 4 核复合体中 L2 缓存的受害者缓存 ( 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) 。Skylake-X / Cascade Lake 的非包容性 L3 也是 L2 的受害者缓存。
在这些 CPU 中,读取不会在 L3 中分配,仅在 L2 和 L1d 中分配。(或 L1i 用于代码获取)。
巴塞罗那(又名 K10)有一个共享的 L3,以及一个互斥的 L1/L2(来源:David Kanter 的精彩文章)。 所以在 K10 上,是的,分配在 L1d 中的线路肯定不会分配在 L2 中。为了给新线路腾出空间而从 L1d 驱逐的线路通常会移至 L2,从而从 L2 驱逐旧线路。
K8 具有相同的 L2(不包括 L1d),但没有共享的 L3。
另相关:intel core i7处理器使用哪种缓存映射技术?
它是回写内存类型的属性,而不是缓存级别...读取未命中会导致缓存填充。
英特尔的第 3 卷手册只是面向未来的抽象保证。这只是保证它将被缓存在缓存层次结构中的某个位置。
对于任何理智的设计,将包含在 L1d 中以预期同一行的其他读取(直接空间局部性非常常见)。但它不必立即包含 L2 甚至 L3,具体取决于设计。即它并不意味着所有级别。
x86 不保证任何关于拥有多级缓存的书面保证。(或者甚至有一个缓存,除了 ISA 文档中关于缓存即 RAM 模式和类似内容的部分。)这些文档是在假设 CPU 至少有 2 个级别的情况下编写的,因为自 P6 以来就是这种情况(和带有提供 L2 缓存的主板的 P5),但类似的内容clflush应理解为“假设有缓存”。