流水与精确异常
我们为什么需要精确异常?
- 冯诺依曼结构ISA的语义
- 帮助软件调试
- 使得异常恢复和进程重启更容易
- 可以在软件中加入trap
多周期与流水线
因为并不是所有指令的执行时间都是一样长的,能不能在流水线中实现多周期的思想,即用多个不同的功能单元花费不同数量的时钟周期。而在这些功能单元中指令的执行可以流水也可以不流水,这样就必须保证指令序以及确定精确异常,因为在某个阶段发现异常时,其之后的指令已经开始执行了,那么就需要将微体系结构的状态还原到异常发生之前的那个状态。
上图展示了我们之前的思路,在传统的单(指令执行)周期流水线中,当FMUL在EX阶段时,ADD不能处于EX阶段,进一步,ADD和FMUL的EX阶段的时钟周期必须一致,但是实际上ADD的EX阶段并不需要那么长的时间,这样就导致指令处理时间较长。那么如果进行多周期执行,当FMUL和ADD不存在相关时,ADD可以使用EX阶段不同的功能单元,从而不需要等待FMUL指令EX阶段的完成。
看起来不错,但是如果第一个FMUL在WB阶段出现异常了呢?这样除了需要处理异常外,我们必须消除后续已执行的指令所带来的对体系结构状态的影响,否则指令的序就出现了问题,这个系统就