一条指令的生命周期
理解乱序核的关键不是记住所有级名,而是跟踪一条指令拥有的三种身份:程序顺序身份、物理数据依赖、推测状态。
从预测到提交
程序顺序身份
FTQ/ROB 指针帮助系统回答“这条指令在程序顺序中的位置”。即使执行顺序改变,提交和异常仍必须恢复精确的程序语义。
物理数据依赖
重命名把架构寄存器映射到物理寄存器,消除 WAR/WAW 假相关。调度器只需等待真实 RAW 依赖和执行资源。
推测状态
分支预测、Load 越过 Store、预取和返回栈都带推测。错误发生时,必须知道哪些年轻状态可丢弃、哪些已提交状态必须保留。
三种“完成”不要混淆
- 执行完成:功能单元得到了结果。
- 写回完成:结果进入物理寄存器或旁路网络,依赖者可被唤醒。
- 提交完成:指令成为不可撤销的架构状态。
典型恢复事件
| 事件 | 发现位置 | 主要动作 |
|---|---|---|
| 分支误预测 | 分支执行单元 | redirect、清除年轻指令、恢复预测历史 |
| Load 顺序违规 | LSU | replay 或流水线重定向 |
| 异常/中断 | 执行单元/ROB | 精确提交边界、进入 trap |
| 指令 Cache miss | 前端 | 暂停供给,等待 refill |
波形练习
选择一条最终提交的整数指令,记录它在 FTQ、ROB 和物理寄存器系统中的标识。然后选择一条被 redirect 清掉的年轻指令,比较两者生命周期在哪里分叉。