6.指令流水线
大约 5 分钟
指令流水线的基本概念
提高处理机并行的两种方式:
- 流水线技术。 一个任务划分多个不同子阶段,每个阶段在不同的功能部件上并行执行,时间上的并行技术。
- 超标量处理机。在一个处理机内设置多个执行相同任务的功能部件,并让这些功能部件并行工作,空间上的并行技术。
流水线定义
假设一条指令的执行过程分为如下5个阶段(也称功能段或流水段):
- 取指(IF):从指令存储器或Cache中取指令。
- 译码/读寄存器(ID):操作控制器对指令进行译码,同时从寄存器堆中取操作数。
- 执行/计算地址(EX):执行运算操作或计算地址。
- 访存(MEM):对存储器进行读写操作。
- 写回(WB):将指令执行结果写回寄存器堆。
流水线设计原则
- 指令流水段个数以最复杂指令所用的功能段个数为准
- 流水段长度以最复杂的操作所花的时间为准,这就导致每个功能段部件后面应该加上一个缓冲寄存器也就是锁存器[1]
所以流水线方式并不能缩短单条指令的执行时间,但整体来说执行效率高
利于实现指令流水线
- 指令长度应该尽量一致
- 指令格式应尽量规整
- 采用Load/Store指令
- 数据和指令在存储器中对齐存放
流水线的基本实现
流水线的数据通路

注意
- 上图中的指令和数据是分开存储的,有单独的指令存储器和数据存储器
- 在RISC中操作数是直接从寄存器中读出的,操作数如果在主存,就需要先放到寄存器中
考试中常见的五类指令流水线
5.6_3五段式指令流水线
00:00
流水线的冒险与处理
结构冒险
由于多条指令在同一时刻争用同一资源而形成的冲突,也称为资源冲突,即由硬件资源竞争造成的冲突,有以下两种解决办法:
- 前一个指令访存时,后一个相关指令暂停一个时钟周期
- 单独设置数据存储器和指令存储器
数据冒险
下一条指令会用到当前指令计算出的结果,此时这两条指令发生数据冲突,数据冒险可以分为三类:
- 写后读(RAW)相关
- 读后写(WAR)相关
- 写后写(WRW)相关
解决办法:
- 暂停一周几个时钟周期,可以分为硬件阻塞(stall)和软件插入(NOP)指令两种方式
- 设置相关专用通路即不等前一条指令把计算结果写回寄存器组,下一条指令也不再读寄存器组,而直接把前一条指令的ALU的计算结果作为自己的输入数据开始计算过程,使本来需要暂停的操作变得可以继续执行,这称为数据旁路技术。
- 编译器对指令编译优化
控制冒险
指令通常是顺序执行的,但是在遇到改变指令执行顺序的情况,例如执行转移、调用或返回等指令时,会改变PC值,会造成断流,从而引起控制冒险,解决办法:
- 对转移指令进行分支预测,尽早生成转移目标地址。
- 预取转移成功和不成功两个控制流方向上的目标指令。
- 加快和提前形成条件码。
- 提高转移方向的猜准率。
流水线的性能指标
吞吐率
指在单位时间内流水线所完成的任务数量,或输出结果的数量
加速比
完成同样一批任务,不使用流水线与使用流水线所用的时间之比。
时,
高级流水线技术
超标量流水线技术
超标量流水线技术也称动态多发射技术,每个时钟周期内可并发多条独立指令,以并行操作方式将两条或多条指令编译并执行,为此需配置多个功能部件

超字长指令字技术
超长指令字技术也称静态多发射技术,由编译程序挖掘出指令间潜在的并行性,将多条能并行操作的指令组合成一条具有多个操作码字段的超长指令字(可达几百位),为此需要采用多个处理部件。
超流水技术
在一个时钟周期内再分段,即一个时钟周期内一个功能部件使用多次

要等到下一个功能部件需要数据的时候再给出,所以先缓存 ↩︎
