L2 线路填充是否总是在查找时触发?

Is L2 line fill always triggered on lookup?

关于 L1D,L2 非唯一性 是一个有据可查的事实,这意味着 L2 不必包含 L1DCache 具有的所有行。

能不能L1d miss (Read, RFO) 也miss L2 fill L1d line而不填对应的L2 line?英特尔人对此有任何解释吗? 更新: 有。 Intel Vol.3,关于内存类型的部分。

或者以另一种方式改写问题:缺少 L2 的查找是否总是导致其行被填充?

经过一番挖掘,我自己找到了答案。是属性的回写内存类型,不是缓存级别

Write-back (WB) — Writes and reads to and from system memory are cached. Reads come from cache lines on cache hits; read misses cause cache fills.

答案取决于外部缓存的 cache inclusion policy 我们可以安全地假设读取分配发生在任何缓存级别,除非另有说明(独占或受害者缓存)。

在 Intel 上,NT 预取可以绕过 L2(只需填充 L1d 和单路 L3,例如在 Intel CPUs 上包含 L3),但 正常需求负载是通过 L2 获取并在 L2 和 L1d 中进行分配。 (和 prefetchnta 以外的 SW 预取)

以上内容适用于大多数 CPUs (NINE L2)。但是有些微架构有独占L2/L1d,因此没有,一开始只在L1d分配,线移动到L2。与 Intel 相比,AMD 在独占缓存方面的尝试更多。


AMD 使用 exclusive and/or victim caches, e.g. Zen's per-CCX L3 is a victim cache for the L2 caches in that complex of 4 cores (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) 构建了一些 CPUs。 Skylake-X / Cascade Lake的non-inclusive L3也是L2的victim cache。

在那些 CPU 中,读取不在 L3 中分配,仅在 L2 和 L1d 中分配。 (或 L1i 用于代码提取)。

巴塞罗那(又名 K10)有一个共享的 L3,和一个互不相容的 L1/L2(来源:David Kanter's excellent writeup)。 等等K10,是的,在L1d分配的线路肯定不会在L2分配。从 L1d 逐出以为新线路腾出空间的线路通常会移至 L2,从 L2 逐出较旧的线路。

K8 有相同的 L2,L1d 除外,但没有共享 L3。

还相关:


It is a property of Write-back memory type, not a cache level ... read misses cause cache fills.

Intel 的第 3 卷手册只是对未来的抽象保证。这只是保证它将缓存在缓存层次结构中的某个位置。

对于将包含在 L1d 中以预期同一行的其他读取的任何理智设计(直接空间局部性非常常见)。但它不必立即包括 L2 甚至 L3,具体取决于设计。即它并不意味着所有级别。

x86 不保证任何关于拥有超过一级缓存的书面内容。 (或者甚至 缓存,除了 ISA 文档中关于缓存作为 RAM 模式和类似内容的部分。)文档是假设 CPU 至少有 2 个级别,因为自 P6 以来就是这种情况(以及带有提供 L2 缓存的主板的 P5),但是像 clflush 这样的东西应该读作 "assuming there is a cache".