重命名
- 寄存器重命名过程的恢复
-
- [使用 Checkpoint 对 RAT 进行恢复](#使用 Checkpoint 对 RAT 进行恢复)
- [使用 WALK 对 RAT 进行恢复](#使用 WALK 对 RAT 进行恢复)
- [使用 Architecture State 对 RAT 进行恢复](#使用 Architecture State 对 RAT 进行恢复)
- 总结
- 分发(Dispatch)
寄存器重命名过程的恢复
当发生异常、分支预测失败时,指令占用 RAT、ROB 和 Issue Queue 等资源恢复
使用 Checkpoint 对 RAT 进行恢复
对一个正在工作的部件来说,两种方式
名字 | 随机访问的 GC | 串行访问 GC |
---|---|---|
缩写 | Random Access GC, RAGC | Sequential Access GC,SAGC |
区别 | 将整个内容放到任意 GC 中 | 逐步地移位才能放到指定的 GC 中 |
和主存储器连接方式 | 连接每个 GC | 连接单个 GC |
要求 | 驱动负载较大(接缓冲器) | 恢复时,可能需要移位多次 |
选择 | 更合适 |
- MBC(Main Bit Cell)
- SRAM 最小存储单元
- 两读一写
- CBC(Checkpoint Bit Cell)
- 一读一写
RAT 状态保存时(Allocation):将 MBC 的内容复制到指定的 CBC 中
RAT 状态恢复时( Restore ):将 CBC 的内容复制到指定的 MBC 中
使用 WALK 对 RAT 进行恢复
ROB 存储了这条指令前对应的物理寄存器,可以逐步倒退
当发现一条分支指令预测失败时,使用分支指令的编号,将流水线中所有相关指令都给抹除
同时暂停流水线,从 ROB 的底端开始(最新的指令),逐条将每条指令之前对应的映射关系写到 RAT 中。
- 分支预测错误时,首先需要抹除流水线,需要逐个指令地进行恢复,需要消耗很多时间(增大分支预测失败的惩罚)
- 异常时,只需要恢复,不需要抹掉指令(因为异常需要等到该指令变成最旧的指令时才进行)
占用资源少,可用于处理异常发生频率低的处理器
使用 Architecture State 对 RAT 进行恢复
处理器外部访问逻辑寄存器时,RAT 中存储的是未提交状态,所以不一定
例子:
指令 A 提交成功,此时访问 RAT r1 对应的是 P34,但 D 可能出现异常,由此外部不应该读取这个映射关系
因此在提交时,也使用一个 RAT,所有正确的流水线指令都会更新 RAT,称为 aRAT(architecture RAT)
利用 aRAT 也可以完成修复
- 出现分支预测失败时,并不马上进行 RAT 状态修复,而是继续执行,直到运行到该分支指令变成最旧指令时,此时 aRAT 则是正确状态的指令
缺点
- 流水线中存在 D-cache 缺失的 load 指令时,该分支指令需要等待很长时间才能顺利离开
总结
复位方式 | Checkpoint | WALK | Architecture State |
---|---|---|---|
内容 | 将 RAT 内容复制出来 | 根据 ROB 序列完成删掉、恢复指令 | 等待分支指令成为最老指令 利用 ARAT 复制 |
占用资源 | 多 | 少 | 直接复制比较简单 |
处理速度 | 快 | 慢 | 可能由于 D-cache 原因变慢 |
常用于 | 异常发生概率低的处理器中 | 不需要过多处理,降低功耗 |
分发(Dispatch)
经过重命名后,会进入
- 队列
- 发队队列 (out of order)
- 大部分 FU (function Unit),等待操作数
- 发射队列 (in order)
- Store 指令和分支指令
- 发队队列 (out of order)
- 重排序缓存 (ROB)
- 乱序执行的指令拉回到原始顺序,并且记录指令执行的状态(是否发生异常)