1. 基本概念
1.1 基本概念
- 流水线的段(级):流水线中的每个子过程及其功能部件称为流水线的级或段,段与段相互连接形成流水线。
- 流水线的瓶颈段:流水线中执行时间最长的段。(会影响流水线性能)
- 实施流水线技术的两个基本步骤:
(1)把一个重复的过程分解为若干个子过程,每个子过程由专门的功能部件来实现。
(2)多个任务在时间上错开,依次通过各功能段,这样,每个子过程就可以与其它的子过程并行进行。 - 流水线表示方法:
时空图,横坐标代表时间,纵坐标代表流水线的各个段。(标号1属于同一任务)
1.2 流水线分类
- 按用于计算机系统的等级划分:
(1)部件级流水线:将处理机中的部件分段,再把这些分段相互连接起来,使得各种类型的运算操作能够按流水方式进行。(求阶差-对阶-尾数相加-规格化)
(2)处理机级流水线:把一条指令的执行过程分解为若干个子过程,每个子过程在独立的功能部件中执行。(取值-译码-执行-访存-写回)
(3)处理机间流水线(宏流水线):将多台处理机串行连接起来,对同一数据流进行处理,每个处理机完成整个任务中的一部分。(Map-Reduce) - 按所完成的功能划分
(1)单功能流水线:只能完成一种固定功能的流水线。
(2)多功能流水线:各段可以进行不同的连接,从而实现不同功能的流水线。
①静态流水线:同一时间内,多功能流水线中的各段只能按同一种功能的连接方式工作。
②动态流水线:同一时间内,多功能流水线中的各段可以按照不同的方式连接,同时执行多种功能。 - 按是否有反馈回路划分
(1)线性流水线:数据通过流水线中的各段时,每一个段最多只流过一次。
(2)非线性流水线:流水线中除了有串行的连接外,还有反馈回路。同一任务可能多次通过同一个段。存在任务调度问题。 - 按任务流入和流出的顺序是否相同划分
(1)顺序流水线:流水线输出端任务流出的顺序与输入端任务流入的顺序完全相同。
(2)乱序流水线:流水线输出端任务流出的顺序与输入端任务流入的顺序可以不同。
2. 性能指标
2.1 吞吐率
吞吐率 (Though put rate, TP), 指在单位时间内流水线所完成的任务数量或输出结果的数量。(n: 任务数;Tk: 处理完成n个任务所用时间, k是一个任务的段数)
T
P
=
n
T
k
TP = \frac{n}{{{T_k}}}
TP=Tkn
- 一个任务的各段时间均等时
T k = ( k + n − 1 ) Δ t {T_k} = (k + n - 1)\Delta t Tk=(k+n−1)Δt
最大吞吐率
T P max = lim n → ∞ n ( k + n − 1 ) Δ t = 1 Δ t T{P_{\max }}{\rm{ = }}\mathop {\lim }\limits_{n \to \infty } \frac{n}{{(k + n - 1)\Delta t}} = \frac{1}{{\Delta t}} TPmax=n→∞lim(k+n−1)Δtn=Δt1
实际吞吐率
T P = n k + n − 1 T P max TP = \frac{n}{{k + n - 1}}T{P_{\max }} TP=k+n−1nTPmax - 一个任务的各段时间不均等时
T k = ∑ i = 1 k Δ t i + ( n − 1 ) max ( Δ t 1 , Δ t 2 , ⋅ ⋅ ⋅ , Δ t k ) {T_k} = \sum\limits_{i = 1}^k {\Delta {t_i}} + (n - 1)\max (\Delta {t_1},\Delta {t_2}, \cdot \cdot \cdot ,\Delta {t_k}) Tk=i=1∑kΔti+(n−1)max(Δt1,Δt2,⋅⋅⋅,Δtk)
最大吞吐率
T P max = max ( Δ t 1 , Δ t 2 , ⋅ ⋅ ⋅ , Δ t k ) T{P_{\max }} = \max (\Delta {t_1},\Delta {t_2}, \cdot \cdot \cdot ,\Delta {t_k}) TPmax=max(Δt1,Δt2,⋅⋅⋅,Δtk)
实际吞吐率
T P = n ∑ i = 1 k Δ t i + ( n − 1 ) max ( Δ t 1 , Δ t 2 , ⋅ ⋅ ⋅ , Δ t k ) TP = \frac{n}{{\sum\limits_{i = 1}^k {\Delta {t_i}} + (n - 1)\max (\Delta {t_1},\Delta {t_2}, \cdot \cdot \cdot ,\Delta {t_k})}} TP=i=1∑kΔti+(n−1)max(Δt1,Δt2,⋅⋅⋅,Δtk)n
2.2 加速比
加速比 (Speedup ratio, S), 是完成同样一批任务,不使用流水线所用的时间与使用流水线所用的时间之比。(Ts是不使用流水线所用的时间, Tk是使用流水线所用的时间)
S
=
T
s
T
k
S = \frac{{T_s}}{{{T_k}}}
S=TkTs
- 一个任务的各段时间均等时
T k = ( k + n − 1 ) Δ t {T_k} = (k + n - 1)\Delta t Tk=(k+n−1)Δt
T s = n k Δ t {T_s} = nk\Delta t Ts=nkΔt
实际加速比
S = n k k + n − 1 S = \frac{{nk}}{{k + n - 1}} S=k+n−1nk
最大加速比
S max = lim n → ∞ n k k + n − 1 = k {S_{\max }} = \mathop {\lim }\limits_{n \to \infty } \frac{{nk}}{{k + n - 1}}=k Smax=n→∞limk+n−1nk=k - 一个任务的各段时间不均等时
实际加速比
S = n ∑ i = 1 k Δ t i ∑ i = 1 k Δ t i + ( n − 1 ) max ( Δ t 1 , Δ t 2 , ⋅ ⋅ ⋅ , Δ t k ) S = \frac{{n\sum\limits_{i = 1}^k {\Delta {t_i}} }}{{\sum\limits_{i = 1}^k {\Delta {t_i}} + (n - 1)\max (\Delta {t_1},\Delta {t_2}, \cdot \cdot \cdot ,\Delta {t_k})}} S=i=1∑kΔti+(n−1)max(Δt1,Δt2,⋅⋅⋅,Δtk)ni=1∑kΔti
2.3 效率
效率 (Efficiency, E), 是流水线中的设备实际使用时间与整个运行时间的比值。由于流水线有通过时间和排空时间,所以在连续完成n个任务的时间内,各段并不是满负荷地工作。
- 一个任务的各段时间均等时
实际效率
E = k n Δ t k T k = n Δ t ( k + n − 1 ) Δ t = n k + n − 1 E = \frac{{kn\Delta t}}{{k{T_k}}} = \frac{{n\Delta t}}{{(k + n - 1)\Delta t}} = \frac{n}{{k + n - 1}} E=kTkknΔt=(k+n−1)ΔtnΔt=k+n−1n
E = T P ⋅ Δ t = S S max E = TP \cdot \Delta t = \frac{S}{{{S_{\max }}}} E=TP⋅Δt=SmaxS
最大效率
E max = lim n → ∞ n k + n − 1 = 1 {E_{\max }} = \mathop {\lim }\limits_{n \to \infty } \frac{n}{{k + n - 1}} = 1 Emax=n→∞limk+n−1n=1 - 一个任务的各段时间不均等时
E = n ∑ i = 1 k Δ t i k [ ∑ i = 1 k Δ t i + ( n − 1 ) ⋅ max ( Δ t 1 , Δ t 2 , ⋅ ⋅ ⋅ Δ t k ) ] E = \frac{{n\sum\limits_{i = 1}^k {\Delta {t_i}} }}{{k[\sum\limits_{i = 1}^k {\Delta {t_i} + (n - 1) \cdot \max (\Delta {t_1},\Delta {t_2}, \cdot \cdot \cdot \Delta {t_k})} ]}} E=k[i=1∑kΔti+(n−1)⋅max(Δt1,Δt2,⋅⋅⋅Δtk)]ni=1∑kΔti
2.4 流水线设计中的问题
- 瓶颈段
(1)细分瓶颈段
(2)重复设置瓶颈段 - 额外开销
(1)流水线寄存器需要建立时间和传输延迟
(2)时钟偏移开销 - 冲突问题
流水线并不能减少(而且一般是增加)单条指令的执行时间,但却能提高吞吐率。
增加流水线的深度(段数)可以提高流水线的性能。
流水线的深度受限于流水线的额外开销
3. 流水线的相关
相关是指两条指令之间存在某种依赖关系,如果两条指令相关,则它们就有可能不能在流水线中重叠执行或者只能部分重叠执行。
相关分为:数据相关、名相关、控制相关
3.1 数据相关
- 对于两条指令i(在前,下同)和j(在后,下同),如果满足(1)或(2),则称指令j与指令i数据相关
(1)指令j使用指令i产生的结果
(2)指令j与指令k数据相关,而指令k又与指令i数据相关 - 数据相关特点:
(1)具有传递性
(2)数据相关反映了数据的流动关系,即如何从其产生者流动到其消费者
3.2 名相关
名是:指令所访问的寄存器或存储器单元的名称
如果两条指令使用相同的名,但是它们之间并没有数据流动,则称这两条指令存在名相关。
- 反相关:如果指令j写的名与指令i读的名相同,则称指令i和j发生了反相关。
- 输出相关:如果指令j和指令i写相同的名,则称指令i和j发生了输出相关。
- 名相关特点:
(1)名相关的两条指令之间并没有数据的传送
(2)如果一条指令中的名改变了,并不影响另外一条指令的执行 - 消除名相关技术:换名技术,通过改变指令中操作数的名来消除名相关(对于寄存器操作数进行换名称为寄存器换名),既可以用编译器静态实现,也可以用硬件动态完成
3.3 控制相关
控制相关是指由分支指令引起的相关。为了保证程序应有的执行顺序,必须严格按控制相关确定的顺序执行
4. 流水线的冒险(冲突)
4.1 冒险的分类
- 结构冒险
定义: 因硬件资源满足不了指令重叠执行的要求而发生的冲突。(在重叠执行模式下,如果硬件无法同时支持指令的所有可能组合方式,就会出现资源冲突,从而导致结构冒险)
原因:①功能部件不是完全流水 ②资源份数不够
解决:①插入暂停周期 ②设置相互独立的存储器分别存储指令与数据。通过增加资源数量,来避免访问同一资源导致的冲突。 - 数据冒险
定义:当指令在流水线中重叠执行时,因需要用到前面指令的执行结果而发生的冲突。(根据流水线中的指令重叠,指令之间存在先后顺序,如果一条指令取决于先前指令的结果,就可能导致数据冒险)
原因:写后读(RAW)、写后写(WAW)、读后写(WAR,对应反相关)、写后写(WAW,对应输出相关)
解决:①定向技术(短路或旁路技术)是一种缓解数据冲突(减少冲突引起的停顿时间)的典型方法。即在原有的寄存器传递数据的基础上,增加了新的指令间传递数据的路径。定向技术不能解决所有数据冲突。②指令调度或流水线调度:让编译器重新组织指令顺序来消除冲突。 - 控制冒险
定义:流水线遇到分支指令和其他会改变PC值的指令所引起的冲突。(分支指令及其他改变程序计数器的指令实现流水化时可能导致控制冒险)控制冲突指由分支指令引起的指令延迟。
解决: 冻结或排空流水线,发现分支指令后,将其后的所有指令置空,直到分支是否成功以及分支目标地址算出来为止。
分支指令有高频和高延迟的特点,如何减小分支延迟?
(1)通过设置专用的处理单元,在流水线中尽早地判断出分支转移是否成功,以及分支目标地址。
(2)基于编译器的软件方法:①总是预测分支失败 ②预测分支总是成功 ③延迟分支
4.2 冒险带来的问题与解决方法
- 出现错误的执行结果
- 流水线出现停顿,会降低流线线效率和实际加速比
- 通过暂停指令来解决(暂停前流出的指令继续执行,之后的指令暂停执行)