指令调度的方法是什么?
当指令并行处理时,需要检测和解决指令之间的依赖关系。它通常可以讨论依赖关系检测和解决,因为它与处理器类别和独立包含的处理功能相关联。
如果指令需要先前发出的指令可以利用的硬件资源,则该指令在资源上依赖于发出的指令。例如,如果只有一个单一的非流水线除法单元可用,就像 ILP 处理器中通常一样,那么在代码序列中,第二个除法指令在资源上依赖于第一个指令,并且不能并行执行。
资源依赖关系是由多个资源(包括 EU、总线或缓冲区)生成的约束。它们可以降低可以在执行的多个阶段(包括指令解码、发出、重命名和执行等)管理的并行度。
指令调度的方案
有两种基本方法:静态和动态。**静态检测**和解决由编译器完成,它通过重新排序代码来防止依赖关系。因此,编译器的输出被重新排序成无依赖关系的代码。VLIW 处理器始终期望无依赖关系的代码,而流水线和超标量处理器通常不会。
相反,**动态检测**和解决依赖关系是由处理器实现的。如果必须在与指令发出相关的上下文中识别依赖关系,则处理器通常维护两个滑动窗口。
发出窗口包含所有已获取的指令,这些指令已预先确定将在下一个周期发出,而正在执行且结果尚未生成的指令则保留在实现窗口中。在每个周期中,将测试发出窗口中的所有指令的数据、控制和资源依赖关系,以了解执行指令。
动态检测的优点
它允许处理在编译时未知的某些依赖关系情况。
它简化了编译器的工作。
它使针对一个流水线编译的代码能够有效地运行在多个流水线上。
通过并行代码优化可以自动提高 ILP 处理器的执行速度。如果依赖关系由编译器静态地遇到和解决,那么编译器肯定需要改进才能实现并行代码优化。
如果依赖关系检测和解决是动态的,则代码优化必须由编译器在与目标代码生成相关的上下文中预先执行。并行优化比传统的顺序代码优化更进一步。它通过对适合并行执行的代码进行适当的代码转换来重新排序指令序列。
在并行代码优化促进的静态调度中,编译器在代码生成期间检测信息、控制和解决信息、控制和资源依赖关系是其独有的功能。此外,编译器还实现并行代码优化。也就是说,编译器为并行 ILP 执行生成无依赖关系的优化代码。