什么是流水线?
维基百科中的定义是:
将计算机指令处理过程拆分为多个步骤,并通过多个硬件处理单元并行执行来加快执行速度。
这里有两个关键词:
1. 拆分
2. 执行
指令的执行直观有三个步骤:
假如这三个步骤都由一个硬件处理单元完成,且假设每个步骤处理时间都是T,那么完成三个操作需要3T的时间。
如果有n条指令,那么就需要3nT的时间来完成。
但是,假如我们有三个硬件处理单元,分别做取指,译码,执行的一个。那么就可以在译码的时候对下一条指令取指,在执行的时候对下一条指令译码。这就是经典的三级流水线。
五级流水线
在三级流水中我们做了一个假设,即每一个步骤的时间都是T,现实往往不是那么完美的。
比如,取指的时间就可能会很长,假设需要2T的时间,那么三级流水线就会变成如下的模样
可以看到执行3条指令的时间从5T变成了8T
如何解决取指时间过长的问题?
引入缓存(Cache),处理器从缓存中读取指令只需要一个时钟周期。
但我们还要面临另一种情况:执行时间过程,尤其是Load/Store指令(加载,存储),由于涉及访问存储器。执行时间可能会超过一个时钟周期,导致流水线停滞。
为了解决这种问题,我们的解决方案是:五级流水线
分别是:取指,译码,执行,访存,回写
如图
五级流水线中,每一个阶段的主要工作如下:
- 取指:从指令存储器独出指令,同时确定下一条指令地址。
- 译码: 对指令进行译码,从通用寄存器中读出要使用的寄存器的值,如果指令中含有立即数,那么还要将立即数进行符号扩展和无符号扩展。如果是转移指令,并且满足转移条件,那马给出转移目标,作为新的指令地址。
- 执行:按照译码阶段给出的操作数、运算类型、进行运算,给出运算结果。如果是Load/Store指令,那么还会计算Load/Store的目标地址。
- 访存:如果是Load/Store指令,那么在此阶段会访问数据存储器,反之,只是将执行阶段结果向下传递到回写阶段。同时,在此阶段还要判断是否有异常需要处理,如果有,那么会清除流水线,如何转移到异常处理例程入口地址处继续执行。
- 回写:将运算结果保存到目标寄存器。