赞
踩
http://ultramanwyl84920.spaces.live.com/blog/cns!7CDFDADCEF9B2921!256.entry
一 流水线的静态调度与动态调度
提高流水线的效率
指令流水线的执行方式会产生流水线的冲突和保护
1 对寄存器访问的竞争是影响流水线保护和延迟的主要原因。
如果出现要对某寄存器读取/写入的时候, 前一指令对该寄存器的写操作/读操作还未完成的情况,就会造成流水线保护和延迟
2 对存储器访问的竞争也是影响流水线保护和延迟的重要原因
3 指令缓冲队列也有可能造成流水线保护和延迟,
流水线的竞争
定义: 流水线竞争是流水线中造成下一条指令不能在指令时钟周期被执行的情况.
流水线竞争的后果----造成流水线停顿几个周期,从而降低流水线效率.
流水线竞争种类
结构竞争:资源冲突(不支持某些指令组合)
数据竞争:后续指令的执行依赖于前面指令的执行结果
控制竞争:因转移或修改PC引起的竞争
流水线的动态调度有许多优势
1 能调度在编译时不可能知道的竞争情况
2 符合程序执行的实际情况
3 具有更高的效率和准确性
4 简化编译程序设计
5 代码的移植性强
缺点就是控制硬件比较复杂
二 动态调度
静态调度的缺点
虽然可以通过旁路控制机构,编译技术调度指令序列,分开具有相关性的指令来使竞争数目和性能损失减小到最低程度。但是不可避免的数据相关是不可能完全消除的竞争还会存在。所以需要使用流水线的动态调度。
动态调度的一大优势就是: 能够在数据相关时,避免暂停流水线。
动态调度的重要点就是:流水线的乱序执行,指令的发射是乱序的,指令的完成也有可能是乱序的。
由于流水线允许多条指令在同一时刻执行 所以流水线结构需要改变,功能单元也需要改变了。
静态调度与动态调度:
静态调度:根据软件的行为特征进行优化来编译调度指令代码次序,主要依据程序未执行时的行为特征和统计数据进行的调度策略
动态调度:通过硬件在程序执行时重新安排代码的执行序列来减少竞争引起的流水线停顿时间
动态调度流水线具备以下功能:
(1)允许按序取多条指令和发射多条指令----取指(IF)流水级允许按顺序取多条指令进入单口暂存器(single-entry latch)或队列(queue), 指令然后从latch或queue取出,进入ID节拍。
(2)能检查并消除hazards----将ID流水级分为独立的两级:Issue级和Read operand级:
Issue级功能
----指令译码,检查是否存在结构竞争(即在这一流水级解决结构竞争问题);
Read operands级功能
----等到无数据竞争(RAW)后,读出操作数,即在这一流水级解决数据竞争问题
三 记分牌动态调度算法
记分牌是一集中控制部件,其功能是控制数据寄存器与处理部件之间的数据传送。在记分牌中保存有与各个处理部件相联系的寄存器中的数据装载情况。当一个处理部件所要求的数据都已就绪(装载完毕),记分牌允许处理部件开始执行。当执行完成后,处理部件通知记分牌释放相关资源。所以在记分牌中记录了数据寄存器和多个处理部件状态的变化情况,通过它来检测和消除或减少数据相关性,加快程序执行速度。
目的:
在无资源竞争的前提下保持每一个时钟周期执行一条指令的速率。
思想方法:
尽可能提早指令的执行。当一条指令暂停执行时,如果其他后继指令与暂停指令及已发射的指令无任何相关,则仍然可以发射,执行。
记分牌的功能
指令发射和执行
竞争检测和消除
每一条指令都要经过记分牌(记录在“指令状态表”中),即发射到记分牌数据结构中; 纪录数据相关性,把源和目的操作数记录在“功能单元状态表”中; 决定指令何时可读出操作数(检测是否有RAW竞争)
决定指令何时可以开始执行(一旦操作数就绪,立即开始执行);
若某条指令不能立即执行,则由记分牌监控硬件的每一变化,并决定何时才能开始执行;
控制指令何时能将结果写入目的寄存器(即检测是否有WAR竞争)
任务:
控制指令的发射和执行。
在RISC处理器中,记分牌主要针对的是浮点操作。
因此将指令的执行分为4级:
1 发射级
指令的功能部件没有结构竞争和没有WAW竞争的时候,则这条指令可以发射。将会把指令发射到相应的功能部件,同时修改记分牌的内部数据结构。如果存在结构竞争或者是存在WAW竞争时候,指令暂停发射。
2 读操作数
记分牌监控源操作数是否就绪。一个源操作数就绪的条件为:
早前发射的活动指令对该操作数不进行写入操作(即无RAW竞争)
含有操作数之一的寄存器,就是该活动功能单元即将写入的寄存器,如SUBD F8, F8, F14. (即也不会出现RAW竞争)。记分牌在这一步解决了RAW竞争问题。
当源操作数准备就绪,记分牌通知功能单元读出操作数,并开始执行。
检测RAW, 若有,则停顿该指令,但是在动态调度时,有多条指令并行操作,所以可能有另外指令满足条件,则继续执行下去,从而消除了停顿的损失。
3 执行
功能单元开始对操作数执行操作。当得到“结果”后,功能单元通知记分牌该操作已执行完毕。
4 写结果
检查是否有WAR竞争,如果存在,则暂停指令。否则就写入寄存器。
记分牌在各执行步骤中需检测和记录的事件
记分牌算法的性能限制
记分牌动态调度方法利用了程序中存在的ILP,通过乱序执
行,达到减少RAW造成的停顿周期,然而其性能,即消除stall的能力受下列因素影响
指令级并行性不高(需要进一步研究开发更多的ILP)
记分牌表项较少(可增加硬件加以解决)
功能单元少(可增加硬件加以解决)
存在反相关性(WAR)和输入相关(WAW),导致WAR和WAW停顿,也就是说,记分牌无法消除WAR和WAW两种相关性----这一点对性能影响较大,需要新的动态调度方法
记分牌方法可消除RAW是由于乱序执行,实际出现RAW时,也是停顿的
四 Tomasulo算法
由于记分牌算法只能检测竞争,但是不能消除竞争
所以需要引入Tomasulo 算法
Tomasulo基本思想:
Tomasulo方法所采用的寄存器重命名的实现方法,是把记分牌中的寄存器名用一大组虚拟寄存器的名来代替,即用虚拟寄存器集来代替真实的FP寄存器组
虚拟寄存器集所含虚拟寄存器数目远大于真实的寄存器组。因此用它来完成寄存器改名就很容易了。
虚拟寄存器集在Tomasulo方法中由每一功能单元所带的保留站(reservation station)和取数缓冲区(Load buffers)和存数缓冲区(Store buffers)组成
取数缓冲区(Load buffers)----保存被访问的存储单元的数据和地址。
浮点寄存器(FP registers)----通过一对总线(operand buses)与每一功能单元相连接,这一对总线分别对应两个操作数。通过一条总线与存数缓冲区(Store buffer)相连接,功能单元的输出和Load Buffer的输出汇总在CDB与浮点寄存器(FP register的输入相连接
公共数据总线Common data bus(CDB)----CDB与FP registers, reservation stations和Store buffers等输入相连,唯一无连接关系的是Load buffers的输入。(实际上是正常数据通路+forwarding path)
保留站和所有Buffers都含有标识域,用来消除竞争(标识域代表虚拟寄存器号)
Tomasulo方法在每一流水级的功能:
1. 发射级(Issue)
若是一条FP操作指令,如果保留站有空,则将其送往保留站;如果该指令的操作数已在FP 寄存器,将操作数的值送往保留站。
若是一条Load或Store指令,如果buffer 有空,将其送往相应的Buffer,若保留站或buffers不空,则存在结构竞争,停顿该指令直到对应保留站或buffer有空为止。
本流水级同时完成寄存器改名过程,因为保留站中的操作数不再使用寄存器号。
2.执行级(Execute)
若有一个或几个操作数未就绪,等待计算该操作数,同时监控CDB。
一旦操作数就绪,立即存入相应的保留站;
若两个操作数均已就绪,则执行该操作。 本步同时检查是否存在RAW竞争
3.写结果级(Write Result)
当结果算出后,将其写入CDB, 并从CDB写入目的寄存器以及等待此结果的相应保留站。
当连续写同一寄存器时,只有最后一次才能写入
Tomasulo方法中指令在不同流水级的功能的形式化描述:
Tomasulo方法的基本思想
一旦指令从浮点操作队列进入保留站,保留站立即从浮点寄存器, 取数缓冲区取出已就绪的操作数的值,并立即送入保留站中暂存起来。当指令开始操作时,不必再从浮点寄存器中读取操作数的值。
那些未就绪的操作数称为挂起操作数,挂起操作数的寄存器号在保留站中采用将要提供该操作数的保留站名,或取数缓冲区名来表示。这个过程称为register renaming(寄存器换名),由issue logic(发射逻辑硬件)完成。一旦被挂起操作数由某功能单元算出后,或在取数缓冲区就绪后,可通过CDB立即送往需要的保留站
当出现对某寄存器进行相继写入操作时,只允许最后一次写操作可以更新该寄存器,避免了WAW竞争。
由此可见,Tomasulo方法的寄存器换名过程是由发射逻辑部件和保存站结合起来完成的。由于保留站存放操作数的容量远大于浮点寄存器,因此通过这一寄存器改名过程就很容易消除WAR和WAW竞争。
五 Tomasulo法和记分牌法的异同
相同之处:
两者消除RAW竞争的思想相同。Tomasulo方法采用了记分牌方法的动态调度的核心思想,多条指令处于发射状态,等待条件成熟,可以不按顺序执行,不按顺序完成的思想,即为动态调度来消除RAW竞争。
不同之处:
Tomasulo方法通过寄存器换名过程可以消除WAR和WAW竞争。
记分牌方法能检测WAR和WAW竞争,一旦检测到存在WAR和WAW竞争,通过插入停顿周期来解决这一竞争。所以,记分牌方法不能消除WAR和WAW竞争。
硬件组织上有两点不同:
检测竞争和控制指令执行方式的不同:
Tomasulo方法检测竞争和控制指令执行两方面功能是通过分布在每一功能单元的保留站来进行的,因此Tomasulo方法是一种分布式方法。
记分牌方法的上述功能是通过统一的记分牌来实现的,因此记分牌方法是一种集中式方法。
写结果的方法不同:
Tomasulo方法通过CDB直接将功能单元输出的结果送往需要该结果的所有保留站,而不必经过寄存器这一中间环节。
记分牌方法是将结果写入FP寄存器, 因而可能造成等待这一结果的指令都出现停顿现象,之后,所有相关指令的功能单元在读FP 寄存器时又可能出现竞争现象。
Tomasulo方法的流水级功能与记分牌比较:
Tomasulo方法中无检查WAW和WAR竞争功能,因为在指令发射过程中,由issue logic结合保留站完成了register operands的改名过程,即消除了这两种竞争。
CDB起到广播结果的作用,不必通过register file直接结果送到所有需要该结果的保留站和buffers.
Load和Store buffers相当于基本功能单元
六 基于操作队列复用的指令流水线结构
现代微处理器大都采用动态调度技术,即允许处理器改变指令执行的次序,以克服相关性,增加并行性.为了实现指令的动态调度,通常还需要寄存器重命名和操作队列等技术支持,其中寄存器重命名技术允许处理器动态地分配寄存器,用于解决由于指令乱序执行而产生的寄存器冲突,操作队列则缓
冲准备好用于乱序执行的指令.
该结构由取指部件、译码部件、操作队列、定点及浮点寄存器堆及多个功能部件组成.在该结构中,指令译码部件按指令
在程序中出现的先后次序把译码后的指令(译码后的指令称为操作)送到操作队列,操作队列按次序根据操作的类型把操作发射到相应的保留站,并按次序结束(commit)运算结果已经写回的指令.保留站中的操作经运算后,把结果送回到结果总线并写回到操作队列.指令进出操作队列(即发射和Com—mit)都是有序的,但在操作队列期间的执行过程中是无序的.
在上述结构中,运算结果不直接写回到结果寄存器而是先写回到操作队列是为了实现精确例外处理以及转移猜测的需要.因为操作队列中指令的执行是无序的,一条指令的执行结果必须等到它前面
所有的指令都执行完后才能写回到寄存器.否则,在该指令的执行结果写回寄存器后它前面的一条指令发生了例外或转移猜测错误时,处理器现场就不正确了.
如果一个操作发射时它所需的源操作数还没有准备好(该操作的源寄存器正成为其它未完成指令的目标寄存器),该操作的发射不需要等待,而是通过操作队列号建立操作间的数据依赖关系后把操
作发射到保留站,保留站自动侦听结果总线并接收所需要的值.
具体过程如下:
(1)一个操作进入操作队列时把该操作的源寄存器号与操作队列中的每一个操作的目标寄存器号进行相联比较,得出操作队列中最近一个写该寄存器的操作所在的位置(如第qid项),即该寄存器被重定向到最近一个写它的操作在操作队列的位置.
(2)该操作发射时检查该操作的源寄存器Ri的重命名号qid,如果第qid项的值已经写回到操作队列则直接从操作队列中读出该值作为Ri的值,否则把qid送到保留站并在保留站中记录该寄存器值未准备好.
(3)保留站侦听结果总线,当第qid项操作结束并把结果送到结果总线时直接接收结果总线的值作为Ri的值.
(4)当保留站中所有操作数都准备好后开始运算并把结果送到结果总线,结果总线连接到操作队列以及保留站.
七 流水线中的中断
流水线的每一个阶段都有可能产生例外,取指阶段的例外有取指地址错(如用户态访问核心空间、指令地址不对齐)、TLB例外(TLB不
命中、TLB命中但无效)、取指总线错等.译码阶段发生的例外有协处理器不可用(如没有浮点部件、需要软件模拟浮点运算)、保留指令、系统调用、断点例外等.执行阶段可能发生的例外有定点溢出、自陷、浮点例外、访存地址错、访存TLB例外、访存总线错等.此外外部中断例外、不可屏蔽例外及复位例外可能在任何时候发生.
在乱序执行环境中,为了保证例外处理现场的精确性,运算部件的执行结果不能直接写回到结果寄存器,必须等相应指令前面所有的指令都执行完后才能写回.否则,在某指令的执行结果写回寄存器后它前面的一条指令发生了例外时,例外现场就不正确了
我们可以通过基于操作队列复用的寄存器重命名机制来保证例外现场的精确性.运算部件的计算结果不直接写回结果寄存器,而是写回到操作队列的相应项(把结果寄存器重命名为相应的操作队列号),只有在该操作前面的所有操作都已经结束后,在结束该操作时再把该操作的结果写回结果寄存器.
例外处理可以分成两个阶段.第一阶段为记录例外阶段,当一条指令在执行过程中引起例外时,不立即进行例外处理,而是把例外原因等保存在相应指令的操作队列中.第二阶段为例外处理阶段,当发生例外的指令成为操作队列中的第一条指令时,进行例外处理.把发生例外的信息发送到有关模块(PC,控制寄存器等).
根据例外原因及其在指令流水线中的处理方式,可分为如下几种情况:
(1)对于在指令执行阶段产生的例外,在执行结束时把例外原因记录到相应的操作队列中例外原因字段.
(2)对于在取指令阶段以及译码阶段产生的例外,指令译码器将形成一条特殊的“指令”并放人操作队列,该“指令”不会被执行.只用于当该“指令”成为操作队列头上的指令时产生例外信号.
(3)NMI和外部中断例外,在操作队列从译码部件接收指令时作为被接收的指令发生的例外处理.
(4)SoftReset视作操作队列头指令发生了例外处理(不用等操作队列头指令结束),把操作队列头的指令PC作为返回地址.
(5)对于硬复位例外,不用考虑当前操作队列以及PC的值,立即进行例外处理.
在取指、访存或运算过程中,如果发生了例外,相应过程就可结束,把例外信息作为取指、访存或运算结果返回.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。