Hardware Cache Prefetcher
References:
- A Primer on Hardware Prefetching
硬件预取的任务:
- 预测访存地址 (决定:精确率 accuracy) 取决于:
- 程序本身的访存行为
- 在 cache 层级结构中的哪个层次进行预取
- L1 可以捕获所有的访存,精确度高,但浪费资源( L1 一般会 hit ,不需要预取,会浪费大量的预取资源)
- 低层级 cache 捕获的访存请求少
- cache placement 和 replacement 策略
- 预测何时预取 (决定:及时性 timely)
- 太早:可能会踢出处理器此时需要先使用的 cache block
- 太晚:可能由于访存延时导致迟迟得不到预取的结果
- 决定如何放置预取数据
- binding prefetch :预取到寄存器
- 浪费寄存器资源
- 即使此时访存负载很高,依旧会强制预取
- 语义错误(预取无效地址会触发 page fault)
- 不能应用到指令预取
- non-binding prefetch:预取到 cache 或者 buffer 中
- 这些 cache 和 buffer 同样需要参与一致性协议
- binding prefetch :预取到寄存器
预取策略的评估指标 (trade-off)
- Coverage 覆盖率: 在处理器显式的访存请求中,预测成功的占比
- 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 的种类:
- Strided Prefetcher
- 针对的访存模式:虚拟地址空间连续或以恒定 stride 间隔访存
- 适用于稠密矩阵和数组的访问预取
- 商业处理器广泛使用
- 起源于 IBM System/370 系列
- 对于指针相关的数据结构(链表等)预取效果较差
- Address-Correlating Prefetcher
- 针对指针相关的数据结构(链表等)进行预取
- Spatially Correlated Prefetcher
- Execution-Based Prefetcher
MSHR 的影响:
- MSHR 越大,允许在飞的预取请求就越多,容易造成较多的 pfLate,但相比于不进行预取,这样的 pfLate 依旧可能带来性能收益(尽管没有及时预取回 cache ,但访存请求已提前发出)
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.