一、处理器交付,取消,冲刷简介
在经典的五级流水线模型中,处理器的流水线分为取指,译码,执行,访存和写回,其中并没有交付。
流水线中的指令被交付,是指该指令不再是预测执行状态。他被判定为可以真正地在处理器中被执行,可以对处理器状态产生影响。与交付相反的为取消。表示该指令最后被判定为需要取消。下面列于两种常见的情形阐述交付的功能。
(1)情形一
- 为了提高处理器的性能,分支跳转指令可以以一种预测的形式执行,分支跳转指令是否真正需要产生跳转可能需要经过执行阶段之后才能够被确定。
- 指令在流水线中是以“流水”的形式执行,以经典的五级流水线模型为例,第一条指令在执行阶段,第二条指令便处于译码阶段。如果第一条指令是一条预测的分支跳转指令,那么第二条指令及其后续指令便处于一种预测执行的状态。
- 在第一条分支跳转指令是否真正需要跳转经过执行阶段确定之后,如果发现预测错误了,便意味着第二条指令及其后续指令都需要被取消掉并放弃执行;如果发现预测成功了,便意味着第二条指令及其后续指令不需要被取消掉,可以真正执行,解除了预测执行状态,可以被真正地交付。
(2)情形二
- 以五级流水线为例,第一条指令在执行阶段,第二条指令便处于译码阶段。第一条指令遭遇了中断或者异常,那么第二条指令和后续的指令便都需要被取消而放弃执行(无法被交付)。
谈及处理器的交付,还需介绍另外一个常见的概念——流水线冲刷。如上述两种情形,当处理器流水线需要将没有交付的后续指令全部都取消掉,就会造成流水线冲刷——就像流水一样将流水线重新冲刷干净,之后重新开始取新的指令。
二、处理器交付常见实现策略
(1)不管是流水线级数少的简单处理器核,还是流水线级数非常多的高级超标量处理器核,“交付”都通常为顺序判定,理论上只有前一条指令完成了交付之后,才会轮到后一条指令的交付。
(2)影响指令交付的因素通常包括以下情形
- 中断,异常,分支预测指令。这些情形往往会造成流水线冲刷。
- 在有的指令集架构中,还存在着条件码。因此对于每一条指令,只有其条件码满足条件为真才会交付,否则会被取消。
(3)处理器的微架构可以选择一个周期交付一条指令(性能较低)或者一个周期交付多条指令(性能较高)。
(4)在不同的微架构中,“交付”可以在不同的流水线位置完成,没有绝对的标准,常见的策略如下:
- 在执行阶段进行交付。在流水线的执行阶段,理论上已经可以将分支预测指令的结果解析完成,因此有的微架构将交付功能在执行阶段完成。
- 在写回阶段进行交付。由于有的指令需要多个周期才能写回结果,并可能产生错误异常,因此有的微架构将交付功能放在写回阶段进行。
- 在重排序交付队列中进行。对于高性能的超标量处理器而言,往往是乱序执行乱序写回,写回往往会使用ROB或者纯物理寄存器的方式,相应地,往往会配备一个较深的重排序交付队列用来缓存乱序执行的指令信息,并对其按序进行交付。
三、RISC-V架构对于交付的简化
RISC-V指令集架构具有两个显著的特点,可以大幅简化交付的硬件实现。
- 指令没有条件码,因此不需要处理单挑指令取消的情形。
- 所有的运算指令都不会产生异常。这是RISC-V很有意思的特点,大多数的指令集架构都会规定“除法指令除以零”为错误异常,浮点指令也会有若干错误异常。但是RISC-V规定这些运算指令一概不产生错误异常,因此在硬件实现上无须担心多周期指令写回结果后会产生错误异常。
综上,在RISC-V架构的处理器核中只需要处理两类流水线冲刷情形。
- 分支预测指令错误预测造成的后续指令流取消。
- 中断和异常造成的后续指令流取消。