跳转至

1. Introduction

预取机制应当考虑以下几点:

  • Accuracy: 知道预取地址是什么
  • Timeliness: 知道何时发出预取请求
  • Placement: 知道放在哪里,必要时还需确定被替换数据

1.1 Accuracy

衡量Accuracy指标:

  • 覆盖率衡量显式处理器请求中预取成功的比例(即通过预取消除的缺页请求比例)
  • 准确率衡量预取器发起的访问中实际有用的比例(即正确预占占全部预取的比例)。

许多简单预取器能以牺牲准确率为代价提升覆盖率,而理想的预取器应同时具备高准确率和高覆盖率。

1.2 Timeliness

理想情况下,预取机制应提前发起预取操作并提供足够的预取数据存储空间,以完全隐藏内存访问延迟。

即使地址预测正确,过早发起预取的预取器可能无法在访问前将全部预取内存长期保存在处理器近端:

  • 最佳情况下,过早预取会因预取信息在使用前被逐出而失效
  • 最差情况下,可能驱逐其他有用信息(如其他预取内存或高层缓存中的有效数据块)。

若内存预取过晚:

  • 则会在内存访问时暴露访问延迟,削弱预取效果
  • 极端情况下,延迟预取可能因增加内存系统流量以及与时效性需求访问优先机制的相互干扰而导致性能下降。

1.3 Placement

预取值的存放位置最基础且历史最悠久的数据预取软件策略是将数据加载至处理器寄存器,这与常规显式加载操作类似。许多体系结构(特别是现代乱序处理器)在发出加载指令时不会暂停执行,仅当加载值被其他指令需要时才暂停相关指令。这种预取策略常被称为绑定式预取,因为数据后续使用的值在预取发出时即被绑定。该方法存在若干缺陷:

  1. 占用宝贵的处理器寄存器
  2. 即使内存系统负载较重仍强制硬件执行预取
  3. 当预取地址错误时引发语义难题(例如对无效地址的预取是否应触发内存保护错误)
  4. 难以将该策略应用于指令预取。

实际上,大多数硬件预取技术会将预取值直接存入缓存层次结构,或是存入用于扩展缓存层级的辅助缓冲区中,并支持并发访问。在多核与多处理器系统中,这些缓存与缓冲区需遵循缓存一致性协议,因此预取的内存位置值可能在预取操作与后续访问之间的时间段内发生变更;硬件需确保访问时能获取到最新值。此类预取策略被称为非绑定式预取。在这些方案中,预取纯粹是性能优化手段,不会改变程序语义。

本书涉及的所有硬件预取器均属于后一种非绑定式类别。它们的核心差异在于预取值的具体存放位置,以及为容纳新预取内存而实施的替换策略。