流水技术
将一重复的时序过程分解为若干子过程,每个子过程都可有效地在其专用功能段上与其它子过程同时执行,这种技术称为流水技术。
分类:
功能分类:单功能流水线(是指只能完成一种固定功能地流水线),例如功能单元流水线
多功能流水线(是指各段可以进行不同的连接,从而完成不同的功能),例如 TI ASC的多功能流水线
按同一时间内流水段的连接方式划分
静态流水线,是指在同一时间内,流水线的各段只能按同一种功能的连接方式工作。
例如:TI ASC的流水线 适合于处理一串相同的运算操作
动态流水线,是指在同一时间内,当某些段正在实现某种运算时,另一些段却在实现另一种运算。(会使流水线的控制变得很复杂)
按流水的级别划分
部件级流水线,又叫运算操作流水线,是把处理机的算术逻辑部件分段,使得各种数据类型的操作能够进行流水。
处理机级流水线,又叫指令流水线,是把解释指令的过程按照流水方式处理。
处理机间流水线,又叫宏流水线,是由两个以上的处理机串行地对同一数据流进行处理,每个处理机完成一项任务。
按数据表示进行分类
标量流水处理机,是指处理机不具有向量数据表示,仅对标量数据进行流水处理。
例如IBM360/91,Amdahl 470V/6
向量流水处理机,是指处理机具有向量数据表示,并通过向量指令对向量地各元素进行处理。
例如TI ASC、STAR-100、CYBER-205、CRAY-1、YH-1等
按照是否有反馈回路来进行分类
线性流水线是指流水线地各段串行连接,没有反馈回路
非线性流水线是指流水线中除有串行连接的通路外,还有反馈回路。(存在流水线调度问题)
确定什么时候向流水线引进新的输入,从而使新输入的数据和先前操作的反馈数据在流水线中不产生冲突,此即所谓的流水线调度问题
MIPS基本流水线
1.取指令周期(IF)
操作为: 根据PC值从存储器中取出指令,并将指令送入指令寄存器IR;PC值增加4,指向顺序的吓一跳指令,并将下一条指令的地址放入临时寄存器NPC中。
2.指令译码/读寄存器周期(ID)
操作为: 进行指令译码,读IR寄存器(指令寄存器),按照相应寄存器号读寄存器文件,并将读出结果放入两个临时寄存器A和B中。同时对IR寄存器中内容的低16位进行符号扩展,然后将符号扩展之后的32位立即值保存在临时寄存器Imm中。
3.执行/有效地址计算周期(EX)
操作为: 存储器访问: ALUoutput<-A + Imm
寄存器-寄存器ALU:ALUoutput<-A op B
寄存器-立即值ALU:ALUoutput<-A op Imm
分支操作:ALUoutput <- NPC + Imm
Cond <-(A op 0)
思考: 为什么执行和有效地址计算可以合并?
因为每条指令要不然是做某种功能操作,要不然进行有效地址的计算进行存储器的访存操作,要不然就进行条件判断新的转向地址的判断,一条指令不可能对这几种操作同时展开,所以在这一步骤只能选择一种操作,所以在这里是合并的。
4.访存/分支操作完成周期(MEM)
操作为:
访存操作:
Load: LMD<-LMDMEM[ALUoutput]
Store: Mem[ALUoutput]<-B
分支操作:if(Cond) PC<-ALUoutput
else PC<-NPC
5.写回周期(WB)
操作为:
寄存器-寄存器型ALU指令: Reg[IR16..20]<-ALUoutput
寄存器-立即值型ALU指令:Reg[IR11..15]<-ALUoutput
Load指令:Reg[IR11..15]<-LMD
实现流水技术应解决的一些问题
(1)应保证流水线各段不会在同一时钟周期内使用相同的寄存器通路资源。
例如,不能要求一个ALU既做有效地址计算,又做减法操作
IF与Mem两个阶段都要访问存储器,怎样避免访存冲突
ID和WB两个阶段都要访问寄存器,是否存在冲突?怎样避免?
(2)PC计算问题
为了能够在每个时钟周期启动一条新的指令,流水线必须在IF段获得下一条指令的地址,并将其保存在PC中。但是分支指令会改变PC的值,而且只有在Mem段结束时,这个新值才会被写入PC,出现矛盾。
解决办法:改变数据通路,在IF段完成PC计算。但分支指令如何处理?
(3)合理划分流水段,每段内的操作都必须在一个时钟周期内完成。
(4)流水线寄存器设计
为防止寄存器中的值在为流水线中每条指令所用时被流水线中其它的指令所重写,可在流水线各段之间设置流水线寄存器文件,也称锁存器。
流水线寄存器文件的命名
段A与B之间的流水线寄存器文件称为A/B
流水线寄存器的作用
流水线寄存器文件的构成
流水线性能分析:
三项性能指标:吞吐率、加速比和效率
1.吞吐率
是衡量流水线速度的重要指标
吞吐率是指单位时间内流水线所完成的任务数或输出结果的数量。
最大吞吐率TPmax是指流水线在达到稳定状态后所得到的吞吐率。
设流水线由m段组成,完成n个任务的吞吐率称为实际吞吐率,记作TP。
(1)最大吞吐率
假设流水线各段的时间相等,均为▲t0,则:
TPmax = 1/▲t0
假设流水线各段时间不等,第i段时间为▲ti,则:
TPmax = 1/max{▲ti}
--最大吞吐率取决于流水线中最慢一段所需的时间,该段成为流水线的瓶颈
--消除瓶颈的方法
--细分瓶颈段
--重复设置瓶颈段
2.加速比
加速比是指流水线速度与等功能的非流水线速度之比。
根据定义可知,加速比S=T非流水/T流水
3.效率
效率是指流水线设备的利用率
由于流水线有通过时间和排空时间,所以流水线的各段并非一直满负荷工作,E<1
流水线中三种类型的相关
1.结构相关:当指令在重叠执行过程中,硬件资源满足不了指令重叠执行的要求,发生资源冲突时将产生“结构相关”
2.数据相关:因一条指令需要用到前面指令的结果,而无法与产生结果的指令重叠执行时,就发生了数据相关。
3.控制相关:当流水线遇到分支指令和其它会改变PC值的指令时就发生控制相关。
结构相关
导致结构相关的原因:
-功能部件不是全流水
-重复设置的资源数量不足
实例:当数据和指令存在同一存储器中时,访存指令会引起存储器访问冲突
实例解决办法:
1.插入暂停周期
气泡代表空操作
2.将指令存储器和数据存储器分离
避免结构相关的方法:
--所有功能单元完全流水化
--设置足够多的硬件资源(硬件代价大)
数据相关
产生原因:当指令在流水线中重叠执行时,流水线有可能改变指令读/写操作数的顺序,使之不同于它们在非流水实现时的顺序,这将导致数据相关。
实例: ADD R1, R2, R3
SUB R4, R1, R5
AND R6, R1, R7
OR R8, R1, R9
XOR R10,R1,R11
消除方法:向流水线中插入暂停周期
2.通过定向技术减少数据相关带来的暂停
定向(forwarding),也称为旁路(bypassing)
工作过程:
主要思路:将计算结果从其产生的地方直接送到真正需要它的地方,就可以避免暂停。
-寄存器文件EX/MEM中的ALU运算结果总是回送到ALU的输入寄存器
-从定向通路得到输入数据的ALU操作不必从源寄存器中读取操作数
进一步推广:一个结果不仅可以从某一功能单元的输出定向到其自身的输入,而且还可以定向到其它功能单元的输入
在MIPS中,任何流水寄存器到任何功能单元的输入都可能需要定向路径,将形成复杂的旁路网络。
两条指令访问同一存储单元,也可能引起数据相关,例如访问数据Cache失效时。
本章仅考虑寄存器数据相关。
数据相关分类:(1)写后读 (2)写后写 (3)读后写 (4)读后读(不引起数据相关)
需要暂停的数据相关:
并非所有数据相关都可以通过定向技术解决。
例: LW R1,0(R2)
SUB R4,R1,R5
AND R6,R1,R7
OR R8,R1,R9
增加流水线“流水线互锁”部件,当互锁硬件发现这种相关后,就暂停流水线,直到相关消除。
这种情况下,暂停的时钟周期数称为“载入延迟”
对MIPS流水线控制的实现:
指令发射:指令从流水线的译码段进入执行段的过程称为指令发射。
检测数据相关
--ID段可以检测所有数据相关
--在使用一个操作数的时钟周期的开始(EX和MEM段的开始)检测相关,并确定必需的定向
对MIPS流水线控制的实现
例:Load互锁的检测与实现
在ID段检测是否需要启动Load互锁,必须进行三种比较
一旦检测到相关,控制部件必须在流水线中插入暂停周期,并使IF和ID段中的指令停止前进
--将ID/EX中控制部分清0
--保持IF/ID的内容不变
定向逻辑的实现
-所有的定向都是从ALU/DM的输出到ALU、DM或0检测单元的输入
-形成了一个旁路网络
控制相关
1.分支指令的实现
1.1 一旦分支转移成功,正确的地址要在Mem段的末尾才会被写入PC
1.2 一旦ID段检测到分支指令,就暂停执行其后的指令,直到分支指令达到Mem段,确定新的PC为止
1.3 分支转移成功将导致MIPS流水线暂停3个周期
2.减少分支开销的途径
2.1 两个基本途径:同时采用,缺一不可!
-在流水线中尽早判断分支转移是否成功。
-转移成功时,尽早计算出转移目标地址
2.2 经改进,MIPS流水线可以将分支开销减少1拍
-将 “=0?”测试提前到ID段
-在ID段增加一个加法器,计算分支目标地址
2.3 再改进,MIPS流水线可以将分支开销再减少1拍
-将分支判断结果和目标地址提前到ID/EX站前
3.程序中分支指令的行为特点
(1)各种能改变PC值的指令的执行频度
条件分支:
整数程序: 14%-15%
浮点程序:3%-12%
其中,向前分支与向后分支的比:3:1
无条件分支:<=4% (绝大多数)
(2)条件分支转移成功的概率
向前转移成功:60%;向后转移成功:85%
4.减少流水线分支损失的方法
(1)冻结或排空流水线
思路:在流水线中停住或删除分支后的指令,直到知道转移目标地址
优点:简单
(2)预测分支转移失败
思路:流水线继续照常流动,如果分支转移成功,将分支指令后的指令转换为空操作,并从分支目标处开始取指令执行:否则照常执行
(3)预测分支转移成功
思路:始终假设分支成功,直接从分支目标处取指令执行
对MIPS流水线没有任何好处
(4)延迟分支(delayed branch)
思路:分支开销为n的分支指令后紧跟有n个延迟槽,流水线遇到分支指令时,按正常方式处理,顺带执行延迟槽中的指令,从而减少分支开销。
具有一个分支延迟槽的MIPS流水线的执行过程
什么样的指令能否放入分支延迟槽?
-三种调度方法:从前调度;从目标处调度;从失败处调度
从三个地方调度不相关指令放进去
-三种方法的要求与效果,存在限制因素(1.编译器预测分支是否成功的能力 2.放入延迟槽中的指令)
-取消分支
思路:分支指令中包含预测方向,若预测正确,正常执行延迟槽中的指令,否则将其转换为空操作