指令流水线
流水线的基本概念
如何提高处理机的并行性
- 时间上的并行技术:
- 将一个任务拆分成几个不同的子阶段
- 每个阶段在不同的功能部件上并行执行,即流水线技术
- 空间上的并行技术:
- 在一个处理机设置多个执行相同任务的功能部件
- 并让这些功能部件并行工作,这样的处理机称为超标量处理机
指令流水线的定义
- 将指令执行过程的各阶段视为相应的流水段,则指令的执行过程就构成了一条指令流水线

- 设用时最长的流水段用时 X 秒 (如 200 ns),总执行时间为 y 秒 (如 700 ns),系统由 N 条指令,度为 1
- 则单处理机用时为 y × N,流水线处理机用时为 y + (N - 1) × X
- 不能缩短单条指令的执行时间,但对于整个程序来说,执行效率得到大幅提升
指令集应具备的特点
- 指令长度尽量一致,有利于简化取指和指令译码操作
- 指令格式尽量规整,尽量保证源寄存器的位置相同,有利于在指令未知时就可取存寄存器操作数
- 采用 Load/Store 指令,把 Load/Store 指令的地址计算和运算指令的执行步骤规整到同一个周期中,有利于减少操作步骤
- 数据和指令在存储器中“对齐”存放,这样有利于减少访存次数使所需数据在一个流水段内就可以从存储器中找到
流水线的表示方法
- 采用时空图描述流水线的执行情况

流水线的性能指标
流水线的吞吐率(TP)
- 吞吐率:单位时间内流水线所完成的任务数量,或是输出结果的数量
- 设任务数 m,处理完成 n 个任务所用的时间为
- 最大吞吐率:

- 注意:
- m 段流水线的 CPU 吞吐能力 = m 个并行部件的 CPU 吞吐能力
- m 段流水线在第 m 个时钟周期后,每个时钟周期都可完成一条指令
- m 个并行部件在 m 个时钟周期后能完成全部的 m 条指令,等价于平均每个时钟周期完成一条指令
流水线的加速比(S)
- 加速比:完成同样一批任务,不使用流水线所用的时间与使用流水线所用的时间之比
- 设顺序执行的时间为 ,使用流水线的执行时间
- 最大加速比:

流水线的效率(E)
- 效率:流水线的设备利用率,在时空图上,表示为完成 n 个任务占用的时空区有效面积与 n 个任务所用的时间与 k 个流水段所围成的时空区总面积之比
-

流水线的基本实现
流水线的数据通路
- 数据通路:数据在功能部件之间传送的路径
- 包括数据通路上流经的部件(如 PC,ALU,通用寄存器,状态寄存器,异常和中断处理逻辑)
- 数据通路由控制部件控制,控制部件根据每条指令功能的不同生成对数据通路的控制信号
- 数据通路不包含生成控制信号的控制部件

流水线的控制信号

- 流水寄存器保存的信息
- 后面流水段要用到的所有数据信息
- 包括 PC+4,、指令、立即数、目的寄存器、ALU 运算结果、标志信息等
- 它们是前面阶段在数据通路中执行的结果
- 后面传递过来的后面各流水段要用到的所有控制信号
- 后面流水段要用到的所有数据信息
流水线的执行过程
- 假设一条指令的执行有 5 条流水线
- 取指(IF):从指令寄存器或 Cache 中取指令
- 译码/读寄存器(ID):操作控制器对指令进行译码,同时从寄存器堆中读取操作数
- 执行/计算地址(EX):执行运算操作或计算地址
- 访存(MEM):对存储器进行读写操作
- 写回(WB):将指令执行结果写回寄存器
流水线的冒险与处理
- 流水线冒险:在指令流水线中,可能会遇到一些情况使得后续指令无法正确执行而引起流水线阻塞的现象
- 根据导致冒险的原因不同分为:结构冒险、数据冒险和控制冒险
结构冒险
- 定义:由于多条指令在同一时刻争用同一资源而形成的冲突,也称资源冲突
解决方法: - 前一指令访存时,使后一条指令(以及其后续指令)暂停一个时钟周期
- 设置多个独立的部件:
- 寄存器访存冲突:将寄存器的读口和写口独立开来
- 访存冲突:单独设置数据存储器和指令存储器,使取数和取指令操作各自在不同的存储器中进行(分离结构的 Cache)
数据冒险
-
定义:后面指令用到前面指令的结果时,前面指令的结果还没有产生,也称数据相关
-
乱序执行的流水线中存在三种数据相关:
- 写后读 RAW:当前指令将数据写入寄存器后,下一条指令才能从该寄存器读取数据
- 读后写 WAR:当前指令读出数据后,下一条指令才能写入寄存器
- 写后写 WAW:当前指令写入寄存器后,下一条指令才能写入寄存器
-
按序执行的流水线中,只可能出现 RAW 冲突
解决方法: -
延迟执行相关指令:把遇到数据相关的指令及其后续指令都暂停一至几个时钟周期,直至数据相关问题消失后再继续执行,可分为硬件阻塞(stall) 和软件插入空操作 nop

-
转发(旁路)技术:设置相关转发通路,不等前一条指令把计算结果写回寄存器,下一条指令也不再从寄存器读,而将数据通路中生成的中间数据直接转发到 ALU 的输入端

-
load-use 数据冒险处理:load 指令与紧邻的运算类指令存在数据相关问题,可以使用延迟 + 转发技术解决,最好是在程序编译时进行优化,通过调整指令顺序避免出现该现象

控制冒险
- 定义:当流水线遇到转移指令和其他改变 PC 值的指令而造成断流时,会引起控制相关
解决办法 - 延迟:延迟损失多少时间片,就插入多少条 nop 指令或者进行 stall
- 对转移指令进行分支预测:
- 静态预测:总是预测条件不满足,则按序继续执行分支指令的后续指令
- 动态预测:根据程序执行的历史情况,进行动态调整,有效提高预测准确率
- 预取转移成功和不成功两个控制流方向上的目标指令
- 加快和提前形成条件码
- 提高转移方向的猜准率
高级流水线技术
超标量流水线技术
- 定义:每个时钟周期内可并发多条独立指令,以并行操作方式将两条或多条指令编译并执行,也称动态多发射技术

- 每个时钟周期内可并发多条独立指令
- 并不影响流水线功能段的处理时间
- 要配置多个功能部件,实际上是以空间换时间
- 乱序执行
- 通过编译优化技术,把可并行执行的指令搭配起来
超长指令字技术
- 定义:由编译程序挖掘出指令潜在的并行性,将多条能并行操作的指令组合成一条具有多个操作码的超长指令字(可达几百位),也称静态多发射技术

- 需要多个处理部件
超流水线技术
- 定义:在一个时钟周期内再分段

- 流水线功能段越多,时钟周期越短,指令吞吐率越高
- 通过提高流水线主频的方式来提升流水线性能的
- 流水线级数越多,用于流水线寄存器的开销越大