上一篇:寄存器重命名
下一篇:分支预测
单周期CPU问题
早期的RISC CPU采用了简单的单周期执行模式,也就是说每个时钟周期只执行一条指令。这样做的好处是设计简单:CPU只需要一条一条指令执行,在上一条指令完全执行完成之后再执行下一条指令。如果从软件设计的角度来看这个设计的话,也就是单线程程序了。我们在设计单线程程序时只需要考虑指令间的逻辑顺序就可以了。相对地,我们在设计多线程程序时就需要考虑多个线程之间的操作顺序问题,可能某个线程A在计算到某一步时需要线程B的中间结果,如果A执行得比B快,那么A就需要等待B,如果A执行得比B慢,那么A就需要找到B之前算出来的结果放在哪里,再把数据取出来。
而对于多核CPU,一个计算任务只通过一个线程执行,和通过多个线程执行的效率显然是有差别的(如果实现计算任务的程序对多核CPU优化比较到位)。而且这样做能充分利用多核CPU的硬件资源而不导致浪费。
那么我们回到CPU设计上,如果我们等待一条指令完全执行完成了以后再执行下一条指令,那么这会导致硬件资源的浪费。对于单周期CPU,指令的执行过程将是5个步骤依次执行。当指令执行到某个步骤时,剩下4个步骤的硬件资源将被闲置(由于我们会在电路中大量使用触发器,而触发器是属于耗能比较大的器件,因此充分利用硬件资源还能够降低我们设计的CPU的功耗,提升能耗比)。假定这里的单周期CPU每个阶段的执行占用一个时钟周期,如果提供了500MHz的时钟,那么这个CPU最多只能有100MHz的指令执行频率,每条指令执行需要的时钟周期数CPI(也就是执行一条指令平均需要的周期数)在最好的情况下只有5。同频率下,单周期CPU的指令执行数比多周期的少,效率也就低。
因此,充分利用硬件资源提升CPU的计算速度和降低能耗比是很有必要的。
指令执行方式
执行过程图示
上图中,横坐标为时间,向右为正方向,表示时间的增加;纵坐标为指令的执行顺序,正方向向下,沿着正方向指令的执行次序更晚。我们在理想情况下执行了5条指令(每行表示一条指令的执行过程),可以看到每过一个时钟周期就会有一条新指令开始执行(进入IF阶段)。我们在时间段1时只有第一条指令在IF阶段,时间段2是第一条指令进入了ID阶段,又有一条新指令进入IF阶段,时间段5时每个阶段的硬件资源都有指令在执行,此时硬件利用率最高(100\%)。时刻9后指令全部执行完成。
\paragraph{分析} 以上就是多周期CPU提升硬件资源利用效率的方法,我们将一条指令分成5个阶段,那么每条指令只错开一个阶段的执行之间开始执行,就不会发生同时使用某个硬件资源的状况,从而使得指令的执行像是在“并行”执行一样(虽然和并行有根本区别),时间段5同时有5条指令在执行。如果是单周期的CPU,这5条指令需要 5×5=25