Ch10 提交
10.1 概述
处理器要正确地执行程序,需要维持程序的串行顺序。对于超标量处理器,它按乱序方式执行,指令在达到流水线的最后一级时,称为提交 commit 阶段,会在 ROB 中被标记为已经完成的状态,但这只代表这条指令已经完成,并不代表它可以离开流水线。流水线的所有指令按照顺序在 ROB 中进行了记录,只有 ROB 中最旧的那条指令变为已经完成的状态,这条指令才允许离开流水线,并使用它的结果对处理器状态进行更新,此时称这条指令退休 retire 了。一条指令可能需要在提交阶段等待,才能退休。一条指令达到提交阶段也不一定代表这条指令就是正确的,由于分支预测失败和异常等原因,一条处于完成的指令很可能还会从流水线中抹掉,只有在这条指令进入流水线之前的所有指令都退休了,这条指令也完成了,它才可以退休离开流水线。
当一条指令没有退休之前,他的状态都是推测 speculative,只有当这条指令真正退休而离开流水线的时候,才可以将他的结果更新到处理器的状态中,这样即使有分支预测失败或者异常,也不会将错误的状态暴露给程序员。流水线的 Dispatch 阶段是处理器从顺序执行到乱序执行的分界点,现在流水线的提交阶段从乱序拉回顺序执行。
精确异常 precise exception 的定义是,当一条指令发现异常时,这条指令前面的所有指令都已经完成,而这条指令及其后面的所有指令都不应该改变处理器的状态。
还需要注意,对于一个 N-way 的超标量处理器来说,因为每周期最少可以取得 N 条指令送到流水线中,流水线的提交阶段每周期也最少需要将 N 条指令退休,这样才能保证流水线不会被堵塞,所有顺利离开流水线的指令要根据程序中原始的顺序来更新处理器的状态。
