虽然我们不能通过流水线,来减少单条指令执行的“延时”这个性能指标,但是,通过同时在执行多条指令的不同阶段,我们提升了 CPU 的“吞吐率”。在外部看来,我们的 CPU 好像是“一心多用”,在同一时间,同时执行 5 条不同指令的不同阶段。在 CPU 内部,其实它就像生产线一样,不同分工的组件不断处理上游传递下来的内容,而不需要等待单件商品生产完成之后,再启动下一件商品的生产过程
在单发射流水线中,如果上一条指令在ID段被阻塞,那么下一条指令的IF段就会被阻塞(即还不能取出(发射)下一条指令,否则会覆盖指令寄存器的内容,导致上一条指令还没译码就被覆盖了)
流水线有建立时间和排空时间
五级的流水线,就表示我们在同一个时钟周期里面,同时运行五条指令的不同阶段。这个时候,虽然执行一条指令的时钟周期变成了5,但是我们可以把 CPU 的主频提得更高了。我们不需要确保最复杂的那条指令在一个时钟周期里面执行完成,而只要保障一个最复杂的流水线级的操作,在一个时钟周期内完成就好了
单看一条指令,一定需要很多个时钟周期。但是呢,因为有流水线,同时又会去执行很多个指令的不同步骤。超线程技术等等,从吞吐量的角度来看,我们又能够做到,平均一个时钟周期里面,完成指令数可以超过 1
流水线级数过多的影响
- 流水线并不能真正减少一条指令的执行时间,实际上,由于流水线寄存器延迟(流水寄存器需要建立时间和传输延迟,建立时间:在触发写操作的时钟信号到达之前,寄 存器输入必须保持稳定的时间。 传输延迟:时钟信号到达后到寄存器输出可用的时 间 )和时钟偏移开销(流水线中,时钟到达各流水寄存器的最大差值时间。因为时钟到达各流水寄存器的时间不是完全相同)这些额外开销的存在,反而会使每条指令执行的时间有所增加
- 流水线的级数越多,意味着流水线被切得越细,每一级流水线内容纳硬件逻辑越少,意味着必须运行更高的主频(保证CPI不变)。主频越高,流水线的吞吐率越高
- 级数划分越多,每级的工作内容就越不好划分,取指译码执行的过程中可能划分不出那么多的工作流程
- 级数越多,级间缓冲寄存器就越多,写入寄存器的耗时就越多,使用的晶体管也会变多,占用更多的芯片面积,增加了电路复杂度和功耗
- 更深的流水线意味着同时在流水线里面的指令就多,相互的依赖关系就多。需要更多的硬件来解决这些问题
- 长流水线也会占用更多的内存带宽
- 增加了出错的风险。因为流水线的每个阶段都依赖上一个阶段完成的结果
- 当流水线级数过多时,如果每个阶段的处理时间不均衡,会导致某些阶段处于空闲状态(Idle),从而影响流水线整体吞吐量。一些解决方案包括用更精细的流水线划分来减小不均衡的处理时间,或者采用动态调整流水线级数的方法来调整流水线各阶段工作状态
- 流水线的取指阶段需要进行分支预测,如果预测失败,需要将所有的预取指令全部丢失。流水线越深,则意味着浪费和损失越严重;流水线越浅,则浪费和损失越少