目录
5.1指令流水线的基本概念
五段式流水线
5.2流水线的表示方法和性能指标
5.3结构冒险、数据冒险和控制冒险的处理
5.3.1结构相关(资源冲突)
5.3.2数据相关(数据冲突)
5.3.3控制相关(控制冲突)
5.4流水线的分类
5.4.1部件功能级、处理机级和处理机间级流水线。
5.4.2单功能、多功能流水线
5.4.3静态、动态流水线
5.4.4线性、非线性流水线
5.5高级流水线技术
5.5.1超标量流水线技术(动态多发射)
5.5.2超长指令字技术(静态多发射)
5.5.3超流水线技术
流水线技术:时间上的并行技术,将一个任务分解为几个不同的子阶段,每个阶段所用到的功能部件不同。所以多个任务可以同时执行,只是执行的子阶段不同。这种指令执行方案就是指令流水线。(不同于之前的两种方案:单周期方案和多周期方案)。
超标量处理机:空间上的并行技术,在一个处理机内设置多个执行相同任务的功能部件,并让这些功能部件并行工作。
每个功能段的时间保持一致,以最长的功能段时间为准:比如100ns=80ns →其中最长的取指(IF)耗时+20ns →流水段寄存器锁存时长。
阶段\指令类型 | 运算类指令 | load取数 | store存数 | 条件转移指令 | 无条件转移指令 |
取指(IF) 都一样 |
根据PC从数据Cache取指令到IF段的锁存器 | 从Cache取指令到IF段的锁存器 | 从Cache取指令到IF段的锁存器 | 从Cache取指令到IF段的锁存器 | 从Cache取指令到IF段的锁存器 |
译码/读寄存器(ID) | 从寄存器组中读出操作数放至ID段锁存器 | 将基址寄存器的值放在A,偏移量放置IMM | 将基址寄存器的值放在A,偏移量放置IMM,要存的数放置B | 将进行比较的两个数放入A和B,偏移量放入IMM | 偏移量放入IMM |
执行/计算地址(EX) | 运算,将结果放置EX段锁存器 | 计算得到有效地址放入EX段锁存器 | 计算得到有效地址,并将要存的数放置store | 运算,进行条件比较 | 将目标PC值写入PC |
访存(MEM) | 对于RISC,运算结果存回寄存器,故该段为空段。 | 从数据Cache中取数放到MEM段锁存器中 | 将要存的数写入数据cache |
将目标PC值写入PC,也称WrPC段 |
空段 |
写回(WB) | 将运算结果写回寄存器 | 将取出的数写回寄存器 | 空段 | 空段 | 空段 |
上表分析:
补充(与下面的流水线冒险有关):
多条指令在同一时刻争用同一资源而形成的冲突。
解决方法:
在一个程序中,下一条指令会用到当前指令计算出的结果,此时这两条指令发生数据冲突。
数据冒险可分为三类:
解决方法:
指令通常是顺序执行的,但是在遇到改变指令执行顺序的情况下,例如执行转移、调用或返回指令时,会改变PC值,会造成断流,从而引起控制冒险。
解决方法:
根据流水线的使用级别不同分类。
部件功能级:复杂的算术逻辑运算组成流水线的工作方式。例如:浮点加法操作分为求阶差、对阶、尾数相加和结果规格化等4个子过程。
处理机级:把一条指令解释过程分为多个子过程,如前面的5段式流水线。
处理机间级:是一种宏流水,其中每个处理机完成某一专门任务,各个处理机所得到的结果需存放在与下一个处理机所共享的存储器中。
按流水线可以完成的功能多少分类
单功能流水线是指只能完成一种固定功能的流水线,如浮点加法流水线只能完成浮点加法操作,无法进行其他操作。
多功能流水线是指流水线的各个段可以进行不同的连接,从而使流水线在不同的时间,或者在同一时间完成不同的功能。可以完成不同功能的指令。
按同一时间内各段之间的连接方式分类
静态流水线指在同一时间内,流水线的各段只能按同一种功能的连接方式工作。
动态流水线指在同一时间内,当某些段正在实现某种运算时,另一些段却正在进行另一种运算。这样对提高流水线的效率很有好处,但会使流水线控制变得很复杂。
按流失线的各个功能段之间是否有反馈信号分类
线性流水线中,从输入到输出,每个功能段只允许经过一次,不存在反馈回路。
非线性流水线中存在反馈回路,从输入到输出过程中,某些功能段将数次通过流水线,这种流水线适合进行线性递归的运算。
流水线技术已经是一种时间上的并行技术了,更高级流水线技术主要有两种:一种是多发射技术即增加在空间上并行技术;另一种是超流水线技术即划分更多的流水线功能段以适应更高的流水线主频来提高指令吞吐率。
上图的时钟周期是原本的时钟周期,新的时钟周期是原来的三分之一,即提高了时钟频率。
流水线技术与超流水线技术没有本质的区别,CPI也是为1。超流水线技术只是划分了更多的功能段,将时钟周期变短。
超流水线技术虽然提高了CPU的主频,但是也带来了很大的副作用:
首先,细分后的每一个阶段都要在其后使用锁存器锁存,因此将一个阶段细分为N的子阶段并不能让单位时间减少到s/N, 而是s/N + d, 其中d为锁存器的反应时间。这实际上就是增加了多余的时间消耗。
其次,随着流水线级数的加深,一旦分支预测出现错误,会导致CPU中大量的指令作废,这样的消耗是十分巨大的。