多发射
流水线并行 - 指令级并行。
1 增加流水线级数,让更多的指令重叠执行,加深流水线后,由于有更多的操作可以重叠执行,指令间的并行度更高。同时时钟周期变短,主频变高,处理器性能也就更高。
2 另一种提高指令并行度的方法是增加流水线内部的功能部件数量,这样可以每周期发出多条指令。 这种技术称为多发射。 每周期发射多条指令,使得指令执行频率可以超过时钟频率。多发射技术也会有一些限制,例如哪些指令可以同时执行,如果发生冒险如何处理等。
多发射: 一个周期内可以发射多条指令的策略。
多发射处理器实现方法:区别在于编译器和硬件的不同分工。如果指令发射与否的判断在编译时完成。称为静态多发射。 如果指令发射与否的判断是在动态执行过程中由硬件完成,称为动态多发射。
在多发射流水线中需要处理的两个任务:
1 将指令打包并放入发射槽。 关于发射多少条指令,发射哪些指令。在大多数静态发射处理器中,编译器会完成这部分工作。动态发射器由硬件完成,编译器通过指令调度提高发射效率。
2 处理数据和控制冒险: 静态多发射中,编译器静态处理了部分或所有指令序列中存在的数据和控制冒险。 相应的,大多数动态发射处理器是在执行过程中使用硬件技术来解决部分或所有类型的冒险。
推测 -- 正确性检查机制 -- 预测出错后的恢复机制
推测是另一种非常重要的深度挖掘指令级并行的方法。以预测思想为基础,推测方法允许编译器或处理器来猜测指令的行为。并允许其他与被推测指令相关的指令提前开始执行。例如可以对分支指令结果进行推测,这样分支指令之后的指令可以提早执行。
再例如,先store再load的指令序列,可以推测两条指令的访存地址不同,这样允许load先于store执行。 推测的难点在于预测结果可能出现错误。推测机制都必须包括预测结果正确性的检查机制。 以及预测出错后的恢复机制。
编译时,执行时硬件。 完成推测。
静态多发射
编译器来支持指令打包和处理指令间的冒险。对于静态多发射处理器,可以将同一周期发射出去的指令集看成一条需要进行多种操作的大指令。
编译器通过软件,或者执行过程通过硬件来处理 冒险的解决。
在简单五级流水线中,load指令由一个周期的使用延迟,如果下一条指令需要使用load指令的结果,那么它必须停顿一个周期。同样在双发射五级流水线结构中,load也存在一个周期的延迟,而这时需要停顿后续两条指令ALU和load/store指令的执行。 双发射流水线中,需要同时发射ALU和load/store指令,如果这两条指令存在数据冒险,则store或load不能被发射。
循环展开 -- 挖掘指令并行性,解决反相关。
专门针对循环体提高程序性能的重要编译技术,将循环体展开多遍,从不同的循环中寻找可以重叠执行的指令来挖掘更多的指令级并行性。
循环展开过程中,采用额外的寄存器,寄存器重命名,来消除指令序列中的反相关。除了真数据相关,消除指令间存在的其他数据相关,这些数据相关将会导致潜在的冒险,或者妨碍编译器进行灵活的代码调度。
不同循环的指令之间没有数据依赖,这种情况称为反相关,或名字相关。
反相关:也称为名字相关。由于名字复用被迫导致的顺序排列,并不是一种指令间真实的数据相关。
在循环展开时对寄存器进行重命名,可以允许编译器移动不同循环中的指令。重命名可以消除名字相关,但不能消除真相关。
动态多发射处理器
由硬件判断当前周期发射的指令数,编译器进行指令调度,消除指令间的相关,提高指令的发射率。
许多超标量处理器扩展了动态发射逻辑的基础框架,形成了动态流水线调度技术。动态流水线调度技术由硬件逻辑选择当前周期内执行的指令,并尽量避免流水线的冒险和停顿。
动态流水线调度: 对指令执行顺序进行重排的硬件技术。
动态调度流水线 代替编译器来进行指令调度,解决数据相关
由硬件选择后续执行的指令,流水线被分为取指和发射单元,多功能部件。以及提交单元。
取指和发射单元 负责取指,译码,将指令发送到相应功能单元上执行。提交单元保存了已经完成指令的执行结果。和静态调度流水线中的前递一样,重排序缓冲也可以用来为其他指令提供操作数。