
5 指令流水线

5.1 指令流水的定义
一条指令的执行过程可以分成多个阶段(或过程)。根据计算机的不同,具体的分法也不同。

- 取指:根据Pc内容访问主存储器,取出一条指令送到IR中。
- 分析:对指令操作码进行译码,按照给定的寻址方式和地址字段中的内容形成操作数的有效地址EA,并从有效地址EA中取出操作数。
- 执行:根据操作码字段,完成指令规定的功能,即把运算结果写到通用寄存器或主存中。
而流水线就是利用每个阶段用到的硬件不一样,充分利用这些硬件的空余时间就衍生出了指令流水线。
指令之间的执行顺序安排:
先假设取值、分析、执行3个阶段的时间都相等,用 t 表示,按以下几种执行方式分析 n 条指令的执行时间
-
顺序执行安排–总耗时间:
n*3t
传统冯·诺依曼机采用顺序执行方式,又称串行执行方式。
-
优点:控制简单,硬件代价小。
-
缺点:执行指令的速度较慢,在任何时刻,处理机中只有一条指令在执行,各功能部件的利用率很低。
-
-
一次重叠执行方式–总耗时
T= 3t +(n-1)×2t = (1+2n)*t
-
优点:程序的执行时间缩短了1/3,各功能部件的利用率明显提高。
-
缺点:需要付出硬件上较大开销的代价,控制过程也比顺序执行复杂了。
聆
-
-
二次重叠执行方式
与顺序执行方式相比,指令的执行时间缩短近2/3。这是一种理想的指令执行方式,在正常情况下,处理机中同时有3条指令在执行。
我们也可以把每条指令执行过程分成4或5个阶段,分成5个阶段时比较常见的
5.2 流水线的表示方法
-
指令执行过程图
-
时空图
不同的阶段对应不同的硬件资源,所以这个图指挥越来越长,不会越来越高。
主要用于流水线的分析
5.3 流水线的性能指标
以下计算性能指标都是基于理想状态,也就是各阶段花费时间相同,每个阶段结束后能立即进入下一个阶段
-
吞吐率
吞吐率是指在单位时间内流水线所完成的任务数量,或是输出结果的数量。
设任务数为n,处理完成n个任务所用的时间为 Tk
则计算流水线吞吐率(TP)的最基本的公式为
T P = n T k TP=\frac{n}{T_k} TP=Tkn
理想情况下,流水线的时空图如下:$$ 一条指令的执行分为k个阶段,每个阶段耗时\Delta t ,一般取\Delta t =一个时钟周期\\ T_k=(k-1+n)\Delta t\\ 流水线的实际吞水率为:TP=\frac{n}{(k-1+n)\Delta t} $$ 第一条指令执行过程称为装入时间,最后一条指令执行过程称为排空时间。
在装入时间和排空时间期间硬件利用率最大,每一个时钟周倜结束都有一条指令执行完毕。
-
加速比
完成同样一批任务,不使用流水线所用的时间与使用流水线所用的时间之比。
一 条 指 令 的 执 行 分 为 k 个 阶 段 , 每 个 阶 段 耗 时 Δ t , 一 般 取 Δ t = 一 个 时 钟 周 期 设 T 0 表 示 不 使 用 流 水 线 时 的 执 行 时 间 , 即 顺 序 执 行 所 用 的 时 间 ; T k 表 示 使 用 流 水 线 时 的 执 行 时 间 . 则 计 算 流 水 线 加 速 比 ( S ) 的 基 本 公 S = T 0 T k = k n Δ t ( n + k − 1 ) Δ t = k n k − n − 1 注 意 在 不 理 想 的 情 况 下 需 要 照 S = T 0 T k 来 算 一条指令的执行分为k个阶段,每个阶段耗时\Delta t ,一般取\Delta t =一个时钟周期\\ 设T_0表示不使用流水线时的执行时间,即顺序执行所用的时间;\\ T_k表示使用流水线时的执行时间.\\ 则计算流水线加速比(S)的基本公\\ S=\frac{T_0}{T_k}=\frac{kn\Delta t}{(n+k-1)\Delta t}=\frac{kn}{k-n-1}\\ 注意在不理想的情况下需要照S=\frac{T_0}{T_k}来算\\ 一条指令的执行分为k个阶段,每个阶段耗时Δt,一般取Δt=一个时钟周期设T0表示不使用流水线时的执行时间,即顺序执行所用的时间;Tk表示使用流水线时的执行时间.则计算流水线加速比(S)的基本公S=TkT0=(n+k−1)ΔtknΔt=k−n−1kn注意在不理想的情况下需要照S=TkT0来算
当n趋于无穷,近似相当于加速了k倍,也就是最大加速比为k -
效率
流水线的设备利用率称为流水线的效率。
在时空图上,流水线的效率定义为完成n个任务占用的时空区有效面积与n个任务所用的时间与k个流水段所围成的时空区总面积之比。
一 条 指 令 的 执 行 分 为 k 个 阶 段 , 每 个 阶 段 耗 时 Δ t , 一 般 取 Δ t = 一 个 时 钟 周 期 流 水 线 效 率 ( E ) 的 一 般 公 式 为 E = n 个 任 务 占 用 k 时 空 区 有 效 面 积 n 个 任 务 所 用 时 间 与 k 个 流 水 段 所 围 成 的 时 空 区 总 面 积 = T 0 k T k 当 任 务 数 n 趋 近 于 无 穷 , 效 率 近 似 于 1 一条指令的执行分为k个阶段,每个阶段耗时\Delta t ,一般取\Delta t =一个时钟周期\\ 流水线效率(E)的一般公式为\\ E=\frac{n个任务占用k时空区有效面积}{n个任务所用时间与k个流水段所围成的时空区总面积}=\frac{T_0}{kT_k}\\ 当任务数n趋近于无穷,效率近似于1\\ 一条指令的执行分为k个阶段,每个阶段耗时Δt,一般取Δt=一个时钟周期流水线效率(E)的一般公式为E=n个任务所用时间与k个流水段所围成的时空区总面积n个任务占用k时空区有效面积=kTkT0当任务数n趋近于无穷,效率近似于1
5.4 机器周期的设置
这里以指令执行分为五个阶段为例
为方便流水线的设计,将每个阶段的耗时取成一样,以最长耗时为准。即此处应将机器周期设置为100ns
。

流水线每一个功能段部件后面都要有一个缓冲寄存器,或称为锁存器,其作用是保存本流水段的执行结果,提供给下一流水段使用。
5.5 影响流水线的因素
-
结构相关(资源冲突)
由于多条指令在同一时间争取同一资源而形成的冲突称为结构相关。
解决办法:
-
后一相关指令暂停一周期
-
资源重复配置:数据存储器和指令存储器分开
-
-
数据相关(数据冲突)
数据相关指在一个程序中,存在必须等前一条指令执行完才能执行后一条指令的情况,则这两条指令即为数据相关。
在指令顺序执行过程,这是没有问题的。但在指令流水线执行确是有问题的!
解决办法:
-
把遇到数据相关的指令及其后续指令都暂停一至几个时钟周期,直到数据相关问题消失后再继续执行。可分为硬件阻塞(stall)和软件插入“NOP”两种方法。
硬件上stall:
软件上插入空指令(具有完整的周期):
-
数据旁路技术
可以发现r1需要的数据在第二个时钟周期就已经计算出来了,后面只是写入存储器。数据旁路技术就是将得到的数据直接输送给下一条指令
-
编译优化
通过编译器调整指令顺序来解决数据相关。(题目中专业术语如:按序发射就是不允许更改指令顺序)
上面是三种解决办法,下面分析那些情况会数据冲突:RAW,WAR,WAW(R读,A在之后,W写)
例题:
-
-
控制相关
当流水线遇到转移指令和其他改变PC值的指令而造成断流时,会引起控制相关。
解决办法:
- 尽早判别转移是否发生,尽早生成转移目标地址
- 预取转移成功和不成功两个控制流方向上的目标指令
- 加快和提前形成条件码
- 提高转移方向的猜准率
5.6 流水线的分类(了解)
-
部件功能级、处理机级和处理机间级流水线
根据流水线使用的级别的不同,流水线可分为部件功能级流水线、处理机级流水线和处理机间流水线。
- 部件功能级流水就是将复杂的算术逻辑运算组成流水线工作方式。例如,可将浮点加法操作分成求阶差、对阶、尾数相加以及结果规格化等4个子过程。
- 处理机级流水是把一条指令解释过程分成多个子过程,如前面提到的取指、译码、执行、访存及写回5个子过程。
- 处理机间流水是一种宏流水,其中每一个处理机完成某一专门任务,各个处理机所得到的结果需存放在与下一个处理机所共享的存储器中。
-
单功能流水线和多功能流水线
按流水线可以完成的功能,流水线可分为单功能流水线和多功能流水线。
- 单功能流水线指只能实现一种固定的专门功能的流水线;
- 多功能流水线指通过各段间的不同连接方式可以同时或不同时地实现多种功能的流水线。
-
动态流水线和静态流水
按同一时间内各段之间的连接方式,流水线可分为静态流水线和动态流水线。
- 静态流水线指在同一时间内,流水线的各段只能按同一种功能的连接方式工作。
- 动态流水线指在同一时间内,当某些段正在实现某种运算时,另一些段却正在进行另一种运算。这样对提高流水线的效率很有好处,但会使流水线控制变得很复杂。
-
线性流水线和非线性流水线
按流水线的各个功能段之间是否有反馈信号,流水线可分为线性流水线与非线性流水线。
- 线性流水线中,从输入到输出,每个功能段只允许经过一次,不存在反馈回路。
- 非线性流水线存在反馈回路,从输入到输出过程中,某些功能段将数次通过流水线,这种流水线适合进行线性递归的运算。
5.7 流水线的多发技术
-
流水线的超标量技术
同一时钟周期多条指令一起执行。
每个时钟周期内可并发多条独立指令,要配置多个功能部件,不能调整指令的执行顺序。可以通过编译优化技术,把可并行执行的指令搭配起来
-
流水线的超流水技术
在一个时钟周期内再分段( 3段)
在一个时钟周期内一个功能部件使用多次( 3次)不能调整指令的执行顺序
靠编译程序解决优化问题 -
超长指令字
由编译程序挖掘出指令间潜在的并行性,将多条能并行操作的指令组合成一条
具有多个操作码字段的超长指令字(可达几百位)