CPU流水线与CPU频率

技术大讲堂

关于CPU流水线的知识,很多报纸杂志都介绍过了,但以往的很多文章对某些问题的解释不够清楚,比如不少文章曾多次提及增加流水线级数有利于提高CPU主频,但对其原因的解释却少有触及,为什么流水线增加频率也能提升呢?本文将带领你找到以上问题的答案。关于流水线的基本原理本文就不再说明了。对于增加流水线级数有利于提升CPU主频这一观点,笔者将通过理论论证和事实举例两方面来进行解释说明。

流水线与周期的关系

我们先对流水线的级数与其周期的关系给出一个公式。一个k级流水线,处理n个任务总共需要花费“k+(n-1)”个周期,这是因为先是处理第一个任务就需要k个时钟周期,k个周期后流水线被装满,剩余n-1个任务只需n-1个周期就能完成。如果同样数量的n个任务不采用流水线处理,那么就需要n*k个周期,我们把两者做比,得到另一个概念,叫做流水线加速比C,所以C=n*k/[k+(n-1)],当n远远大于k时,C的值趋近于k,也就是说,理论上k级流水线几乎可以提高k倍速度,但这仅限于理论。看到这儿也许有的读者可能会感到一头雾水。不用急,下面就将举例进一步说明。

举例前先对流水线周期选取的问题进行一下解析。我们假设一辆成品车的生产过程分为车轮生产,车门生产,最后组装三个步骤,每辆车的车轮生产时间需要8s,车门需要12s,而最后的组装需要10s(图1),在本例中生产厂商针对此情况设计了1条3级流水线,分别是车轮生产流水线,车门生产流水线以及组装流水线,整条流水线的周期选取为12s。注意,在此为什么设置整条流水线的周期为三个步骤中最长的12s呢?其实在现实生产中由于工艺水平,原料特性以及制造难度的不同,每级流水线完成任务的时间都可能是不同的。这里如果选择8s或10s为整条流水线的周期,将会导致车门生产线的任务不能在单位周期内完成,也就无法及时向下一级提交任务,所以在k级流水线中只能选择完成任务所需时间最长的那级流水线的时间作为整条流水线的周期。此例虽然选取12s为整条流水线的周期,但这样又带来了另一个问题,在每个周期内车轮流水线与组装流水线为了等待车门流水线而造成了一定时间上的闲置。具体到CPU内部的流水线也同样存在这个问题。当然我们可以通过合理分配流水线和增加缓存来缓解此问题,但缓存的增加必然导致信号的延迟和高功耗高发热量!

好,我们回到上例,厂商打算在此3级流水线上生产6辆汽车,流水线周期为12s,模拟流程如图2,从图2上可以看到,6辆汽车一共花费了9-1=8个周期,此结果也印证了上文n个任务总共需花费“k+(n-1)”个周期的公式。此3级流水线生产6辆汽车一共花费的时间是12s*8=96s。

一段时间后,厂商决定进行技术改革,又把车轮生产线、车门生产线以及组装生产线进一步细分,如图3所示,把流水线的级数由3条增至6条,改革后的6级流水线周期也从12s缩短至6s(由于细分了各级流水线,所以在此假设每级流水线周期也由原来的8s,12s,10s减半,所以新流水线的周期选取为12s/2=6s),新流水线生产6辆汽车所花费的周期为12-1=11,所花费的整体时间为11*6=66s,相对于上例的96s提升了30s。至此,我们已从理论上和实际上找到了增加流水线级数确实可以提高工作效率的依据,相信大家已经对流水线的知识有了更进一步的了解。这里还要对一些问题进一步说明。

21-e11-b1.jpg

流水线级数与频率的关系

结合上文对周期设置的解释和两个例子的对比,大家可以发现,只要进一步细分流水线增加其级数,就可以使整条流水线采用更短的周期工作。我们又知道频率等于周期的倒数,由此我们得出结论,增加流水线级数有利于提高各级流水线之间交换任务的频率,也就是有利于提高CPU的主频。

增加流水线级数为什么能提升工作效率

我们对车辆1进行跟踪测试,它在3级流水线上的生产时间为8s+12s+10s=30s,同样是车辆1在6级流水线上的生产时间为4s+4s+6s+6s+5s+5s=30s,由此我们发现无论对于几级流水线,单个产品的生产时间并没有因流水线级数而改变,既然这样那流水线是通过什么方式提升工作效率的?图4模拟的是不采用流水线时一辆汽车的生产流程,由3个工人分别负责完成3个任务,从图中可以明显看到在每段时间内只有一个工人在工作,其余两个处于闲置状态,对比前文中的两个图示,我们发现流水线正是充分利用了这段闲置的时间,所以才在单位时间内提升了效率。而且随着流水线级数的增多,对闲置时间的利用也就越充分。

21-e11-b2.jpg

正确看待CPU流水线与频率的提升

CPU流水线与工厂流水线都具有流水线的一些共性,但CPU流水线与工厂流水线也具有一些区别,在本文中我们已得到增加流水线级数有助于提升CPU主频的结论,那为什么Intel的贝瑞特大叔还要放弃冲击4GHz的计划呢?比方说,我们知道任何一种产品的生产都存在良品率高低这个问题,就如本文所举的例子,如果在汽车的生产过程中轮胎流水线上的一个轮胎报废了,这时我们可以在轮胎流水线的末端增加一个任务,然后用本属于第2辆车的轮胎组装给第1辆车,依此类推,这样对整条流水线效率的影响很小,而且对于同一型号的汽车只要使用的是相应型号的轮胎就行,不用计较具体使用的是哪个轮胎。但具体到CPU流水线,问题就不这么简单了。CPU的工作机理可以大致分为指令寻址,指令分析,指令执行,以及指令上报。假设一旦指令流水线中的某个指令的地址出错,是无法像换轮胎那样用另一个地址来顶替的,因为每条指令对应唯一的一个地址,而且一些指令的执行是具有前后次序的,所以并不能简单地对出错的指令进行摒弃作罢,必须从整条流水线上退回重来,对于Intel拥有冗长的31级流水线的处理器来说,这种情况的发生将大大拖累CPU的工作效率。虽然Intel不断通过改进分支预测技术以及增大缓存来改善此问题,但效果并没有达到理想状态,反而由于缓存的增加和漏电流控制不力,铸造了具有火热胸膛的Prescott。

这里只是向大家介绍了CPU流水线与频率的关系。其实提高流水线还有很多本文尚未提及的障碍。增加CPU流水线并不容易,不是想提高就能提高的问题,篇幅有限,这些内容不能在这里一一探讨了。总之,希望本文能为大家理解CPU的流水线与频率的关系提供一些帮助。