文章目录

  • 指令流水
  • 提高处理机的并行性
  • 指令流水技术
  • 理想流水
  • 指令流水设计原则
  • 小结
  • 利于指令流水的指令集设计原则
  • 流水线表示方式
  • 时空图
  • 效率比较
  • 小结
  • 流水线的基本实现
  • 流水线的数据通路
  • 流水寄存器
  • 小结
  • 流水线冒险和处理
  • 结构冒险
  • 数据冒险
  • 控制冒险
  • 例题🎃
  • 流水的相关问题(冲突问题)实例
  • 数据相关
  • 流水线性能指标🎈
  • 流水吞吐率
  • 加速比(串行/流水耗时比)
  • 流水效率(设备利用率)
  • 例题(加速比)
  • 高级流水线技术🎈
  • 多发射技术
  • 超标量流水线技术
  • 超长指令字技术
  • 超流水线技术


指令流水

  • 指令流水类似于工厂的装配线:
  • 流水线,又称装配线,工业上的一种生产方式,指每一个生产单位只专注处理某一个片段的工作,以提高工作效率及产量。
  • 装配线利用了产品在装配的不同阶,段其装配过程不同这一特点,使不同产品处在不同的装配段上,即每个装配段同时对不同产品进行加工,这样可大大提高装配效率。
  • 将这种装配生产线的思想用到指令的执行上,就引出了指令流水的概念。

  • 同一时刻只有一条指令在执行,各功能部件的利用率不高
  • 现代计算机普遍采用指令流水技术,统一时刻有多条指令在cpu的不同功能部件中并发执行
  • 大大提高了功能部件的并行性和程序的执行效率

提高处理机的并行性

  • 时间上的并行技术
  • 将一个任务分解为不同的几个阶段,每个阶段在不同的功能部件上并行执行
  • 以便在同一个时刻执行多个任务,提升系统性能
  • 这种方法被称为指令流水技术
  • 空间上的并行技术
  • 在一个处理机中设置多个执行相同任务的功能部件
  • 并且让这些功能部件并行工作,这样的处理机被称为超标量处理机(superscalar processor)

指令流水技术

  • 一条指令的执行过程可以拆分为若干阶段
  • 每个阶段有相应的功能部件完成
  • 将各个阶段视为相应的流水段(功能段),指令的执行过程就构成了一条流水线
  • 取指(IF):从存储器(cache)中取指令
  • 译码/读寄存器(ID):操作控制器对指令进行译码,同时从寄存器中取出操作数
  • 执行/计算地址(EX):执行运算操作或计算地址
  • 访存(MEM):对存储器进行读写操作
  • 回写(WB):将指令执行结果写回寄存器堆
  • 将第k+1条指令的取指阶段提前到第k条指令的译码阶段
  • 第k+1条指令的译码阶段和第k条指令的执行阶段同时进行

理想流水

  • 在理想的情况下,每个时钟周期都有一条指令进入流水线,
  • 每个时钟周期也都有一条指令完成
  • (平均)每条指令的时钟周期数都为1(即cpi=1)

指令流水设计原则

  • 指令流水段个数以最复杂指令所用的功能段个数为准
  • 流水段的长度:以最复杂的操作所耗费的时间为准
  • 指的是每个流水段的长度(所有的流水段长度都相等)
  • 基准时间:就是流水段的长度
  • 假设某机器的某条最复杂指令的5个阶段耗时情况如下:
  • IF:200ps
  • ID:100ps
  • EXE:150ps
  • MEM:200ps
  • WB:100ps
  • 🎈为了便于讨论,和书写,将上述5个阶段分别记为A,B,C,D,E
  • 那么流水段的长度(基准时间Java装配线是什么 装配线的作用_Java装配线是什么)被定为200ps
  • 每条指令的执行时间都达到了1000>750ps
  • 从这个角度上看,比串行执行的方式更加费时
  • 但是,如果某个待执行程序中有N条指令
  • 对于单周期处理器
  • 串行执行所耗费时间为750N(ps)
  • 而流水线处理机需要的时间(理想情况下):
  • Java装配线是什么 装配线的作用_功能部件_02
  • 分析下表中每条指令的开头阶段(IF)可知,最后条指令的开头阶段将在第N个基准时间段解释执行
  • 当第N条指令的最后一个阶段执行完毕,这N条指令才全部执行完毕
  • Java装配线是什么 装配线的作用_寄存器_03将在第N+k-1个基准时间段完成执行
  • 例:



Java装配线是什么 装配线的作用_寄存器_52

Java装配线是什么 装配线的作用_寄存器_52

Java装配线是什么 装配线的作用_寄存器_52

Java装配线是什么 装配线的作用_寄存器_52

Java装配线是什么 装配线的作用_寄存器_52

  • 上面是一个5段指令流水线示意图表
  • 纵坐标Java装配线是什么 装配线的作用_寄存器_52
  • 横坐标是Java装配线是什么 装配线的作用_Java装配线是什么_58
  • 另外还有指令流水时空图,
  • 横坐标为时间Java装配线是什么 装配线的作用_Java装配线是什么_59
  • 纵坐标为空间Java装配线是什么 装配线的作用_功能部件_60,表示一条指令的不同功能段(取指IF,…,写回WB)
  • 每条指令可以拆分为5个阶段:A,B,C,D,E
  • 对于第i条指令:Java装配线是什么 装配线的作用_寄存器_61
  • Java装配线是什么 装配线的作用_指令流_62开始,指令流水线已经可以充分流动,效率达到最高
  • 假设程序有N条指令
  • 所有流水段的长度之间的关系Java装配线是什么 装配线的作用_寄存器_63
  • 每个Java装配线是什么 装配线的作用_功能部件_64可以平均完成一条指令!(Java装配线是什么 装配线的作用_Java装配线是什么_65)
  • 为什么说是平均完成?
  • 这是以工作总量(执行完成的功能段的总数上看的)
  • 如果每条指令5个功能段
  • 那么3条指令全部执行完毕经历了15个功能段的全部执行完毕
  • 对于上述表格所展示的,Java装配线是什么 装配线的作用_Java装配线是什么_66的时间段内,总共完成了15个功能段
  • 因此说,是平均每个时间段Java装配线是什么 装配线的作用_Java装配线是什么_67完成一条指令(工作量)
  • 我们以Java装配线是什么 装配线的作用_Java装配线是什么_68为例,该时间段内,可以完成:Java装配线是什么 装配线的作用_指令流_69,它们是同时自行的,(也就是说,书写顺序不体现执行顺序和完成顺序,但是可以知道,它们都将在Java装配线是什么 装配线的作用_Java装配线是什么_68这个时间段内全部完成,而且是并行执行(应该是在时间段Java装配线是什么 装配线的作用_Java装配线是什么_68的起点同时启动这5个功能段的任务)
  • 容易看得到,不同指令的不同功能段在同一时间段内并行执行,充分利用了cpu的各个功能部件
  • 但是为了做到这一点,对指令集的设计具有一定要求,否则无法实现同一流水段执行不同指令的不同周期的目标
  • 根据上面的表格可以看出:
  • 在第Java装配线是什么 装配线的作用_功能部件_72个基准时间段,N条指令尽数执行完毕
  • 从而,执行完所有指令耗费的时间(最理想的情况下)为:
  • Java装配线是什么 装配线的作用_指令流_73
  • 平均每条指令耗费的时间为Java装配线是什么 装配线的作用_指令流_74
  • Java装配线是什么 装配线的作用_功能部件_75
  • Java装配线是什么 装配线的作用_寄存器_76
  • 例如
  • 程序中有7条指令(Java装配线是什么 装配线的作用_指令流_77)
  • 在最理想的情况下,执行完7条指令耗费的时间是Java装配线是什么 装配线的作用_寄存器_78
  • 与代入公式Java装配线是什么 装配线的作用_寄存器_79,是相符合的
  • 其中,在Java装配线是什么 装配线的作用_寄存器_80这3个时间段每个时间段都能够平均完成一条指令
  • 比较两种执行方式:
  • 为了便于比较,假设指令的各个功能功段执行完毕所要耗费的时间都是Java装配线是什么 装配线的作用_指令流_81
  • 那么串行执行耗时:Java装配线是什么 装配线的作用_指令流_82
  • 并行流水技术耗时:Java装配线是什么 装配线的作用_功能部件_83
  • Java装配线是什么 装配线的作用_寄存器_84
  • Java装配线是什么 装配线的作用_功能部件_85
  • 也即是说,最理想的请况下,流水技术可将速度提升将近至5倍

小结

  • 在对于整个程序(而非单条指令)而言,指令流水技术可以使得程序的执行效率大为提高
  • 如果程序的指令非常多,那么可以使得cpi趋近于1
  • (每个周期就能够完成一条指令的执行)

利于指令流水的指令集设计原则

  • 指令长度应该尽量一致,有利于化简取指令和指令译码操作
  • 否则,取指所花费时间长短不同,使得取指部件复杂,不利于指令译码
  • 指令格式应该尽量规整
  • 尽量保证源寄存器的位置相同
  • 有利于在指令未知的时候就可以执行取寄存器操作数
  • 否二需要译码后才能够确定指令中各个寄存器编号位置
  • 采用Load/Store指令,其他指令都不能访问存储器
  • 这样,可以吧Load/Store指令的地址计算和运算指令的执行步骤规整到同一个周期中,有利于减少操作步骤
  • 数据和指令在计算机中对齐存放
  • 有利于减少访存次数
  • 使得所需要的数据在一个流水段(时间段)内就可以从内存中取得

流水线表示方式

时空图
  • 指令流水时空图
  • 横坐标为时间Java装配线是什么 装配线的作用_Java装配线是什么_59
  • 纵坐标为空间Java装配线是什么 装配线的作用_功能部件_60,表示不同功能部件:
  • 取指部件IF,…,写回部件WB
  • 描述了各个功能部件在不同时间段在执行那条指令的(对应功能段)
  • 例子

空间(部件)s

Java装配线是什么 装配线的作用_功能部件_85






Java装配线是什么 装配线的作用_功能部件_144

Java装配线是什么 装配线的作用_功能部件_144

Java装配线是什么 装配线的作用_功能部件_144

Java装配线是什么 装配线的作用_功能部件_144

时间T

  • 例如,指令Java装配线是什么 装配线的作用_功能部件_144的完整执行过程从Java装配线是什么 装配线的作用_寄存器_149
  • 单元格Java装配线是什么 装配线的作用_指令流_150描述的是指令Java装配线是什么 装配线的作用_Java装配线是什么_151Java装配线是什么 装配线的作用_功能部件_152时间段内,由功能部件IF进行取值处理
  • 单元格Java装配线是什么 装配线的作用_寄存器_153描述的是指令Java装配线是什么 装配线的作用_Java装配线是什么_151Java装配线是什么 装配线的作用_功能部件_155时间段内,由功能部件ID进行指令译码处理
  • 单元格Java装配线是什么 装配线的作用_功能部件_156描述的是指令Java装配线是什么 装配线的作用_Java装配线是什么_151Java装配线是什么 装配线的作用_Java装配线是什么_158时间段内,由功能部件WB进行指令执行结果回写处理
  • 又例如:指令Java装配线是什么 装配线的作用_Java装配线是什么_159的执行过程,从Java装配线是什么 装配线的作用_功能部件_160
  • 单元格Java装配线是什么 装配线的作用_寄存器_161描述的是指令Java装配线是什么 装配线的作用_功能部件_162Java装配线是什么 装配线的作用_功能部件_155时间段内,由功能部件IF进行取值处理
  • 单元格Java装配线是什么 装配线的作用_寄存器_164描述的是指令Java装配线是什么 装配线的作用_功能部件_162Java装配线是什么 装配线的作用_寄存器_166时间段内,由功能部件ID进行指令译码处理
  • 单元格Java装配线是什么 装配线的作用_功能部件_167描述的是指令Java装配线是什么 装配线的作用_功能部件_162Java装配线是什么 装配线的作用_寄存器_169时间段内,由功能部件WB进行指令执行结果回写处理
  • 又比如,
  • 单元格Java装配线是什么 装配线的作用_Java装配线是什么_170,描述的是,指令Java装配线是什么 装配线的作用_功能部件_171运算任务
效率比较
  • 从时空图可以看出,在Java装配线是什么 装配线的作用_Java装配线是什么_172结束时,回写部件WB已经完成Java装配线是什么 装配线的作用_寄存器_173指令的执行
  • 当然Java装配线是什么 装配线的作用_Java装配线是什么_174全部完成
  • Java装配线是什么 装配线的作用_寄存器_175指令的完成程度个不相同
  • Java装配线是什么 装配线的作用_Java装配线是什么_176刚刚完成第一阶段(IF取值阶段)
  • Java装配线是什么 装配线的作用_功能部件_177已经完成了MEM阶段,可以知道下一个Java装配线是什么 装配线的作用_指令流_178,就可以完成Java装配线是什么 装配线的作用_功能部件_177的所有阶段
  • 而如果是串行的方式执行,那么到Java装配线是什么 装配线的作用_指令流_180结束,就只有两条指令完成,
  • 可见,流水技术的方式要高效得多

小结

  • 只有在大量连续任务不断输入流水线才能够成分发挥流水线的性能
  • 指令的执行正好是连续不断的,比较适合采用流水线技术
  • 流水线技术能够提升运算幂集型应用的性能
  • 但是对于单个运算是无法提升性能

流水线的基本实现

  • 单周期cpu的时钟频率取决于数据通路中的关键路径(最长路径)
  • 虽然不是所有指令都必须经过5个(流水)阶段,但是只能够以执行速度最慢的指令作为设计其时钟周期的依据

流水线的数据通路

  • IF(取指)
  • 程序计数器PC
  • 指令存储器
  • 下条指令地址的计算逻辑
  • ID(译码)
  • 操作控制器
  • 取数操作逻辑
  • 立即数符号扩展模块
  • 用来将短数据扩展为长数(比如16bit立即数扩展为32bit)
  • EX
  • 算数逻辑单元ALU
  • 分支地址计算模块(BranchAddress)
  • MEM
  • 数据存储器读写模块
  • WB
  • 寄存器写入控制模块
流水寄存器
  • 每个流水段后面都需要增加一个流水寄存器
  • 锁存本段处理完成的数据和控制信号
  • 保证本段的执行结果能够在下一个时钟周期给下一个流水段使用
  • 根据流水寄存器所连接的前后功能段来命令流水寄存器:
  • IF/ID寄存器
  • ID/EX寄存器
  • EX/MEM寄存器
  • MEM/WB寄存器
  • 各种寄存器和数据存储器均采用统一的时钟CLK进行同步
  • 每来一个时钟,就会有一条指令进入到流水线(IF段)
  • 不同的流水寄存器锁存的数据不同
小结
  • 流水寄存器保存的信息:
  • 后面流水段所需要的所有数据信息,包括:
  • PC+4
  • 指令
  • 立即数
  • 目的寄存器
  • ALU运算结果
  • 标志信息
  • 后面各段流水段要用到的所有控制信号(从前面传递过来的)

流水线冒险和处理

  • 在指令流水中,可能会遇到一些情况使得流水先无法正确执行后续指令引起流水线阻塞(停顿)
  • 这种情况称为流水线冒险
  • 相关原因有三种

结构冒险

  • 多条指令在同一时刻真用同一资源而形成的冲突(也称为资源冲突),是有硬件资源竞争造成的冲突
  • 解决办法
  • 前一指令访存时,使后一条相关指令(以及后续指令)暂停一个时钟周期
  • 单独设置指令存储器/数据存储器,使取数操作和取指操作各自在不同的存储器中进行
  • 现代计算机都引入了cache机制,L1 Cache通常采用数据Cache和指令Cache分离的方式,避免了资源冲突

数据冒险

  • 在一个程序猴子那个,下一条指令会用到当前指令的计算结果的时候,此时这两条指令发生数据数据冲突
  • 当多条指令重叠处理时,就会发生冲突
  • 数据冒险分为三类
  • 读后写(RAW)
  • 表示当前指令将数据写入寄存器后,下一条指令才能从寄存器中读取数据
  • 否则读到的就是错误的数据(旧数据)
  • 写后读(WAR)
  • 当前指令读出数据后,下一条指令才能够写该寄存器.
  • 否则读到的就是错误的数据(被覆盖的数据)
  • 🎈写后写(WAW)
  • 表示当前指令写入寄存器后,下一条指令才能够写该寄存器,
  • 否则,下一条指令在当前指令写之前写,使得寄存器的值不是最新的
  • 解决办法:
  • 把遇到数据相关的指令及其后续指令都暂停一至几个时钟周期
  • 直到数据相关问题消失后,再继续执行
  • 又可以分为硬件阻塞(stall)和软件插入(NOP)指令两种方式
  • 设置相关专用通路
  • 不用等待前一条指令将结果写回寄存器组
  • 下一条指令也不再读取寄存器组来获取数据
  • 而是直接把前一条指令的ALU计算结果作为自己的输入数据开始计算过程
  • 使得原本需要暂停的操作变得可以继续执行(称为数据旁路技术)
  • 通过编译器对数据相关指令进行编译优化,调整指令顺序来解决数据相关问题

控制冒险

  • 控制冒险:指令通常是顺序执行的
  • 但是遇到改变指令执行顺序的情况(例如执行转移/调用/返回等指令)时,会改变PC的值,造成断流
  • 解决办法
  • 预测:对转移指令进行分支预测,尽早生成转移目标地址
  • 简单预测(静态预测)
  • 总是预测条件不满足
  • 继续执行分支指令的后续指令
  • 动态预测
  • 根据程序执行的历史情况,进行动态预测调整
  • 具有较高的预测准确率
  • 预取:
  • 预取转移成功和不成功两个控制流方向上的目标指令
  • 加快和提前形成条件码
  • 提高转移方向的准确率

例题🎃

流水的相关问题(冲突问题)实例

数据相关

Java装配线是什么 装配线的作用_Java装配线是什么_181

1)流水线操作的时钟周期T应按四步操作中所需时间最长的一个步骤来考虑,所以T=100ns。

Java装配线是什么 装配线的作用_指令流_182


Java装配线是什么 装配线的作用_功能部件_183

流水线性能指标🎈

流水吞吐率

  • Pipeline throughput(吞吐率:ThroughPut)
  • 指的是单位时间内,流水线完成的任务数量(输出的结果数量)
  • Java装配线是什么 装配线的作用_寄存器_184
  • Java装配线是什么 装配线的作用_Java装配线是什么_185
  • 可以将Java装配线是什么 装配线的作用_功能部件_186简写为Java装配线是什么 装配线的作用_Java装配线是什么_187(通常更加强调参数Java装配线是什么 装配线的作用_指令流_188)
  • Java装配线是什么 装配线的作用_Java装配线是什么_189是基准时间,有时它就是时钟周期
  • Java装配线是什么 装配线的作用_指令流_190是每条指令的功能段(流水段)数
  • 前面的例子中,Java装配线是什么 装配线的作用_指令流_191,从这个角度上看,k越大,吞吐率越小
  • 连续输入的任务Java装配线是什么 装配线的作用_指令流_192时,
  • Java装配线是什么 装配线的作用_功能部件_193

加速比(串行/流水耗时比)

  • 为了比较流水线技术相较于串行执行方式的速度提升情况,使用加速比来描述
  • 加速比:完成同一批任务(n条指令),不使用流水线与使用流水线所用的时间之比
  • 分子是串行方式执行的总耗时较长
  • 分母是流水并行方式执行,总耗时较短
  • 记为Java装配线是什么 装配线的作用_功能部件_194
  • Java装配线是什么 装配线的作用_Java装配线是什么_195表示串行方式(serial)执行(Java装配线是什么 装配线的作用_寄存器_196)所耗费的时间
  • Java装配线是什么 装配线的作用_Java装配线是什么_197表示每条(per)指令的执行耗时
  • Java装配线是什么 装配线的作用_功能部件_198
  • Java装配线是什么 装配线的作用_功能部件_199表示Java装配线是什么 装配线的作用_功能部件_200段流水线方式执行耗费的时间
  • Java装配线是什么 装配线的作用_功能部件_201

  • 假设每条k段任务的每段执行时间都是Java装配线是什么 装配线的作用_Java装配线是什么
  • Java装配线是什么 装配线的作用_Java装配线是什么_203表示串行方式执行(Java装配线是什么 装配线的作用_寄存器_204)所耗费的时间
  • Java装配线是什么 装配线的作用_指令流_205
  • Java装配线是什么 装配线的作用_寄存器_206
  • 加速比一般是达不到Java装配线是什么 装配线的作用_寄存器_207

流水效率(设备利用率)

  • Java装配线是什么 装配线的作用_Java装配线是什么_208
  • 可见,在最理性的情况下,流水技术的设备利用率趋近于百分之百(任务数量足够多)

例题(加速比)

  • 注意,在计算加速比的时候,串行时间部分的计算不按流水的时钟周期来计算的
  • (流水时间周期指基于流水方式提出,不属于串行概念)
  • 设5个功能段的指令流水中,每段的执行时间分别为
  • 10,8,10,10,7,单位是ns
  • 完成n=12条指令的流水线而言
  • 加速比S=?
  • 流水线吞吐率TP=?
  • 分析:
  • 流水线应该将基准时间Java装配线是什么 装配线的作用_指令流_209
  • Java装配线是什么 装配线的作用_寄存器_210
  • Java装配线是什么 装配线的作用_指令流_211
  • Java装配线是什么 装配线的作用_Java装配线是什么_212
  • Java装配线是什么 装配线的作用_指令流_213
  • Java装配线是什么 装配线的作用_指令流_214

高级流水线技术🎈

  • 有两种增加指令级并行的策略

多发射技术

  • 采用多个(相同功能的)内部功能部件,使得流水线功能段可以同时处理多条指令(的相同阶段)
  • 处理机可以一次发射多条指令进入流水线执行

超标量流水线技术

  • 即,动态多发射技术
  • 每个时钟周期内可以并发多条独立指令,以并行方式将多条指令编译并执行,需要配置多个功能部件
  • 超标量不能调整指令的执行顺序,通过编译优化技术,可以把并行执行的指令搭配起来,挖掘更多的指令并行性

超长指令字技术

  • 即,静态多发射技术
  • 由于编译程序挖掘出指令间潜在的并行性,将多条能并行操作的指令组合成一条具有多个操作码字段的超长指令字
  • 可以达到几百bit
  • 需要采用多个处理部件

超流水线技术

  • 增加流水线级数来使得更多的指令同时在流水线中重叠执行
  • Java装配线是什么 装配线的作用_Java装配线是什么_215
  • 从前面对流水吞吐率的讨论中可以知道:
  • 流水线功能段划分的越多,时钟周期就可以设定的越短,指令的吞吐率就越高
  • 因此,超流水线技术通过**提高流水线主频(缩短流水线时钟周期)**的方式来提升流水线性能
  • Note:
  • 但是,流水线级数不是越多越好
  • 流水线级数越多,用于流水寄存器的开销越大,流水线级数是有限制的