缓存miss了,传统做法是等整个64字节块从内存回来再交给CPU。但CPU可能只需要其中4字节。关键字优先(Critical Word First)和提前重启动(Early Restart)就是用来解决这个问题的——让CPU早点拿到急需的数据,剩下的慢慢传。
1. 传统加载的问题
假设L1缓存miss,需要从DDR4内存加载一个64字节块:
- 内存延迟:50ns
- 内存带宽:20GB/s
- 加载64字节理论上只需要3ns,但延迟是50ns
传统做法:等50ns,64字节全到了,再交给CPU。CPU在这50ns里完全停顿。
实际上,DDR内存是burst传输的。一个64字节块需要8个burst(每个burst 8字节),按顺序传输。如果CPU要的是第7个burst,也得等前面6个传完。
2. 两种优化策略
2.1 提前重启动(Early Restart)
核心思想:不按顺序等,只要请求的那个字到了,立刻给CPU,让它继续执行,剩下的字后台慢慢传。
工作流程:
- 内存按正常顺序传burst 0,1,2,3,4,5,6,7
- 假设CPU请求的是burst 3
- burst 3到达时,立即送给CPU,CPU流水线重启
- burst 4,5,6,7继续传,填充缓存
适用场景:顺序访问。因为空间局部性,CPU很可能接下来要burst 4,5,6,7,这些已经在路上了。
局限性:如果CPU接下来要的是burst 0(回跳),还得等,因为已经传过了。
2.2 关键字优先(Critical Word First)
核心思想:改变传输顺序,先传CPU要的那个字,再传其他的。
工作流程:
- CPU请求burst 3
- 内存控制器调整顺序:先传burst 3
- burst 3到达,送给CPU,CPU流水线重启
- 后台继续传burst 0,1,2,4,5,6,7
适用场景:随机访问。比如指针追逐、分支跳转目标,不知道接下来要哪个字。
关键区别:
- Early Restart:不改变传输顺序,只改变响应时机
- Critical Word First:改变传输顺序,优先传关键字
3. 效果分析
3.1 理论收益
假设:
- 块大小:64字节(8个burst,每个8字节)
- 内存延迟:50ns(从请求到第一个burst到达)
- burst间隔:6ns(50ns/8个burst的传输时间)
| 策略 | 等待时间 | 节省 |
|---|---|---|
| 传统方式 | 50ns | 0% |
| Early Restart(关键字在中间) | ~25ns | 50% |
| Critical Word First(关键字优先) | ~12ns | 75% |
注意:Critical Word First不是0等待,因为内存控制器需要时间处理请求、调整顺序。
3.2 实际限制
Early Restart的问题:
Hennessy & Patterson的经典教材[1][2]指出:
"Spatial locality => tend to want next sequential word, so first access to a block is normally to 1st word, but next is to 2nd word, which may stall again and so on, so benefit from early restart alone is not clear"
翻译:空间局部性导致第一次访问通常是第0个字,但第二次访问第1个字时,如果Early Restart已经传过第1个字了,CPU还是得等。所以Early Restart单独使用的效果不明确。
Critical Word First的问题:
- 内存控制器复杂度:需要支持乱序burst传输
- DDR协议限制:DDR的burst传输有固定模式(如sequential或interleaved),完全乱序可能不支持
- 块大小限制:块越大(128B),收益越高;块小(32B),节省的时间可能被控制逻辑开销抵消
4. 与非阻塞缓存的协同
Critical Word First/Early Restart和Non-blocking Cache是绝配。
Non-blocking Cache:允许miss时继续处理其他请求
Critical Word First:让CPU尽快拿到数据,继续执行
两者结合:
- Load A miss,请求Critical Word
- CPU继续执行,发射Load B
- Load B hit(如果数据在缓存)
- Critical Word到达,CPU继续Load A的依赖指令
- 同时,缓存后台加载剩余块
这种重叠可以显著降低effective miss penalty。
5. 总结
| 策略 | 改变传输顺序 | 适用场景 | 实现复杂度 | 实际收益 |
|---|---|---|---|---|
| Early Restart | 否 | 顺序访问 | 低 | 中等(空间局部性限制) |
| Critical Word First | 是 | 随机访问 | 中 | 高(大块缓存) |
关键认知:
- 块越大(≥64B),这两种技术的收益越高
- Early Restart单独使用效果有限,因为空间局部性导致下一次访问很可能已经传过了
- Critical Word First需要内存控制器支持,实现更复杂
- 现代处理器主要依赖硬件预取和Non-blocking Cache来隐藏延迟,这两种技术作为辅助
理解这些,做缓存设计时就能在复杂度、功耗、性能间找到平衡。