从单周期到流水线

提升处理器性能

在前两个实验当中,我们实现了单周期处理器。但是处理器的要求不仅仅是功能的正确性,还需要我们的处理器运行的尽可能快速。

那么,如何提高处理器的性能呢?我们知道,在单周期处理器当中,每一个时钟周期,处理器可以执行一条指令。所以,只需要提高处理器的运行频率,便可以获得性能的提升。

例如,我们的单周期处理器运行在 50Mhz 的频率下,如果提高到 200Mhz 那么处理器的运行速度将翻4倍

但很可惜,我们并不能这样做,由于门延迟和线延迟的存在,频率并不能被随意的提升

../_images/%E5%8D%95%E5%91%A8%E6%9C%9F%E5%BB%B6%E8%BF%9F.drawio.svg

如上图所示,如果处理器的延迟为0.8s 那么它可以在 1hz 的频率下正常工作,但是当频率提高到 2hz 时,处理器无法在0.5s内完成工作,那么处理器将会出错而无法被使用。

切分处理器

频率无法被提高的原因是因为延迟过大,那么如何减少延迟呢?比较容易想到的方法是对处理器进行切分,让每一小块负责一部分工作,而每个时钟周期只需要完成这一小块的工作。

一种比较常见的划分方法,是将处理器划分为如下的5个阶段

  • 取指段:负责指令的获取

  • 译码段:负责对指令进行译码,获得控制信号

  • 执行段:通过译码结果,进行运算

  • 访存段:访问内存,完成内存读写

  • 写回段:将状态写回寄存器组,更新指令执行后的状态

然后,我们让每个时钟周期,仅让其中一段进行工作

../_images/%E5%A4%9A%E5%91%A8%E6%9C%9F%E5%BB%B6%E8%BF%9F.drawio.svg

像这样,我们便将处理器的频率提高到了 5hz

流水线

虽然上面的方法成功的将频率提高到了 5hz ,但是显而易见,程序的执行并没有变快,原本1个时钟周期便可以执行完成的指令,现在需要5个时钟周期才能完成。

备注

对于这种情况,我们通常描述为一个处理器的 IPC(每时钟指令数) 过低。例如上面处理器的 ipc = 0.2 ,理想的流水线处理器 ipc 应为1,与单周期处理器相同

然后我们可以观察到,上图的处理器ipc过低的原因是当译码段在工作的时候,取指段竟然在空闲!

我们应该让所有的组件都工作起来

../_images/%E6%B5%81%E6%B0%B4%E7%BA%BF%E5%BB%B6%E8%BF%9F.drawio.svg

这样,我们的处理器的理想 ipc 又恢复到了 1,同时频率也提升为了 5hz。处理器的运行速度翻了5倍!

备注

事实上,由于流水线冲突和跳转预测失败等原因,流水线处理器的ipc小于1,以我完成的流水线处理器为例,在运行跑分程序时 ipc大约为0.81

同时由于你不可能对流水线完成精确五等分,实际的频率也无法提升到原来的5倍,但通常而言,提升到2倍还是可以做到的