缓存位置 - TLB、缓存行和...的权重?
Cache Locality - weight of TLB, Cache Lines, and ...?
根据我的理解,产生“缓存位置”高级概念的构造如下:
用于虚拟内存转换的转换后备缓冲区 (TLB)。在 4096 字节对齐(页面大小)内访问相同的虚拟内存将防止 OS 需要降级分层页面 table 进行翻译。
缓存行意味着在 64 字节对齐(缓存行大小)内访问相同的虚拟内存将防止 OS 需要从 RAM 中获取指令。
我有几个问题:
我从未见过典型页面 table 下降的定量估计。这实际上以时钟周期衡量很重要吗?
我相信 64 字节缓存行是指 L1 缓存行 - L2 / L3 有不同的大小吗?内存在什么情况下加载到L2/L3?
除了缓存行和 TLB 之外,是否还有任何其他构造会产生“缓存局部性”?
1. 在大多数 ISA 上(包括我怀疑您正在考虑的 x86),硬件在 TLB 未命中时遍历页面 tables,而不是OS。 OS 只是将数据结构放在内存中,并为 CPU 提供顶级页目录的物理地址。 What happens after a L2 TLB miss?。因此,页面遍历可以在实际需要 TLB 条目之前推测性地完成,理想情况下隐藏大部分延迟。
遭受 TLB 未命中(但数据的 L1d 命中)的负载的实际延迟会告诉您有关页面遍历延迟的一些信息,无论您正在测量的是什么微架构。我没有想好 Skylake 或其他什么的数字;实际成本还取决于在页面遍历硬件中完成了多少更高级别的页面 table 缓存。 (所以这是局部性的另一个来源;与另一个最近的页面遍历相同的 1GiB 内的页面遍历可能更快,即使不只使用 1G 或 2M huge/large 页面所以一个 TLB 条目可以覆盖更多地址 space.)
2. 一些微体系结构为 L2 或 L3 使用较大的行,但大多数不使用。所有现代 x86 CPUs 到处都使用 64B 行。 (但是 Intel 上的 L2 空间预取器至少会尝试完成一对 128 字节对齐的行。)Line size of L1 and L2 caches
Under what circumstances is memory loaded into L2 / L3?
另见
取决于 cache inclusion policy, e.g. an exclusive outer cache won't have a copy of something just loaded into L1d, neither will a victim cache (wikipedia, although large L3 victim caches are not fully associative). In the x86 world, Intel hasn't used normally victim caches (),但 AMD 在某些微体系结构中有(例如 Bulldozer 系列)。 POWER 还使用了 L3 受害者缓存。
Are there any additional constructs which give rise to "cache locality" aside from cache lines and the TLB?
是的,DRAM“页面”(行大小)意味着一页内的多个缓存未命中可以让 DRAM 控制器避免选择不同的行,而只是从已经打开的行中读取另一列。更改行会增加 DRAM 延迟,超出正常成本。
What Every Programmer Should Know About Memory? 涵盖了 DRAM,以及许多关于缓存和缓存局部性优化的内容,并且仍然高度相关。
此外,如上所述,附近页面的页面浏览速度可能会稍快一些。
大页面/大页面(例如 x86-64 上的 2MiB)让一个 TLB 条目覆盖整个 2M。
连续缓存行的顺序读取(或写入)触发 HW 预取器 在需求访问之前将这些行拉入 L2(甚至 L1d),从而减少未命中延迟。 (或者如果循环在 ALU 工作上花费足够长的时间以至于 HW 预取可以跟上它的访问,则完全避免未命中。)
高速缓存层次结构还有许多与性能相关的附加功能,这些功能与“高速缓存局部性”这一一般主题相关。在 2007 年的一次演示中,我提出了 25 种不同的局部性,可能需要考虑这些局部性才能理解内存访问绑定应用程序的性能! http://dx.doi.org/10.13140/RG.2.2.12967.27048 上的演示文稿有两个版本——有和没有演讲者注释。幻灯片 7 提供了一个(不完整的)“内存层次结构位置域”列表。这包括与地址转换机制相关的局部性、与高速缓存访问相关的局部性、与 DRAM 访问相关的局部性以及一些其他主题。
根据我的理解,产生“缓存位置”高级概念的构造如下:
用于虚拟内存转换的转换后备缓冲区 (TLB)。在 4096 字节对齐(页面大小)内访问相同的虚拟内存将防止 OS 需要降级分层页面 table 进行翻译。
缓存行意味着在 64 字节对齐(缓存行大小)内访问相同的虚拟内存将防止 OS 需要从 RAM 中获取指令。
我有几个问题:
我从未见过典型页面 table 下降的定量估计。这实际上以时钟周期衡量很重要吗?
我相信 64 字节缓存行是指 L1 缓存行 - L2 / L3 有不同的大小吗?内存在什么情况下加载到L2/L3?
除了缓存行和 TLB 之外,是否还有任何其他构造会产生“缓存局部性”?
1. 在大多数 ISA 上(包括我怀疑您正在考虑的 x86),硬件在 TLB 未命中时遍历页面 tables,而不是OS。 OS 只是将数据结构放在内存中,并为 CPU 提供顶级页目录的物理地址。 What happens after a L2 TLB miss?。因此,页面遍历可以在实际需要 TLB 条目之前推测性地完成,理想情况下隐藏大部分延迟。
遭受 TLB 未命中(但数据的 L1d 命中)的负载的实际延迟会告诉您有关页面遍历延迟的一些信息,无论您正在测量的是什么微架构。我没有想好 Skylake 或其他什么的数字;实际成本还取决于在页面遍历硬件中完成了多少更高级别的页面 table 缓存。 (所以这是局部性的另一个来源;与另一个最近的页面遍历相同的 1GiB 内的页面遍历可能更快,即使不只使用 1G 或 2M huge/large 页面所以一个 TLB 条目可以覆盖更多地址 space.)
2. 一些微体系结构为 L2 或 L3 使用较大的行,但大多数不使用。所有现代 x86 CPUs 到处都使用 64B 行。 (但是 Intel 上的 L2 空间预取器至少会尝试完成一对 128 字节对齐的行。)Line size of L1 and L2 caches
Under what circumstances is memory loaded into L2 / L3?
另见
取决于 cache inclusion policy, e.g. an exclusive outer cache won't have a copy of something just loaded into L1d, neither will a victim cache (wikipedia, although large L3 victim caches are not fully associative). In the x86 world, Intel hasn't used normally victim caches (
Are there any additional constructs which give rise to "cache locality" aside from cache lines and the TLB?
是的,DRAM“页面”(行大小)意味着一页内的多个缓存未命中可以让 DRAM 控制器避免选择不同的行,而只是从已经打开的行中读取另一列。更改行会增加 DRAM 延迟,超出正常成本。
What Every Programmer Should Know About Memory? 涵盖了 DRAM,以及许多关于缓存和缓存局部性优化的内容,并且仍然高度相关。
此外,如上所述,附近页面的页面浏览速度可能会稍快一些。
大页面/大页面(例如 x86-64 上的 2MiB)让一个 TLB 条目覆盖整个 2M。
连续缓存行的顺序读取(或写入)触发 HW 预取器 在需求访问之前将这些行拉入 L2(甚至 L1d),从而减少未命中延迟。 (或者如果循环在 ALU 工作上花费足够长的时间以至于 HW 预取可以跟上它的访问,则完全避免未命中。)
高速缓存层次结构还有许多与性能相关的附加功能,这些功能与“高速缓存局部性”这一一般主题相关。在 2007 年的一次演示中,我提出了 25 种不同的局部性,可能需要考虑这些局部性才能理解内存访问绑定应用程序的性能! http://dx.doi.org/10.13140/RG.2.2.12967.27048 上的演示文稿有两个版本——有和没有演讲者注释。幻灯片 7 提供了一个(不完整的)“内存层次结构位置域”列表。这包括与地址转换机制相关的局部性、与高速缓存访问相关的局部性、与 DRAM 访问相关的局部性以及一些其他主题。