CPU中的指令周期CPU周期和时钟周期
Posted 不哭的超人
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CPU中的指令周期CPU周期和时钟周期相关的知识,希望对你有一定的参考价值。
参考资料:
【浅析】CPU中的指令周期、CPU周期和时钟周期 - 知乎 (zhihu.com)
一.指令周期
指令周期:是指计算机从取指到指令执行完毕的时间
计算机执行指令的过程可以分为以下三个步骤:
- Fetch(取指),也就是从 PC 寄存器里找到对应的指令地址,根据指令地址从内存里把具体的指令,加载到指令寄存器中,然后把 PC 寄存器自增,好在未来执行下一条指令。
- Decode(译码),也就是根据指令寄存器里面的指令,解析成要进行什么样的操作,是 R、I、J 中的哪一种指令,具体要操作哪些寄存器、数据或者内存地址。
- Execute(执行指令),也就是实际运行对应的 R、I、J 这些特定的指令,进行算术逻辑操作、数据传输或者直接的地址跳转。
在取指令的阶段,我们的指令是放在存储器(也就是内存)里的,实际上,通过 PC 寄存器和指令寄存器取出指令的过程,是由控制器(Control Unit)操作的。指令的解码过程,也是由控制器进行的。一旦到了执行指令阶段,无论是进行算术操作、逻辑操作的 R 型指令,还是进行数据传输、条件分支的 I 型指令,都是由算术逻辑单元(ALU)操作的,也就是由运算器处理的。不过,如果是一个简单的无条件地址跳转,那么我们可以直接在控制器里面完成,不需要用到运算器。
二. CPU周期
CPU周期亦称机器周期,在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。
例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作(注意:每一个基本操作都是由若干CPU最基本的动作组成)。完成一个基本操作所需要的时间称为机器周期。
通常用内存中读取一个指令字的最短时间来规定CPU周期。
三. 时钟周期
时钟周期也称为振荡周期,定义为时钟频率的倒数。时钟周期是计算机中最基本的、最小的时间单位。在一个时钟周期内,CPU仅完成一个最基本的动作。
四. 周期之间的关系
指令周期(Instruction Cycle):取出并执行一条指令的时间。
CPU周期:一条指令执行过程被划分为若干阶段,每一阶段完成所需时间。
时钟周期(Clock Cycle):又称震荡周期,是处理操作的最基本单位。
对于一个指令周期来说,我们取出一条指令,然后执行它,至少需要两个 CPU 周期。取出指令至少需要一个 CPU 周期,执行至少也需要一个 CPU 周期,复杂的指令则需要更多的 CPU 周期。而一个CPU周期是若干时钟周期之和。
所以,我们说一个指令周期,包含多个 CPU 周期,而一个 CPU 周期包含多个时钟周期。
CPU的流水线指令设计
为什么小小一个CPU,有那么多周期(Cycle)?
程序的性能,是由三个因素相乘来衡量的,“指令数×CPI×时钟周期”。
和周期相关的只有一个时钟周期,即CPU主频的倒数。
一个CPU的时钟周期可以认为是可以完成一条最简单的计算机指令的时间。
那为何构造CPU时,有那么多周期?
单指令周期处理器
一条CPU指令的执行,由FDE三步组成。这个执行过程,至少需花费一个时钟周期。因为在取指令的时候,我们需要通过时钟周期的信号,来决定计数器的自增。
很自然,我们希望能确保让这样一整条指令的执行,在一个时钟周期内完成。
这样,一个时钟周期可执行一条指令,CPI=1,看着就比执行一条指令要多个时钟周期性能好。
这就是单指令周期处理器(Single Cycle Processor):一个时钟周期内,处理器正好能处理一条指令。
但时钟周期固定,指令的电路复杂程度不同,所以实际一条指令执行时间不同。
随门电路层数增加,由于门延迟,位数多、计算复杂指令需执行更久。
不同指令执行时间不同,但要让所有指令都在一个时钟周期内完成,只好把时钟周期和执行时间最长的那个指令一样。不然就会导致快速执行完成的指令,需等待满一个时钟周期,才能执行下一条指令。
虽然CPI能够保持在1,但时钟频率却没法太高。太高,有些复杂指令没法在一个时钟周期内完成。在下个时钟周期到来,开始执行下条指令时,前一条指令执行结果可能还没写入寄存器。下一条指令读取的数据就不准确了。
- 前一条指令的写入,在后一条指令的读取之前
一个CPU时钟周期,可认为是完成一条简单指令的时间。
为什么单指令周期处理器,反而变成执行一条最复杂的指令的时间?
无论是Intel CPU or ARM CPU,都不是单指令周期处理器,而是采用一种叫作指令流水线(Instruction Pipeline)的技术。
现代处理器的流水线设计
指令执行过程会拆分成“取指令、译码、执行”三步。
更细分,执行的过程,还包含从寄存器或内存读数据,通过ALU运算,把结果写回寄存器或内存。
CPU的指令执行过程,其实也是由各电路模块组成:
-
取指令时,需要译码器,把数据从内存取出来,写入寄存器
-
指令译码时,需要另外一个译码器,把指令解析成对应控制信号、内存地址和数据
-
指令执行时,需要一个完成计算工作的ALU。这些都是一个一个独立的组合逻辑电路,我们可以把它们看作一个团队里面的产品经理、后端工程师和客户端工程师,共同协作来完成任务。
-
流水线执行示意图
这就不用把时钟周期设置成整条指令执行的时间,而是拆分成完成这样的一个一个小步骤需要的时间。同时,每一个阶段的电路在完成对应的任务之后,也不需要等待整个指令执行完成,而是可以直接执行下一条指令的对应阶段。
这样的协作模式,就是指令流水线。这里每个独立步骤,称为流水线阶段或流水线级(Pipeline Stage)。
把一个指令拆分成“取指令-指令译码-执行指令”三部分,那这就是一个三级流水线。
进一步把“执行指令”拆分成“ALU计算(指令执行)-内存访问-数据写回”,就变成一个五级流水线。
五级流水线:同一时钟周期里,同时运行五条指令的不同阶段。这时,虽然执行一条指令的时钟周期变成5,但可提高CPU的主频。
无需确保最复杂那条指令在时钟周期里执行完成,只要保障一个最复杂的流水线级操作,在一个时钟周期内完成即可。
若某一操作步骤时间太长,可考虑把该步骤拆分成更多步骤,让所有步骤需执行时间尽量差不多长。这就可解决在单指令周期处理器中遇到的,性能瓶颈来自最复杂的指令的问题。
像ARM或IntelCPU,流水线级数都已到14级。
虽然不能通过流水线,减少单条指令执行的“延时”指标,但通过同时在执行多条指令的不同阶段,提升了CPU的“吞吐率”。
外部看来,我们的CPU好像“一心多用”,同一时间,同时执行5条不同指令的不同阶段。
CPU内部,就像生产线,不同分工的组件不断处理上游传递下来的内容,而无需等待单件商品生产完成后,再启动下一件商品的生产。
超长流水线的性能瓶颈
你说流水线能增加 CPU 吞吐率,流水线级数就越深越好咯?
增加流水线深度,是有性能成本的。
同步时钟周期的,不再是指令级别,而是流水线阶段级别。
每一级流水线对应的输出,都要放到流水线寄存器(Pipeline Register),然后在下一个时钟周期,交给下一个流水线级去处理。
所以,每增加一级流水线,就要多一级写入到流水线寄存器的操作。
虽然流水线寄存器非常快,比如只有20皮秒(ps,
1
0
−
12
10^-12
10−12秒)。
但不断加深流水线,这些操作占整个指令的执行时间的比例就会不断增加。最后,性能瓶颈就会出现在这些overhead。
若指令执行有3ns=3000ps:
- 20级流水线,则流水线寄存器写入就要400ps,占超过10%
- 50级流水线,就要多花费1ns在流水线寄存器上,占到25%
这意味着,单纯增加流水线级数,不仅不能提升性能,反而会有更多overhead开销。所以,设计合理的流水线级数也是现代CPU中非常重要的一点。
总结
为不浪费CPU性能,通过把指令执行过程,切分成一个个流水线级,提升CPU吞吐率。而CPU设计,又是由一个个独立的组合逻辑电路串接起来形成,适合这样采用流水线“专业分工”的工作方式。
因为每一级overhead,一味地增加流水线深度,并不能无限地提高性能。同样地,因为指令的执行不再是顺序地一条条执行,而是在上一条执行到一半的时候,下一条就已经启动了,所以也给我们的程序带来了很多挑战。这些挑战和对应的解决方案,就要请你坚持关注后面的几讲,我们一起来揭开答案了。
参考
- 《深入理解计算机系统》的4.4章节
- 《计算机组成与设计 硬件/软件接口》的4.5章节
以上是关于CPU中的指令周期CPU周期和时钟周期的主要内容,如果未能解决你的问题,请参考以下文章