前端取指建模深入:BTB、RAS 与间接跳转
更新时间:2026-10-01。已有 分支预测与预取建模,本文深入预测器“旁边”的结构——它们决定能不能及时知道往哪取指。
本文要回答的问题
- 知道“会不会跳”之后,还需要什么才能给出目标地址?
- call/return 为什么要专用结构?
- 前端气泡怎么换算成 CPI 损失?
一、BTB:目标从哪来
方向预测器只回答 taken/not-taken,目标地址由 BTB 提供。BTB 命中才能在译码前重定向取指;未命中即使方向猜对,也要等分支被解析才知道目标,产生气泡。BTB 容量、组相联、替换策略影响容量冲突缺失。
二、RAS:应对 call/return
return 的目标是“最近一次 call 的下一条指令”,普通 BTB 难以预测(同一函数被多处调用)。RAS 是一个硬件栈:call 压入返回地址、return 弹出,预测准确率极高;深递归/投机执行要处理溢出与错误恢复。
三、间接跳转与多分支
间接跳转(寄存器目标、虚函数调用、跳转表)目标多变,需要间接分支预测器(记录历史目标)。一条 cache line 内多个分支、跨界取指会限制每周期可预测/取指的分支数。
四、前端气泡量化

在 gem5 中选择/参数化分支预测器与 BTB/RAS,扫描容量与命中率,观察 IPC 变化(配合 top-down/CPI)。
五、常见坑
- 只建方向预测,忽略 BTB miss 导致的目标延迟。
- return 不建 RAS,函数密集代码前端性能失真。
- 忽略多分支/跨界对取指带宽的限制。
- 前端气泡没有归因,统一算进“分支损失”。
小结
BTB 给目标、RAS 专管 call/return、间接预测应对多目标;前端结构命中率通过气泡进入 CPI。下一篇 ROB 与物理寄存器堆建模。
总结
前端取指建模不能只做方向预测:BTB 决定目标地址能否及时给出,RAS 硬件栈专解 call/return 配对,间接跳转预测器应对多目标分支,这些结构的 miss 与误判以重定向气泡的形式量化进 CPI 前端分量。