本章重点:超标量处理器执行指令时的动态行为,及针对某些特殊指令的处理技术。
超标量流水线设计的最终性能目标:获得最大的指令吞吐率。
三种数据流:
指令流:分支指令处理。
寄存器数据流:ALU指令处理
存储器数据流:load/store指令处理
4.1 指令流技术
一般用在超标量流水线的前端,即取指段和译码段。
流水线前端的吞吐率是整条流水线吞吐率的上限。
主要挑战:条件分支和转跳分支的处理。
4.1.1 程序控制流和控制相关
4.1.2 分支造成的性能损失
条件分支造成的停顿开销可以划分为两个方面(都可能成为时间开销的关键路径):
1、条件判断引起的开销;
2、生成目标PC引起的开销;
分支目标地址生成方式不同:
PC相对寻址,一个周期开销
寄存器间接寻址,两个周期开销
带偏移的寄存器间接寻址,三个周期开销
条件码寄存器,分派阶段读取,两个时钟周期开销
通用寄存器比较,三个周期开销
条件判定的方式不同:
使用条件码寄存器,在分派段提取条件码,两个时钟开销
若ISA包含使用通用寄存器比较的结果来产生分支条件,三个时钟开销
我们要减少取指停顿或利用停顿周期进行有用的工作,当前主要采用分支预测技术。
4.1.3 分支预测技术
分支预测分为两部分:分支目标地址的预测、分支条件的预测
分支目标地址的推测,可通过设置分支目标缓冲BTB来实现(BTB中每个记录包含两个字段:BIA(分支指令地址)和BTA(分支目标地址)),用来保存前几次分支执行时的目标地址。
分支方向推测,方法1,设置取值硬件总是预测为不跳转。方法2,需要软件协同,对ISA进行修改。方法3,基于历史信息做分支预测。
实例:BTAC(分支目标地址缓冲)和BHT都是在取指段使用当前指令地址PC访问,但BTAC访问延迟是单周期的,而BHT是双周期的。如果BTAC命中说明当前的取指序列中存在分支指令,则预测分支将会跳转并更新PC。在第二个周期中(译码段),根据从BHT中得到的历史信息,将预测同一条分支指令的方向。如果两者预测相同,则不变,否则BTAC预测失效。
4.1.4 分支预测失败的恢复
动态分支预测可看做由两个相互影响的模块组成,前面的模块负责在流水线的前端推测分支方向和目标地址;后面的模块负责在流水线的后端验证推测的结果。
如果预测失败,需要执行:结束当前指令流并从一个新的、正确的地址取值。
4.1.5 先进的分支预测技术
动态分支预测技术局限性较大,其仅基于静态分支的历史信息,并未考虑分支执行的上下文。
实例:PAs:多个BHSR,多个PHT。s指share,因为PHT的个数无法使得每一个分支都有一个,因此一组分支共享一个PHT,所以称为s
4.1.6 其他指令流技术
条件分支:多分支预测技术
跳转分支:trace cache是一种基于历史信息的取指机制,它将指令的动态执行轨迹信息存储在一个cache中,通过指令地址和分支结果加以访问。轨迹信息是根据动态的分支指令行为收集起来的,包括多个不连续的基本块。每当指令地址命中trace cache,接下来的指令流就从trace cache中取指。trace cache可以看作是按程序先前的执行轨迹对其基本块进行了重排序,当不连续的基本块第一次在支配路径上执行时,结束提交段对其进行合并对齐处理,并生成一个trace存入trace cache中。
4.2 寄存器数据流技术
指ALU(寄存器-寄存器型)指令在处理器执行部件中的有效执行。
4.2.1 寄存器重用和假数据相关
寄存器的重用:
含义:特定ISA体系结构的寄存器数目有限,寄存器分配工具必须将无限的寄存器符号资源映射到有限的、固定的体系结构寄存器上,使得一个寄存器可以保存多个值。
缺点:会导致假数据相关、反相关和输出相关。
写寄存器称为寄存器的定义,读寄存器称作寄存器的使用。
寄存器分配工具一般都尽量把不重叠的活跃区间映射到同一个体系结构寄存器,以达到最大程度的重用。
顺序执行时,值与寄存器之间的一一对应关系得到了隐性保护
乱序执行时,该关系被打破,应当检测相关并消除之。
寄存器重用的动态形式是循环中指令重复执行导致的重用,应当消除相关。
可以通过终止相关指令来消除,会导致性能的急剧下降。
4.2.2 寄存器重命名技术
含义:为同一体系结构寄存器中的多个定义动态分配不同的名字。
一般方法:在体系结构寄存器文件(ARF)之外配置一个独立的重命名寄存器文件(RRF)(映射表技术);
使用单独的RRF重命名时,RRF的放置有两种选择:一种是同ARF一样的独立结构实现RRF,一种是RRF和再定序缓冲结合实现。
任务:读取源寄存器(译码段或分派段);分配目的寄存器(译码段或分派段);更新寄存器(流水线后端)。
独立的RRF和ARF,两者可以相互独立,也可以集合成一个寄存器文件实现。前者在指令完成之后仍然需要一次数据搬运,后者不需要。
集中寄存器文件:只需要将寄存器的名称从重命名寄存器改为体系结构寄存器即可。缺点在于提高了硬件复杂度,其次在现场切换要保存机器状态时,包含机器体系结构状态的寄存器子集必须在状态开始保存之前被显式地标出。
映射表技术是最有用,最全面的寄存器重命名技术,其特点:
1、不需要进行ARF和RRF内容的复制
2、在发生中断和现场切换时,必须根据映射表的内容及时确定出当前机器体系结构状态的物理寄存器。
4.2.3 数据相关和数据流极限
数据流极限:DFG的关键路径(相关边的延迟累加,总的累计延迟最长的相关链)
传统的数据流执行模型每条指令当其所有操作数就绪后马上开始执行,当前所有的寄存器数据流技术本质上都是为了逼近数据流极限。
4.2.4 经典的Tomasulo算法
Tomasulo算法在最初的FPU基础上加入了3种新的机制:保留站,公共数据总线和寄存器标签
Tomasulo算法通过寄存器重命名解决了反相关(WAR)和输出相关(WAW)。在实例中Tomasulo算法达到了数据流极限。
4.2.5 动态执行内核
超标量微处理器中嵌入了乱序的执行内核(动态执行内核),就像一个精简的Tomasulo算法,可以看做是一个嵌入式数据流引擎,使指令在执行时尽可能接近数据流极限。
一个动态执行内核的三个阶段:指令分派,指令执行和指令完成。
指令分派三个阶段:目标寄存器的重命名、保留站和再定序缓冲的分配、将指令从分派缓冲写入保留站。
(寄存器重命名消除寄存器重用引起的假相关;建立两条相关指令之间的生产者-消费者关系)
通常,必须具备空闲的重命名寄存器、空闲的保留站记录和空闲的再定序缓冲记录,指令才能分派。
指令执行三个阶段:就绪指令的发射、发射指令的执行、执行结果的定向。
(若某个时钟周期有多条指令就绪,则需要调度算法选择其中一条发射)
(这一段描述了指令的执行过程)
(一般情况下,保留站中的记录在指令发射后就进行回收并供后续指令分派使用,从而尽可能地避免由于保留站饱和导致的停顿。但是某些指令由于执行时会产生异常,将来某个周期可能要重新调度执行,所以这些保留站直到指令执行完毕且确定无异常后才进行回收)
如果有足够的资源消除结构相关带来的停顿,动态执行内核将可以达到数据流极限。
4.2.6 保留站和再定序缓冲
除了功能单元,动态执行内核的关键部件还包括保留站和再定序缓冲。
与保留站有关的操作有三个:分派、等待和发射。每个记录有“忙/闲位”和“就绪位”,每个操作数携带一个有效位。
分派指将指令从分派缓冲装载到保留站记录中:选择空闲的保留站记录、读出操作数或标签、设置该记录值为“忙”
指令唤醒:保留站中的某个记录通过监听总线,发现操作数可用,设置“就绪”位为1,表示该指令可以被发射执行,这个过程称为指令唤醒。
指令发射:也称指令选择,指从保留站中选择一条就绪指令往功能单元加以执行(依据就绪位判断)发射后其保留站指令就被回收。
保留站监听总线,匹配标签,执行指令唤醒的过程的硬件称为唤醒逻辑
保留站在所有的就绪指令中选择指令执行的硬件称为选择逻辑
再定序缓冲中保存的内容是所有已分派但尚未执行的指令。
每条指令的状态:等待执行状态,执行状态和执行完成状态,是否在推测路径上的状态,指令属于那个基本块的状态
再定序缓冲组织成一个循环队列并包含头指针和尾指针。
指令窗口:将保留站和再定序缓冲合为一体。指令窗口的大小决定了机器中可以有多少条指令在同时执行,决定了机器所能达到的指令级并行程度
4.2.7 动态指令调度器
动态指令调度器是动态执行内核的核心所在,包括指令窗口和相关的指令唤醒、选择逻辑。
当前动态指令调度器比较流行的两种设计方案:数据捕获和无数据捕获。
4.2.8 其他寄存器数据流技术
利用控制相关的分支预测技术提出了值预测和动态指令重用等解决数据相关的技术。
值预测:同一条静态load指令载入的值往往是可预测的,同时许多指令的计算结果也是可预测的。某些指令往往重复地计算出相同的一组(一个)结果,通过追踪这些指令的计算结果,未来的计算值可以根据历史信息进行预测
动态指令重用:同一指令序列在执行时往往使用相同的一组输入数据,因此机器经常进行重复的工作。总台指令重用技术试图追踪冗余计算,当探测到冗余计算时,先前的计算结果直接被使用而不进行计算操作。
4.3 存储器数据流技术
存储器指令负责在存储器和寄存器文件之间传递数据。
由于存储器指令的执行延时一般很长,load/store指令的处理和冗余存储器数据流变成了整个机器性能的瓶颈。
cache技术可以有效的降低延迟。
4.3.1 存储器访问指令
存储器数据流指令的执行步骤:生成存储器地址、存储器地址转换和数据访问。
4.3.2 存储器层次结构
访问多端口存储器的方法:通过地址索引查找、通过标签相联查找和通过组相联寄存器(即用索引又用相联查找)。
4.3.3 存储器访问的顺序
4.3.4 载入旁路和载入定向
两种乱序执行load指令的技术:载入旁路和载入定向。
载入旁路:当前载入地址和前导store指令不存在别名,即load和store之间不存在存储器数据相关时,将在后的load指令置于前导store指令之前执行
载入定向:当load和store存在别名,即存在RAW相关,则将store的数据直接传递给load指令,load不再访问存储器。
4.3.5 其他存储器数据流技术
增加存储器带宽:多端口数据cache(或者是交叉多体存储器)
降低存储器延时:使用cache、使用非阻塞cache和预取cache
load指令的预测:在取指段进行,无需译码和分派。预测表的每一项记录都包含预测的有效地址,在取指段就可以读出,不必再经过保留站等待基址寄存器的值和执行流水线的地址生成。此时对数据cache的访问再下一周期就可以开始,一般在译码段的末尾就能从cache读到数据。(载入地址预测技术)
载入值预测:对要载入的数据值进行预测,扩展载入预测表,增加载入的数据,从而实现载入值预测。
存储器相关性预测:在load/store指令执行时跟踪存储器相关信息,并在该load/store指令重新执行时利用这些信息对存储器相关性进行预测,以方便载入旁路和载入定向的提前执行