References:

  1. A Primer on Hardware Prefetching

硬件预取的任务:

  1. 预测访存地址 (决定:精确率 accuracy) 取决于:
    • 程序本身的访存行为
    • 在 cache 层级结构中的哪个层次进行预取
      • L1 可以捕获所有的访存,精确度高,但浪费资源( L1 一般会 hit ,不需要预取,会浪费大量的预取资源)
      • 低层级 cache 捕获的访存请求少
    • cache placement 和 replacement 策略
  2. 预测何时预取 (决定:及时性 timely)
    • 太早:可能会踢出处理器此时需要先使用的 cache block
    • 太晚:可能由于访存延时导致迟迟得不到预取的结果
  3. 决定如何放置预取数据
    • binding prefetch :预取到寄存器
      • 浪费寄存器资源
      • 即使此时访存负载很高,依旧会强制预取
      • 语义错误(预取无效地址会触发 page fault)
      • 不能应用到指令预取
    • non-binding prefetch:预取到 cache 或者 buffer 中
      • 这些 cache 和 buffer 同样需要参与一致性协议

预取策略的评估指标 (trade-off)

  1. Coverage 覆盖率: 在处理器显式的访存请求中,预测成功的占比
  2. Accuracy 精确度: 实际发射的访存请求中,预取有用的占比

Prefetch With Virtual Addresses:

  • 一般而言,只有 L1Cache 有可能使用虚拟地址进行预取,lower level cache 只能使用物理地址进行预取
  • 使用虚拟地址预取
    • 好处: 可以实现跨页的预取,当 workload 可能跨页时其物理地址可能并不连续,可能影响 prefetch pattern
    • 问题:预取请求也需要经过 TLB 地址翻译,存在对 TLB 的带宽占用

指令预取 Instruction Prefetching

ICache Prefetcher

数据预取 Data Prefetcher

Data Prefetch 困难之处:data cache miss pattern 的动态变化:pattern 主要取决于算法和高级语言编程结构,在程序运行时动态变化

Data Prefetcher 的种类:

  1. Strided Prefetcher
    • 针对的访存模式:虚拟地址空间连续或以恒定 stride 间隔访存
    • 适用于稠密矩阵和数组的访问预取
    • 商业处理器广泛使用
    • 起源于 IBM System/370 系列
    • 对于指针相关的数据结构(链表等)预取效果较差
  2. Address-Correlating Prefetcher
    • 针对指针相关的数据结构(链表等)进行预取
  3. Spatially Correlated Prefetcher
  4. Execution-Based Prefetcher

MSHR 的影响:

  • MSHR 越大,允许在飞的预取请求就越多,容易造成较多的 pfLate,但相比于不进行预取,这样的 pfLate 依旧可能带来性能收益(尽管没有及时预取回 cache ,但访存请求已提前发出)