Appearance
第4章:乱序执行与分支预测
程序顺序与执行顺序
顺序程序中的依赖只限制部分指令。一次缓存失效后的独立加法可以先执行,只要对外可见的结果仍符合 ISA 的规则。乱序执行利用的正是这些独立工作。
需要区分三类相关:RAW 是读依赖之前的写,属于真实数据依赖;WAR 和 WAW 常由不同值使用同一个架构寄存器名造成,可以通过重命名消除。
例如 r1=r2+r3; r4=r1*2; r1=r5+r6。第二条需要第一条的值,不能任意越过它;第三条的新 r1 却可以放在另一个物理寄存器中,不覆盖第二条仍需的旧值。
重命名、发射与提交
重命名表把架构寄存器映射到物理寄存器。发射队列跟踪操作数就绪状态,选择可执行指令。重排序缓冲区 ROB 按程序顺序记录指令结果与异常,允许乱序完成、按序提交。
按序提交有助于实现精确异常:发生异常时,较早指令已完成可见效果,故障指令及更晚指令尚未提交。系统软件可以据此重试或终止,而不必理解任意半完成的程序状态。
商用实现细节各不相同。这里的 ROB 是一类实现方案,不意味着每个 ISA 都强制这种硬件结构。
内存依赖更难确定
寄存器名在译码时可知,访存地址却可能要等计算完成。两个 load 可互相越过到什么程度、load 能否越过较早 store,受地址冲突和存储模型共同限制。
存储队列可以把尚未写入缓存的旧 store 数据转发给同地址的新 load。推测两个地址不冲突能提高并行度,但猜错需要重放相关工作。重命名消除寄存器伪依赖,并不自动解决内存别名。
分支预测与推测痕迹
两位饱和计数器可为分支记录偏向,连续证据才改变强预测方向。更复杂预测器使用局部或全局历史,代价是面积、访问时间和训练状态。
预测错误后的架构结果会被丢弃,但缓存等微体系结构状态可能留下痕迹。推测执行侧信道利用这种差异,说明“没有提交错误结果”与“没有泄露任何信息”是不同的正确性要求。
练习
- 给三个架构寄存器连续多次赋值,写出一种物理寄存器重命名。
- 为什么真实 RAW 依赖不能靠重命名消除?
- 一条年轻指令先发生异常时,处理器为什么通常不能立刻把它作为程序下一次可见异常报告?