为什么小小一个CPU,有那么多周期(Cycle)?
那为何构造CPU时,有那么多周期?
单指令周期处理器
一条CPU指令的执行,由FDE三步组成。这个执行过程,至少需花费一个时钟周期。因为在取指令的时候,我们需要通过时钟周期的信号,来决定计数器的自增。
不同指令执行时间不同,但要让所有指令都在一个时钟周期内完成,只好把时钟周期和执行时间最长的那个指令一样。不然就会导致快速执行完成的指令,需等待满一个时钟周期,才能执行下一条指令。
虽然CPI能够保持在1,但时钟频率却没法太高。太高,有些复杂指令没法在一个时钟周期内完成。在下个时钟周期到来,开始执行下条指令时,前一条指令执行结果可能还没写入寄存器。下一条指令读取的数据就不准确了。
- 前一条指令的写入,在后一条指令的读取之前

一个CPU时钟周期,可认为是完成一条简单指令的时间。
为什么单指令周期处理器,反而变成执行一条最复杂的指令的时间?
无论是Intel CPU or ARM CPU,都不是单指令周期处理器,而是采用一种叫作指令流水线(Instruction Pipeline)的技术。
现代处理器的流水线设计
CPU的指令执行过程,其实也是由各电路模块组成:
- 取指令时,需要译码器,把数据从内存取出来,写入寄存器
- 指令译码时,需要另外一个译码器,把指令解析成对应控制信号、内存地址和数据
- 指令执行时,需要一个完成计算工作的ALU。这些都是一个一个独立的组合逻辑电路,我们可以把它们看作一个团队里面的产品经理、后端工程师和客户端工程师,共同协作来完成任务。
- 流水线执行示意图

这就不用把时钟周期设置成整条指令执行的时间,而是拆分成完成这样的一个一个小步骤需要的时间。同时,每一个阶段的电路在完成对应的任务之后,也不需要等待整个指令执行完成,而是可以直接执行下一条指令的对应阶段。
这样的协作模式,就是指令流水线。这里每个独立步骤,称为流水线阶段或流水线级(Pipeline Stage)。
超长流水线的性能瓶颈
- 20级流水线,则流水线寄存器写入就要400ps,占超过10%
- 50级流水线,就要多花费1ns在流水线寄存器上,占到25%
这意味着,单纯增加流水线级数,不仅不能提升性能,反而会有更多overhead开销。所以,设计合理的流水线级数也是现代CPU中非常重要的一点。
总结
为不浪费CPU性能,通过把指令执行过程,切分成一个个流水线级,提升CPU吞吐率。而CPU设计,又是由一个个独立的组合逻辑电路串接起来形成,适合这样采用流水线“专业分工”的工作方式。
参考
- 《深入理解计算机系统》的4.4章节
- 《计算机组成与设计 硬件/软件接口》的4.5章节
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228225.html原文链接:https://javaforall.net
