流水线的作用
流水线设计就是将组合逻辑系统地分割,
并在各个部分(分级)之间插入寄存器,
并暂
存中间数据的方法。目的是提高数据吞吐率(提高处理速度)
。流水线缩短了在一个时钟周
期内给的那个信号必须通过的通路长度,从而可以提高时钟频率。
例如:一个
2
级组合逻辑,假定每级延迟相同为
Tpd
,
1.
无流水线的总延迟就是
2Tpd
,可以在一个时钟周期完成,但是时钟周期受限制在
2Tpd
;
2.
流水线:每一级加入寄存器(延迟为
Tco
)后,单级的延迟为
Tpd+Tco
,每级消耗一个时
钟周期,流水线需要
2
个时钟周期来获得第一个计算结果,称为首次延迟,它要
2*
(
Tpd+T
co
)
,但是执行重复操作时,只要一个时钟周期来获得最后的计算结果,称为吞吐
延迟(
Tpd+Tco
)
;可见只要
Tco
小于
Tpd
,流水线就可以提高速度。
推论:
增加流水线长度可以节省更多延迟,流水线越长,
首次延迟越大,如果流水线反复启
动,则会损失速度。
实现流水线的代价:
1.
消耗寄存器-就是消耗硅片面积(想想
20
级流水线的某著名
CPU
吧)
2.
流水线长则消耗更多时钟周期。
(如果流水线反复启动,则会损失速度,想想某
CPU
著名的高频率低效能吧)
<
深入介绍一下
CPU
的原理
>--
流水线原理应用
=======================================
流水线(
Pipeline
)
流水线是现代
RISC
核心的一个重要设计,它极大地提高了性能。
对于一条具体的指令执行过程,
通常可以分为五个部分:
取指令,
指令译码,
取操作数,
运算(
ALU
)
,写结果。其中前三步一般由指令控制器完成,后两步则由运算器完成。按照
传统的方式,所有指令顺序执行,那么先是指令控制器工作,
完成第一条指令的前三步,然
后运算器工作,完成后两步,在指令控制器工作,完成第二条指令的前三步,在是运算器,
完成第二条指令的后两部
……
很明显,
当指令控制器工作是运算器基本上在休息,
而当运算
器在工作时指令控制器却在休息,
造成了相当大的资源浪费。
解决方法很容易想到,
当指令
控制器完成了第一条指令的前三步后,
直接开始第二条指令的操作,
运算单元也是。
这样就
形成了流水线系统,这是一条
2
级流水线。
如果是一个超标量系统,
假设有三个指令控制单元和两个运算单元,
那么就可以在完成
了第一条指令的取址工作后直接开始第二条指令的取址,
这时第一条指令在进行译码,
然后
第三条指令取址,第二条指令译码,第一条指令取操作数
……
这样就是一个
5
级流水线。
很显然,
5
级流水线的平均理论速度是不用流水线的
4
倍。
流水线系统最大限度地利用了
CPU
资源,使每个部件在每个时钟周期都工作,大大提
高了效率。但是,流水线有两个非常大的问题:相关和转移。
在一个流水线系统中,
如果第二条指令需要用到第一条指令的结果,
这种情况叫做相关。
以上面那个
5
级流水线为例,当第二条指令需要取操作数时,第一条指令的运算还没有完
成,如果这时第二条指令就去取操作数,
就会得到错误的结果。所以,
这时整条流水线不得
不停顿下来,等待第一条指令的完成。这是很讨厌的问题,特别是对于比较长的流水线,比
如
20
级,这种停顿通常要损失十几个时钟周期。目前解决这个问题的方法是乱序执行。乱
序执行的原理是在两条相关指令中插入不相关的指令,
使整条流水线顺畅。
比如上面的例子
中,开始执行第一条指令后直接开始执行第三条指令(假设第三条指令不相关)
,然后才开
始执行第二条指令,
这样当第二条指令需要取操作数时第一条指令刚好完成,
而且第三条指
令也快要完成了,整条流水线不会停顿。
当然,流水线的阻塞现象还是不能完全避免的,尤
其是当相关指令非常多的时候。
另一个大问题是条件转移。
在上面的例子中,
如果第一条指令是一个条件转移指令,
那
么系统就会不清楚下面应该执行那一条指令?这时就必须等第一条指令的判断结果出来才
能执行第二条指令。
条件转移所造成的流水线停顿甚至比相关还要严重的多。
所以,
现在采
用分支预测技术来处理转移问题。
虽然我们的程序中充满着分支,
而且哪一条分支都是有可
能的,
但大多数情况下总是选择某一分支。
比如一个循环的末尾是一个分支,
除了最后一次
我们需要跳出循环外,
其他的时候我们总是选择继续循环这条分支。
根据这些原理,
分支预
测技术可以在没有得到结果之前预测下一条指令是什么,
并执行它。
现在的分支预测技术能
够达到
90%
以上的正确率,但是,一旦预测错误,
CPU
仍然不得不清理整条流水线并回到
分支点。
这将损失大量的时钟周期。
所以,
进一步提高分支预测的准确率也是正在研究的一
个课题。
越是长的流水线,相关和转移两大问题也越严重,所以,
流水线并不是越长越好,
超标
量也不是越多越好,找到一个速度与效率的平衡点才是最重要的。