流水线概述
这里举出一个例子——洗衣服,形象地介绍一下流水线的基本概念
有ABCD四袋衣服需要清洗,一个完整的洗衣过程包括水洗、烘干和人工晾晒三个步骤
如果使用串行方式清洗四袋衣物,过程如下:
如果使用流水线的方式清洗,过程如下:
通过以上例子应该能对流水线有一个基本概念了,下面我们来系统的了解一下什么是指令流水线
流水线的执行效率
指令流水线设计的基本思想
- 将每条指令的执行规整化为若干个同样的流水阶段,每个流水阶段的执行时间一样,都等于一个时钟周期
- 流水线方式下,一条指令的执行过程被分成若干个操作子过程,每个子过程由一个独立的功能部件来完成
- 在同一条流水线中,每条指令所包含的操作子过程个数必须一样,每个子过程所花的时间也要相同
一般按最复杂的指令来设计流水段个数,以最复杂的子过程来设计流水段的宽度
假定一条指令流水线由如下5个流水段组成:
- 取指令(IF):从存储器取指令
- 指令译码(ID):产生指令执行所需的控制信号
- 取操作数(OF):读取操作数
- 执行(EX):对操作数完成指定操作
- 写回(WB):将结果写回
进入流水线的指令流,由于后一条指令的第i步与前一条指令的第 i+1 步同时进行, 从而使一串指令总的完成时间大为缩短,一个5段指令流水线如下:
假如流水段数为 5,每个流水段的执行时间为 T,则 n 条指令的执行总时间为 (5 + n - 1) × T
流水线方式下,单条指令执行时间不能缩短,但能大大提高指令吞吐率
适合流水线的指令集特征
具有什么特征的指令集有利于流水线执行呢?
- 长度尽量一致,有利于简化取指令和指令译码操作
- 格式少,且源寄存器位置相同,有利于在指令未知时就可取操作数
- load / Store指令才能访问存储器,有利于减少操作步骤,规整流水线
- 内存中”对齐”存放,有利于减少访存次数和流水线的规整
- 规整、简单和一致等特性有利于指令的流水线执行
理想流水线特征
- 阶段数相同:所有加工对象均通过同样的工序(阶段)
不同指令阶段数不同 - 段时延相同:各段传输延迟一致,不能有等待现象,取最慢的同步
取指,访存段最慢 - 无资源冲突:不同阶段之间无共享资源,各段完全并发
取指令、取数存在内存争用 - 无段间互锁:进入流水线的对象不受其他阶段的影响
多条指令间存在相关和依赖
流水线冒险及其处理
指令流水线中,可能会遇到一些情况使得流水线无法正确执行后续指令而引起流水线阻塞或停顿(stall),这种现象称为流水线冒险(hazard)
根据导致冒险的原因的不同,有结构冒险、数据冒险和控制冒险3种
结构冒险
结构冒险也称为硬件资源冲突,引起结构冒险的原因在于同一个部件同时被不同指令所用,也就是说它是由硬件资源竞争造成的
【举例】
上述流水线有个问题: 两条指令试图同时写寄存器,因为
- Load在第5阶段用寄存器写口
- R-type在第4阶段用寄存器写口
把一个功能部件同时被多条指令使用的现象称为结构冒险
为了流水线能顺利工作,规定:
-
每个功能部件每条指令只能用一次(如:写口不能用两次或以上)
-
每个功能部件必须在相同的阶段被使用(如:写口总是在第五阶段被使用)
R-type的Wr操作延后一个周期执行
数据冒险
数据冒险也称为数据相关,引起数据冒险的原因在于后面指令用到前面指令结果时前面指令结果还没产生
控制冒险
正常情况下,指令在流水线中总是按顺序执行, 当遇到改变指令执行顺序的情况时,流水线中指令的正常执行会被阻塞,这种由于发生了指令执行顺序改变而引起的流水线阻塞称为控制冒险(现象:转移或异常改变执行流程,后继指令在目标地址产生前已被取出)
下面是一个是一个由分支指令(条件转移指令)引起的控制冒险的流水线例子:
【分析】假定beq指令的地址为12,条件满足时其转移目标地址为1000
分支指令beq的转移目标地址计算操作在Ex段,并在 Mem段由标志 Zero 和控制信号 Branch来控制,以确定是否将PC的值更新为转移目标地址 Btarg
只有当 beq 指令执行到第5时钟结束才能将转移目标地址1000 送到 PC 的输入端,在第6时钟到来后,取出1000号单元开始的指令送流水线中执行,此时紧接在beq指令后面的第16、20和24单元的指令已在流水线中被执行了一部分
但是,正确的执行流程应该是第12单元中的beq指令执行完后转移到第1000单元执行,因此如果不采取相应措施则指令流水线的执行便发生问题