5.4 指令流水线
流水线的基本概念与五段 RISC 流水线;吞吐率、加速比、效率的计算;结构冒险、数据冒险、控制冒险及其处理(阻塞、旁路、分支预测);超标量、超流水线与超长指令字。
流水线的基本概念
把一条指令的执行过程分成若干功能段,每段由独立的部件完成。这样,前一条指令完成某段的工作后进入下一段,后一条指令就可以进入这一段——就像工厂里的装配流水线,多条指令在不同的段上重叠执行。
一条指令完成的时间并没有缩短(反而因为段间寄存器而略有增加),但单位时间内完成的指令数——吞吐率——大大提高了。
五段流水线
典型的 RISC 指令流水线把指令执行分为 5 段,每段一个时钟周期:
| 段 | 名称 | 功能 |
|---|---|---|
| IF | 取指 | 根据 PC 从指令存储器(I-Cache)中取指令,PC + 4 |
| ID | 译码 / 读寄存器 | 对指令译码,从寄存器堆读出源操作数 |
| EX | 执行 / 计算地址 | ALU 运算,或计算访存的有效地址、转移目标地址 |
| MEM | 访存 | load 指令从数据存储器(D-Cache)读数,store 指令写入 |
| WB | 写回 | 把运算结果或读出的数据写回寄存器堆 |
各段之间设有流水段寄存器(锁存器),保存上一段的结果供下一段使用。
流水线的性能指标
设流水线有 k 段,每段时间都为 Δt,连续输入 n 条指令。第一条指令需要 kΔt 才流出,此后每个 Δt 流出一条,因此完成 n 条指令的时间为
| 指标 | 定义 | 公式 |
|---|---|---|
| 吞吐率 TP | 单位时间内完成的指令数 | ,n → ∞ 时 |
| 加速比 S | 不用流水线的时间 / 使用流水线的时间 | ,n → ∞ 时 |
| 效率 E | 设备的利用率:时空图中有效时空区所占比例 | ,n → ∞ 时 |
在下面的计算器中修改各段时间、段间延迟和指令数。纵轴为功能段、横轴为时间的时空图中,蓝色格子就是有效的时空区:
流水线的冒险与处理
在理想情况下流水线每个时钟周期完成一条指令(CPI = 1),但冒险(hazard,也称相关、冲突)会使流水线不得不停顿。
结构冒险(资源冲突)
多条指令在同一时刻争用同一个硬件资源。典型的例子是:一条指令在 MEM 段访问数据,同时另一条指令在 IF 段取指令——如果指令和数据放在同一个存储器中,就会冲突。
解决办法:前一条指令访存时,后一条相关指令暂停一个时钟周期;或者资源重复配置,例如把指令存储器和数据存储器分开(分离的 I-Cache 和 D-Cache)。
数据冒险(数据相关)
后一条指令要用到前一条指令的结果,而前一条指令还没有把结果写回。按读写顺序分为三类:
- 写后读(RAW):后一条指令要读前一条指令写的寄存器——在顺序执行的五段流水线中只有这一种会造成冒险;
- 读后写(WAR)、写后写(WAW):只在指令乱序执行时才可能出现。
解决办法:
- 暂停(阻塞):把遇到数据相关的指令及其后续指令都暂停一至几个时钟周期,直到数据相关问题消失再继续执行。可由硬件阻塞,也可由编译器插入空操作指令
nop(软件插入”气泡”)。 - 数据旁路(转发):不等结果写回寄存器,直接把 EX 段或 MEM 段输出的结果送到 ALU 的输入端。
- 编译优化:通过调整指令顺序,把不相关的指令插到相关指令之间。
选择不同的指令序列,打开/关闭数据旁路,观察阻塞的周期数:
- I2 读 r1 依赖 I1(RAW):无旁路时要等 I1 在 WB 段写回,阻塞 2 个周期
- I4 读 r4 依赖 I2(RAW):无旁路时要等 I2 在 WB 段写回,阻塞 1 个周期
- I5 读 r8 依赖 I4(RAW):无旁路时要等 I4 在 WB 段写回,阻塞 2 个周期
从演示中可以看到:
- 不采用旁路时,相邻两条指令之间的 RAW 相关要阻塞 2 个周期,相隔一条指令时阻塞 1 个周期,相隔两条及以上不阻塞;
- 采用旁路后,ALU 指令之间的相关全部消除;但 load-use 相关(紧跟在 load 之后使用其结果)仍要阻塞 1 个周期,因为数据在 MEM 段末才从存储器读出。
控制冒险(转移相关)
转移指令、中断、异常等改变了指令的执行顺序。在转移指令确定是否转移以及转移目标之前,流水线可能已经按顺序取入了后续指令,一旦转移成功,这些指令就必须作废(冲刷)。在演示中选择「控制冒险」,比较转移在 EX 段确定(损失 2 个周期)与在 ID 段确定(损失 1 个周期)的区别。
解决办法:
- 分支预测:静态预测(如总是预测不转移)、动态预测(根据转移的历史情况预测);
- 预取转移成功和不成功两个方向上的目标指令;
- 加快和提前形成条件码,尽早确定转移方向;
- 延迟转移:把转移指令之后的若干条指令(延迟槽)总是执行,由编译器在延迟槽中填入有用的指令。
某计算机采用 IF、ID、EX、MEM、WB 五段流水线,每段 1 个时钟周期,不采用数据旁路,寄存器堆前半周期写、后半周期读。对于下面的指令序列,I3 的 ID 段最早在第几个周期执行?整段程序共需多少个时钟周期?
I1: add s2, s1, s0 // s2 ← s1 + s0
I2: lw s3, 0(t2) // s3 ← M[t2]
I3: add s2, s2, s3 // s2 ← s2 + s3
I4: sw s2, 0(t2) // M[t2] ← s2查看解答
- I1:IF 1、ID 2、EX 3、MEM 4、WB 5;I2:IF 2、ID 3、EX 4、MEM 5、WB 6。
- I3 要读 s2(I1 在第 5 周期写回)和 s3(I2 在第 6 周期写回),所以 ID 段最早在第 6 周期,阻塞 2 个周期(第 4、5 周期)。I3:EX 7、MEM 8、WB 9。
- I4 要读 I3 写的 s2,ID 段最早在第 9 周期,EX 10、MEM 11、WB 12。
共需 12 个时钟周期;无冒险时只需 5 + 4 − 1 = 8 个周期。
高级流水线技术
| 技术 | 思想 | 关键 |
|---|---|---|
| 超标量(superscalar) | 每个时钟周期内同时发射多条独立的指令,由多条流水线并行执行 | 需要配置多个功能部件;常结合动态调度(乱序执行)提高指令级并行 |
| 超流水线(superpipelining) | 把流水段进一步细分,在一个时钟周期内再分段,提高时钟频率 | 流水线更深;功能部件在一个时钟周期内可使用多次 |
| 超长指令字(VLIW) | 由编译程序挖掘指令间潜在的并行性,把多条能并行执行的操作组合成一条具有多个操作码字段的超长指令 | 需要多个处理部件;并行性在编译时静态确定 |
即时练习
- 1某计算机的指令流水线由 4 个功能段组成,指令流经各功能段的时间(忽略各功能段之间的缓存时间)分别为 90 ns、80 ns、70 ns 和 60 ns,则该计算机的 CPU 时钟周期至少是( )。
- 2下列选项中,不会引起指令流水线阻塞的是( )。
- 3在五段流水线中(不采用旁路,寄存器前半周期写、后半周期读),执行 I1: add R1,R2,R3;I2: sub R4,R5,R6;I3: and R7,R8,R9;I4: or R10,R1,R4。下列说法正确的是( )。
- 4一条 5 段流水线,各段时间均为 Δt,连续输入 20 条指令(无冒险),则加速比和效率分别约为( )。
- 5下列关于超标量流水线特性的叙述中,正确的是( )。
Ⅰ. 能缩短流水线功能段的处理时间 Ⅱ. 能在一个时钟周期内同时发射多条指令 Ⅲ. 能结合动态调度技术提高指令执行并行性 - 6采用五段流水线,转移指令在 EX 段末才能确定是否转移。若对转移指令采用「暂停到转移方向确定后再取指」的策略,则每条转移指令会使流水线损失( )个时钟周期。
标记完成后,侧栏会显示进度。进度仅保存在本浏览器中。