硬件预取器
更新时间:2026-10-01。预取是“用带宽换缺失延迟”的主要手段,但做不好反而帮倒忙。
本文要回答的问题
- 预取器怎么判断“接下来要什么”?
- 为什么预取有时让性能更差?
一、常见预取类型
- next-line/相邻行:取当前行时顺带取下一行,利于顺序代码。
- stride 跨步:检测同一指令的访问地址按固定步长前进(数组遍历)。
- stream:识别连续流,批量向前取多笔。
- 相关/delta 预取:基于指针/历史差模式,更复杂。
二、准确与及时
预取必须在“真用到前”完成才有效:太晚等于没取,太早会被 evict 或挤占有用行(污染),过多预取还消耗内存带宽。预取操作本身不应触发异常/改变可见语义。
三、常见坑
- 指针追逐等无规律访问无法预取却期望有效。
- 预取距离不调,太早被替换。
- 多核下预取互相干扰。
小结
预取靠识别顺序/跨步/流模式提前取数,价值取决于准确度与及时性,过度则污染抢带宽。下一篇 非阻塞缓存与 MSHR。
总结
预取是“用带宽换缺失延迟”——硬件靠 next-line、stride 跨步、stream 流等模式在数据真正被用到前把它取进缓存,命中时把 miss 延迟整个藏掉;但它的收益完全取决于准确度与及时性:太晚等于没取,太早会被 evict 或挤掉有用行造成污染,误判和过度预取还白白吃掉内存带宽,而指针追逐这类无规律访问根本无法预取。