【问题标题】:Cache Locality - weight of TLB, Cache Lines, and ...?Cache Locality - TLB、Cache Lines 和...的权重?
【发布时间】:2021-05-26 06:15:09
【问题描述】:

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

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

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

我有几个问题:

  1. 我从未见过对典型页表下降的定量估计。以时钟周期衡量,这真的很重要吗?

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

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

【问题讨论】:

    标签: operating-system cpu-architecture cpu-cache tlb cache-locality


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      1. 在大多数 ISA(包括我怀疑您正在考虑的 x86)上,硬件会在 TLB 未命中时遍历页表,而不是操作系统。操作系统只是将数据结构放在内存中,并给 CPU 顶级页目录的物理地址。 What happens after a L2 TLB miss?。因此,page-walk 可以在实际需要 TLB 条目之前推测性地完成,理想情况下隐藏了大部分延迟。

      在您测量的任何微架构上,遭受 TLB 未命中(但数据命中 L1d)的负载的实际延迟会告诉您有关页面遍历延迟的信息。我对 Skylake 或其他任何东西都没有一个数字。实际成本还取决于页面遍历硬件内部完成了多少更高级别的页表缓存。 (所以这是局部性的另一个来源;即使不使用 1G 或 2M 大/大页面,一个 TLB 条目也可以覆盖更多地址空间,但与最近的另一个页面遍历在同一 1GiB 内的页面遍历可能会更快。)

      2. 一些微架构对 L2 或 L3 使用较大的线,但大多数不使用。所有现代 x86 CPU 到处都使用 64B 线。 (但 Intel 上的 L2 空间预取器至少会尝试完成一对 128 字节对齐的行。)Line size of L1 and L2 caches

      内存在什么情况下加载到L2/L3?

      另见Is L2 line fill always triggered on lookup?

      取决于cache inclusion policy,例如独占外部缓存不会有刚刚加载到 L1d 中的内容的副本,受害者缓存也不会(wikipedia,尽管大型 L3 受害者缓存完全关联)。在 x86 世界中,英特尔没有使用正常的受害者缓存 (Which cache mapping technique is used in intel core i7 processor?),但 AMD 在一些微架构中使用了(例如 Bulldozer 系列)。 POWER 还使用了 L3 受害者缓存。

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

      是的,DRAM“页面”(行大小)意味着一个页面内的多个缓存未命中可以让 DRAM 控制器避免选择不同的行,而只是从已经打开的行中读取另一列。更改行会增加 DRAM 延迟,超出正常成本。

      What Every Programmer Should Know About Memory? 涵盖了 DRAM,以及许多关于缓存和优化缓存局部性的内容,并且仍然具有高度相关性。

      此外,如上所述,附近页面的页面浏览可能会更快。

      一个大/巨大的页面(例如 x86-64 上的 2MiB)让一个 TLB 条目覆盖整个 2M。

      连续读取(或写入)高速缓存行会触发 HW 预取器,在请求访问之前将这些行拉入 L2(甚至 L1d),从而减少未命中延迟。 (或者如果循环在 ALU 工作上花费的时间足够长,硬件预取可以跟上它的访问,则完全避免丢失。)

      【讨论】:

      • 这是一个充满信息和链接的惊人回复,非常感谢!肯定会解析所有这些 :) 这是一个非常高级的跟进,但我只参加了操作系统的浅层本科课程,并通过谷歌搜索学习了大多数其他东西。参加操作系统或计算机架构课程会更好地涵盖这些概念吗?
      • @Noah:因为 page-walk 硬件可以(而且我认为可以)缓存更高级别的 PDE,所以同一子树中的未命中可能能够缩短一些原本必须执行的步骤等待获取顶级条目并查看它指向的位置等负载使用延迟。清除这些是invlpg 必须做的一部分。例如Andy Glew (who worked on P6) wrote 另一个相关问题是页表的内部节点可能会缓存在更多类似 TLB 的数据结构中,例如PDE 缓存。
      • @Noah 分页结构缓存自核心微架构以来就存在。它们的架构影响在 SDM V3 第 4.10.2 节中讨论。 NHM 引入了 EPT,并且还为 EPT 条目提供了缓存。英特尔通常不会在 SDM V3 中提及这些缓存,但可以通过测量页面遍历延迟来检测这些缓存的存在,因为在最后一级 TLB 中查找未命中时会触发页面遍历。
      • @Noah:我从来没有声称任何东西都是可变大小的,除了 CPU 在单个页面遍历期间可能选择缓存的数据量。不知道你在说什么,当然在架构上页表中的所有内容都具有固定大小的固定含义。当我们谈论缓存相邻读取时,这将在任何缓存(TLB 或更高级别的内部 page-walker 缓存)中使用 separate 条目。
      • @Noah:更多关于其他非 x86 CPU 中存在内部 page-walker 缓存的确认,例如手臂:What is PDE cache?。在找东西的时候碰巧发现了这个,然后想起了最近的对话。
      猜你喜欢
      • 2010-12-30
      • 2014-03-06
      • 1970-01-01
      • 2014-10-30
      • 2023-03-14
      • 1970-01-01
      • 2010-11-09
      • 2022-11-17
      • 1970-01-01
      相关资源
      最近更新 更多