超标量技术:核心,为了最大化指令的吞吐率,必须减少分支指令,ALU指令,load/store指令的开销。
超标量处理器可以是只并行化EX段的流水段。
可以具体细分为:1)指令流; 2)寄存器数据流; 3)存储器数据流;
指令流:一般用在超标量流水线的前端,即取指段和译码段。流水线机器只有在流水模式下才能达到最大的吞吐率,
对于无条件分支指令,分支地址确定后,下一条指令就能取出;
对于条件分支,只有在分支部件执行结束,条件和分支地址都确定后,取指段才能读取下一条指令。
可以具体细分为:生成目标地址的开销和条件判断引起的开销。超标量处理器的总开销等于停顿周期数和流水线宽度的乘积。
生成目标地址的开销还取决于分支指令的寻址模式,
分支预测技术:对分支指令的目标地址和判定条件进行推测,任意一种推测机制都必须能够验证分支预测的结果,并且在预测失败时恢复正确的执行方式。
分支目标地址的推测通过设置分支目标缓冲BTB(Branch target Buffer)来实现,BTB用来保存前几次分支执行时的目标地址。包括两个域:
分支指令地址和分支目标地址
使用分支指令的地址访问BTB以及检索分支目标地址的工作都是在取指段执行的,若预测分支结果为跳转,则目标地址在下一个周期就被取指段使用。
虽然有了分支预测部件,分支指令还是要取出并送往流水线进行执行,以便确定预测是否正确,如果预测失败,恢复执行,需要更新BTB表中BTA的内容。
分支方向的预测中,最简单的方法是,总是预测为不跳转。对for循环不友好。
编译器优化,对不同的指令,设置静态的软件预测技术。不尽合理。
基于分支目标地址偏移的预测,相对偏移为正值,预测不跳转,相对偏移为负值,预测跳转。
普遍采用的是基于历史信息的分支预测技术
采用基于历史信息的分支预测策略对分支方向进行预测时,跳转还是不跳转取决于先前已经发生的分支方向。BTB在每条记录中增加一个历史信息位。
历史信息位作为FSM的状态变量,FSM的输出逻辑即分支预测方向。
预测算法有很多,如只要最近分支有一次以上的跳转,就执行跳转,除非最近两次都没有跳转,才不跳转。这些的设计策略都需要进行评估。
分支预测失败的恢复:
分支验证在分支指令执行完毕,正确方向已经确定后进行,前端预测结果的正确与否在此时判定。
如果结果证明预测正确,释放推测标识,所有的相关指令都变为非推测的,继续执行。
如果预测失败,结束当前指令流并从新的地址取指。指令流的改变通过修改PC来实现。
先进的分支预测技术
更精确的分支预测算法应该考虑其他关联分支指令的历史行为,从而动态的调整分支策略。之前的预测仅仅是静态方法。
Yeh和Patt提出的两级自适应分支预测技术,分支地址索引一个分支历史信息集合,称为模式历史信息表(PHT)。
然后通过预测算法FSM,来输出预测结果。以及之后的关联分支预测器。
对于那些没有很强的倾向性的分支和分支序列,预测是十分困难的。
寄存器数据流技术:
寄存器数据流主要是指ALU指令的执行,涉及到的问题主要是数据相关性,正相关,反相关,输出相关。
数据的相关性主要是由于寄存器重用引起的,静态的寄存器重用是一种编译器的优化,
编译主要是代码生成和寄存器分配。代码生成,值机器代码的生成,寄存器分配,尽可能的保证中间数据驻留在寄存器中,
同时避免存储器和寄存器之间频繁的数据移动。
在超标量机器中,由于指令是可以乱序执行的,所以寄存器的读写操作,并不按照程序的原始顺序,为了保证语义的正确性,
所有的反相关和输出相关必须被检测并消除。
寄存器重命名,同一体系结构寄存器中的多个定义动态分配不同的名字,寄存器重命名需要硬件的支持,在执行时可以撤销寄存器重用,来恢复
所有当前命令的值与寄存器之间的一一对应的关系。
主要作用是可以用来消除假相关,使得本来可以假相关的指令可以并行的执行了。