0. 引言
流水线是工业社会化大生产背景下的产物,可以极大地提高生产效率。
流水线上的每个工人只需要专注自己所涉及的环节,便可以使整个流水线高效运行。
举个例子,假如生产一步手机需要三个步骤,组装,质检和贴膜包装,如果每个人独立负责各个环节。
这样看似没什么问题,实际上需要很大的学习成本,每个人因为要学习整个手机的生产技能,分身乏术,且一旦产品出了问题,也不方便找到具体的人。
如果是每个人只负责一个环节,就会好很多。
A只负责组装,同理,B负责质检,C负责贴膜和包装,每个人责任明确,工作起来也很高效。CPU流水线与其原理类似。
本篇内容提要:
1.流水线工作原理
一条指令的执行需要经过取指令
,翻译指令
,执行指令
三个基本流程。CPU内部的电路也分为不同的单元:取指单元
、译码单元
、执行单元
等,指令的执行也是按照流水线的工序一步一步执行的。
若不采用流水线技术,则每个时钟周期内只有一个单元在工作,其余两个单元在“观望”,如下图所示:
(假设每个单元的工作周期都为1,且不算流程转换的时间)
引入流水线技术之后,就大不一样了,每个电路单元都状态拉满,基本不会有空闲:
从上图中可以看到,从第三个时钟周期开始,每个单元都会“满状态”工作,CPU的指令执行效率大幅提升。
流水线的本质就是拿空间换时间。将每条指令的步骤分解到不同的电路单元,从而使得多个指令并行执行。
2.超流水线技术
上述流水线确实可以提升CPU的工作效率,但我们假设了每个小环节的执行周期是相同的,但若不同呢?现在我们假设取指单元的工作需要两个时钟周期来完成,就会出现以下情况:
可以发现,又会出现部分工作单元出现空闲的情况,为了进一步提升效率,我们可以这样做:
将取指的工作分配给两个物理单元去完成,这时又会像开始那样,非常高效地运行,如下图所示:
这样设计,我们便通过增加流水线的深度提升了CPU处理指令的效率。
优化前:执行一个指令平均需要2
个指令周期;
优化后:执行一个指令平均仅需要1
个指令周期。
实际的工程中,会根据实际情况来设计流水线的深度,通常我们把5级以上的流水线称为超流水线结构。高性能的处理器一般都会采用这种超流水线结构。Inter的i7处理器有16级流水线,AMD的速龙64系列CPU有20级流水线。
既然每条指令的执行都需要N个时钟周期,那我们便可以通过缩短一个时钟周期的时间来提升效率。影响时钟周期的关键制约因素就是CPU内每个单元消耗的时间。
提升CPU主频的办法有三个:
- 优化流水线中各级的性能。
- 提升搬半导体制造工艺,制程越先进,相对发热越小,越容易提升主频。
- 不断增加流水线深度,流水线越深,各级延迟越小,更容易提升主频。
第一点:受限于目前集成电路的设计水准,比较难实现;
第二点:依靠半导体的制造工艺,工艺制程越先进,越容易提升主频。这也就是为什么荷兰的ASML公司可以卡其他国家脖子,包括我国;
第三点:增加流水线深度,从上面的例子中我们便可以看出来,提升流水线深度确实是个看似比较好的方法,但事实果真如此吗?
弊端一:流水线的的本质是空间换时间,流水线越深,芯片面积越大,功耗越高,这对类似手机类的移动设备来说非常致命,这将意味着更加频繁的充电。
弊端二:如果指令执行是顺序结构的,没有中断或跳转,流水线一般确实越深效率越高。但当程序中存在跳转。分支结构时,下面预取的指令可能要全部丢掉了,需要到跳转的地方重新取指令执行。
比方下面这段代码(汇编):
BEQ R1, R2, here
ADD