-1

据我了解,产生“缓存局部性”高级概念的结构如下:

  1. 用于虚拟内存转换的转换后备缓冲区 (TLB)。在 4096 字节对齐(页面大小)内访问相同的虚拟内存将防止操作系统需要对分层页表进行降序转换。

  2. 缓存线意味着在 64 字节对齐(缓存线大小)内访问相同的虚拟内存将防止操作系统需要从 RAM 中获取指令。

我有几个问题:

  1. 我从未见过对典型页表下降的定量估计。以时钟周期衡量,这实际上是否重要?

  2. 我相信 64 字节缓存线是指 L1 缓存线 - L2 / L3 有不同的大小吗?内存在什么情况下加载到 L2/L3 中?

  3. 除了缓存行和 TLB 之外,是否还有任何其他构造会产生“缓存局部性”?

4

2 回答 2

3

高速缓存存储器层次结构中有许多与性能相关的附加特性,这些特性与“高速缓存局部性”的一般主题相关。在 2007 年的一次演讲中,我提出了 25 种不同类型的局部性,可能需要考虑这些局部性来理解内存访问绑定应用程序的性能!在http://dx.doi.org/10.13140/RG.2.2.12967.27048上有两个版本的演示文稿- 有和没有演讲者备注。幻灯片 7 提供了一个(不完整的)“内存层次结构局部域”列表。这包括与地址转换机制相关的局部性、与缓存访问相关的局部性、与 DRAM 访问相关的局部性以及其他一些主题。

于 2021-02-24T17:19:32.260 回答
2

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 工作上花费的时间足够长,硬件预取可以跟上它的访问,则完全避免丢失。)

于 2021-02-24T05:04:09.417 回答