目录
一、基本概念
1.原理
指令流水线(Instruction Pipeline)是提高处理器执行效率的一种重要技术。它通过将指令的执行过程分解为多个独立的阶段,每个阶段使用不同的硬件资源,从而实现多个指令的并行处理。
流水线的基本原理
在指令流水线中,指令的执行被分为若干个阶段,例如:
- 取指令(Instruction Fetch, IF):从内存中取出指令。
- 指令译码(Instruction Decode, ID):将取出的指令进行译码,确定操作数和操作类型。
- 执行(Execute, EX):根据指令类型进行算术或逻辑运算。
- 访存(Memory Access, MEM):如果指令涉及到内存操作,如加载或存储,则在这一步完成。
- 写回(Write Back, WB):将执行的结果写回到寄存器中。
每个阶段对应着不同的硬件单元(如内存、寄存器堆、算术逻辑单元等),这些硬件单元在物理上是独立的。因此,处理器可以在同一个时钟周期内,同时处理不同指令的不同阶段。例如,当第一条指令正在执行阶段时,第二条指令可以在译码阶段,第三条指令可以在取指令阶段。这种并行处理得益于各个阶段的硬件资源相互独立。
一个简单的例子:
假设每个阶段都需要一个时钟周期完成。在传统方法中,执行三条指令需要5个阶段 * 3条指令 = 15个时钟周期。但是在流水线操作下:
- 第1个时钟周期:第1条指令进入取指令阶段。
- 第2个时钟周期:第1条指令进入译码阶段,第2条指令进入取指令阶段。
- 第3个时钟周期:第1条指令进入执行阶段,第2条指令进入译码阶段,第3条指令进入取指令阶段。
如此进行下去,在第7个时钟周期时,处理器已经完成了第3条指令的执行,而不是在第15个时钟周期。
并行性与资源独立性
流水线的并行性依赖于硬件资源的独立性。每个阶段都有专用的硬件资源,不同阶段之间不会发生资源冲突。正因为这些资源的独立性,使得处理器能够同时进行多个指令的不同操作,从而大大提高了指令执行的效率和处理器的吞吐量。
流水线的优点
通过流水线技术,处理器在一个时钟周期内可以完成多条指令的不同部分的执行,显著提高了系统的效率。这种设计方式使得处理器能够更有效地利用硬件资源,减少了指令执行的等待时间。
挑战与优化
尽管流水线技术可以提高处理器的并行度,但在实际操作中仍会遇到一些挑战,例如数据冒险、控制冒险和资源冲突。这些问题需要通过使用旁路、流水线暂停、分支预测等技术来进行优化,从而保证流水线的高效运行。
总之,指令流水线通过硬件资源的独立性来实现多个指令的并行处理,从而提高了处理器的整体性能。
2.表示方法
指令流程图:主要用于分析影响流水线的因素
时空图:主要用于分析流水线的性能
二、性能指标
1.吞吐率TP
吞吐率是指在单位时间内流水线所完成的任务数量,或是输出结果的数量。
设任务数为n;处理完成n个任务所用的时间为Tk
则计算流水线吞吐率(TP)的最基本的公式为 TP = n / Tk
理想情况下,流水线的时空图如下:
一条指令的执行分为k个阶段,每个阶段耗时Δt,一般取Δt=一个时钟周期
当连续输入的任务n→∞时,得最大吞吐率为TPmax = 1 / Δt。
2.加速比S
完成同样的一批任务,不使用流水线和使用流水线的时间之比。
设T0表示不使用流水线时的执行时间,即顺序执行所用的时间;
Tk表示使用流水线时的执行时间.
则计算流水线加速比(S)的基本公式为S= T0/Tk
理想情况下,流水线的时空图如下:
一条指令的执行分为k个阶段,每个阶段耗时Δt,一般取Δt=一个时钟周期
单独完成一个任务耗时为kΔt,则顺序完成n个任务耗时T0=nk Δt
当连续输入的任务n→∞时,最大加速比为Smax = k.
3.效率E
流水线的设备利用率称为流水线效率。
在时空图上,流水线的效率定义为完成n个任务占用的时空区有效面积与n个任务所用的时间与k个流水段所围成的时空区总面积方比。
则流水线效率(E)的一般公式为:
理想情况下,流水线的时空图如下:
一条指令的执行分为k个阶段,每个阶段耗时Δt,一般取Δt=一个时钟周期
当连续输入的任务n→∞时,最高效率为Emax=1。
三、影响因素
1.资源冲突(结构相关)
由于同一时间多条指令争用同一资源而形成的冲突被叫做资源冲突。
简单点说就是:同一个部件同时被不同指令所用,也就是硬件资源竞争造成的
解决方案:
1.后一相关指令暂停一个周期
2.资源重复配置:比如说将存储体分为指令存储器和数据存储器
2.数据冲突(数据相关)
数据冲突指在一个程序中,存在必须等前一条指令执行完才能执行后一条指令的情况,则这两条指令即为数据冲突。
简单来说就是:后面指令用到前面指令的运算结果时,前面指令的结果还没产生
解决方案:
1. 把遇到数据冲突的指令及其后续指令都暂停一到二个时钟周期,直到数据冲突问题消失后再继续执行。可分为硬件阻塞和软件插入“NOP”两种方法。
硬件阻塞
软件插入“NOP(空指令)”
2.数据旁路技术(转发机制)
例如将ALU输出接根线到ALU的输入
3.编译优化:通过编译器调整指令顺序来解决数据冲突。
3.控制冲突(控制相关)
当流水线遇到转移指令和其他能改变PC的值的指令而造成断流时,会引起控制冲突。
简单点说就是:遇到改变指令执行顺序的情况时,流水线中指令的正常执行会被阻塞,称控制冒险
解决办法:
1.转移指令分支预测。
简单预测(永远猜ture或false)、
动态预测(根据历史情况动态调整)
2.预取转移成功和不成功两个控制流方向上的目标指令
3.加快和提前形成条件码
4.提高转移方向的猜准率
【2023年统考真题】
在采用“取指、译码/取数、执行、访存、写回”5 段流水线的 RISC 处理器中,执行如下指令序列(第一列为指令序号),其中s0、s1、s2、s3 和 t2 表示寄存器编号。
若采用转发(旁路)技术处理数据冒险,采用硬件阻塞方式处理控制冒险,则在指令Ⅰ1~Ⅰ4执行过程中,发生流水线阻塞的指令有( C )。
A.
仅 I3
B.
仅 I2 和I4
C.
仅I3和I4
D.
仅 I2,I3 和 I4
I1 | IF | ID | EX | Mem | WB | |||||||
I2 | IF | ID | EX | Mem | WB | |||||||
I3 | IF | ID | 阻塞 | EX | Mem | WB | ||||||
I4 | 阻塞 | 阻塞 | 阻塞 | 阻塞 | IF | ID | EX | Mem | WB |
四、分类
分类 | 分类方式 | 特点 |
---|---|---|
1.部件功能级、处理机级和处理机间级流水线 | 根据流水线使用的级别的不同,流水线可分为部件功能级流水线、处理机级流水线和处理机间流水线 | 部件功能级流水就是将复杂的算术逻辑运算组成流水线工作方式。例如,可将浮点加法操作分成求阶差、对阶、尾数相加以及结果规格化等4个子过程。 |
处理机级流水是把一条指令解释过程分成多个子过程,如前面提到的取指、译码、执行、访存及写回5个子过程。 | ||
处理机间流水是一种宏流水,其中每一个处理机完成某一专门任务,各个处理机所得到的结果需存放在与下一个处理机所共享的存储器中。 | ||
2.单功能流水线和多功能流水线 | 按流水线可以完成的功能,流水线可分为单功能流水线和多功能流水线。 | 单功能流水线指只能实现一种固定的专门功能的流水线; |
多功能流水线指通过各段间的不同连接方式可以同时或不同时地实现多种功能的流水线。 | ||
3.动态流水线和静态流水线 | 按同一时间内各段之间的连接方式,流水线可分为静态流水线和动态流水线。 | 静态流水线指在同一时间内,流水线的各段只能按同一种功能的连接方式工作。 |
动态流水线指在同一时间内,当某些段正在实现某种运算时,另一些段却正在进行另一种运算。这样对提高流水线的效率很有好处,但会使流水线控制变得很复杂。 | ||
4.线性流水线和非线性流水线 | 按流水线的各个功能段之间是否有反馈信号,流水线可分为线性流水线与非线性流水线。 | 线性流水线中,从输入到输出,每个功能段只允许经过一次,不存在反馈回路。 |
非线性流水线存在反馈回路,从输入到输出过程中,某些功能段将数次通过流水线,这种流水线适合进行线性递归的运算。 |
五、流水线的多发技术
1.超标量技术
每个时钟周期内可同时并发多条独立指令,即以并行操作方式将两条或两条以上的指令编译并执行;
要求处理机中配置多个功能部件和指令译码电路,以及多个寄存器端口和总线,以便能实现同时执行多个操作,此外还要编译程序决定哪几条相邻指令可以并行执行 。
每个时钟周期内可并发多条独立指令
要配置多个功能部件
不能调整指令的执行顺序
通过编译优化技术,把可以并行的指令搭配起来
2.超流水技术
在一个时钟周期内再分段
在一个时钟周期内一个功能部件使用多次
不能调整指令的执行顺序
靠编译优化解决问题
3.超长指令字
由编译程序挖掘出指令间潜在的并行性
将多条能并行操作的指令组合成一条
具有多个操作码字段的超长指令字(可达几百位)
采用多个处理部件
六、五段式指令流水线
阶段 | IF | ID | EX | M | WB |
---|---|---|---|---|---|
工作 | 取指令(IF):根据PC的值从存储器取出指令 | 指令译码/读寄存器(ID):产生控制信号,同时从寄存器中取数据 | 执行/计算地址(EX):执行运算操作或计算访存地址 | 访存(MEM):对存储器进行读/写操作 | 写回(WB):将操作结果写入存储器或寄存器 |
耗时 | 100ns | 80ns | 70ns | 50ns | 50ns |
为了方便流水线的设计,将每个阶段的耗时取一致,以最长耗时为准。即此处将机器周期设置为100ns。
流水线的每个功能段部件后都设置一个缓冲寄存器,也叫做锁存器。其作用就是保存本段对应组合逻辑处理的结果给下一段使用。也是以此保证各段时间一致。
理想情况下,每个机器周期也即功能段只消耗一个时钟周期。
下面是对几类指令具体执行过程的分析。
1.运算类指令
2.LODA指令
3.STORE指令
4.条件转移指令
5.无条件转移指令
例题:
例题.假设某指令流水线采用“按序发射,按序完成”方式,没有采用转发技术处理数据相关并且同一寄存器的读和写操作不能在同一个时钟周期内进行。若高级语言程序中某赋值语句为x=a+b,x、a和b均为int型变量,它们的存储单元地址分别表示为[x]、[a]和[b]。该语句对应的指令序列及其在指令流中的执行过程如下图所示。
I1 LOAD R1,[a]
I2 LOAD R2,[b]
I3 ADD R1,R2
I4 STORE R2,[X]
则这4条指令执行过程中13的ID段和14的IF段被阻塞的原因各是什么?
首先指令I3的ID段之所以被阻塞是因为I2的WB段是将取出的数写回到寄存器,I3的ID段是要在寄存器里取操作数,二者有数据冲突,所以I3的ID段被阻塞。
而I4的IF段会被阻塞的原因是,I3的IF段结束进入ID段时才会释放IF段的锁存器,如果不阻塞I4的IF段则会覆盖掉I3的IF段的结果也即锁存器中的内容,所以I4的IF段被阻塞。