指令级并行:指指令之间存在的一种并行性,利用它,计算机可以并行执行两条或两条以上的指令。(ILP:Instruction-Level Parallelism)
开发ILP的途径有两种:
本章研究:如何利用各种技术来开发更多的指令级并行(硬件的方法)
到目前为止我们所使用流水线的最大的局限性:指令是按序流出和按序执行的
//考虑下面一段代码:
DIV.D F4,F0,F2
ADD.D F10,F4,F6
SUB.D F12,F6,F14
//ADD.D指令与DIV.D指令关于F4相关,导致流水线停顿。
//SUB.D指令与流水线中的任何指令都没有关系,但也因此受阻。
为了使上述指令序列中的SUB.D指令能继续执行下去,必须把指令流出的工作拆分为两步:
修改后的流水线是乱序执行的
每条指令的执行过程分为4段(主要考虑浮点操作)
(记分牌主要用于浮点部件才有意义,因为其他部件的操作延迟都很小)
在Tomasulo算法中,寄存器换名是通过保留站和流出逻辑来共同完成的。
使用Tomasulo算法的流水线需3段:
所开发的ILP越多,控制相关的制约就越大,分支预测就要有更高的准确度。
本节中介绍的方法对于每个时钟周期流出多条指令(若为n条,就称为n流出)的处理机来说非常重要。
动态分支预测:在程序运行时,根据分支指令过去的表现来预测其将来的行为。
分支预测的有效性取决于:
采用动态分支预测技术的目的
需要解决的关键问题:
在预测错误时,要作废已经预取和分析的指令,恢复现场,并从另一条分支路径重新取指令。
分支历史表BHT(Branch History Table)
目标:将分支的开销降为0
方法:分支目标缓冲
采用BTB后,在流水线各个阶段所进行的相关操作:
在分支目标缓冲器中增设一个至少是两位的“分支历史表”字段
更进一步,在表中对于每条分支指令都存放若干条分支目标处的指令,就形成了分支目标指令缓冲器。
前瞻执行(speculation)的基本思想:对分支指令的结果进行猜测,并假设这个猜测总是对的,然后按这个猜测结果继续取、流出和执行后续的指令。
只是执行指令的结果不是写回到寄存器或存储器,而是写入一个称为**再定序缓冲器ROB(ReOrder Buffer)**中。
等到相应的指令得到“确认”(commit)(即确实是应该执行的)之后,才将结果写入寄存器或存储器。
把Tomasulo算法的写结果和指令完成加以区分,分成两个不同的段:
实现前瞻的关键思想:
允许指令乱序执行,但必须顺序确认。
在指令被确认之前,不允许它进行不可恢复的操作。
Tomasulo算法中保留站的换名功能是由ROB来完成的。
(在Tomasulo算法的基础上改造的)
前瞻执行
在每个时钟周期内流出多条指令,CPI<1。
单流出和多流出处理机执行指令的时空图对比
超标量处理机与VLIW处理机相比有两个优点:
超标量结构对程序员是透明的,处理机能自己检测下一条指令能否流出,不需要由编译器或专门的变换程序对程序中的指令进行重新排列;
即使是没有经过编译器针对超标量结构进行调度优化的代码或是旧的编译器生成的代码也可以运行,当然运行的效果不会很好。
举例:一个4-流出的静态调度超标量处理机
假设:每个时钟周期流出两条指令:
1 条 整 数 型 指 令 + 1 条 浮 点 操 作 指 令 1条整数型指令+1条浮点操作指令 1条整数型指令+1条浮点操作指令
其中:把load指令、store指令、分支指令归类为整数型指令。
存在的问题:
将每个流水段进一步细分,这样在一个时钟周期内能够分时流出多条指令。这种处理机称为超流水线处理机。
对于一台每个时钟周期能流出n条指令的超流水线计算机来说,这n条指令不是同时流出的,而是每隔1/n个时钟周期流出一条指令。
在有的资料上,把指令流水线级数为8或8以上的流水线处理机称为超流水线处理机。