1.在大多数 ISA(包括我怀疑您正在考虑的 x86)上,硬件在 TLB 未命中时遍历页表,而不是操作系统。操作系统只是将数据结构放在内存中,并给 CPU 顶级页目录的物理地址。 L2 TLB 未命中后会发生什么?. 因此,page-walk 可以在实际需要 TLB 条目之前推测性地完成,理想情况下隐藏了大部分延迟。
在您测量的任何微架构上,遭受 TLB 未命中(但数据命中 L1d)的负载的实际延迟会告诉您有关页面遍历延迟的信息。我对 Skylake 或其他任何东西都没有一个数字。实际成本还取决于页面遍历硬件内部完成了多少更高级别的页表缓存。(所以这是局部性的另一个来源;即使不使用 1G 或 2M 大/大页面,一个 TLB 条目也可以覆盖更多地址空间,但与最近的另一个页面遍历在同一 1GiB 内的页面遍历可能会更快。)
2.一些微架构对 L2 或 L3 使用较大的行,但大多数不使用。所有现代 x86 CPU 到处都使用 64B 线。(但 Intel 上的 L2 空间预取器至少会尝试完成一对 128 字节对齐的行。) L1 和 L2 缓存的行大小
内存在什么情况下加载到 L2/L3 中?
另请参阅L2 行填充是否总是在查找时触发?
取决于缓存包含策略,例如,独占外部缓存不会有刚刚加载到 L1d 中的内容的副本,受害者缓存也不会(维基百科,尽管大型 L3 受害者缓存不是完全关联的)。在 x86 世界中,英特尔没有使用正常的受害者缓存(英特尔酷睿 i7 处理器中使用了哪种缓存映射技术?),但 AMD 在一些微架构中使用了(例如 Bulldozer 系列)。POWER 还使用了 L3 受害者缓存。
除了缓存行和 TLB 之外,是否还有任何其他构造会产生“缓存局部性”?
是的,DRAM“页面”(行大小)意味着一个页面内的多个缓存未命中可以让 DRAM 控制器避免选择不同的行,而只是从已经打开的行中读取另一列。更改行会增加 DRAM 延迟,超出正常成本。
每个程序员都应该知道关于内存的什么?涵盖 DRAM,以及许多关于缓存和优化缓存局部性的内容,并且仍然具有高度相关性。
此外,如上所述,附近页面的页面浏览可能会更快一些。
一个大/大页面(例如 x86-64 上的 2MiB)让一个 TLB 条目覆盖整个 2M。
连续高速缓存行的连续读取(或写入)触发硬件预取器在请求访问之前将这些行拉入 L2(甚至 L1d),从而减少未命中延迟。(或者如果循环在 ALU 工作上花费的时间足够长,硬件预取可以跟上它的访问,则完全避免丢失。)