什么是全局调度?
ILP 编译器必须提取可接受的指令级并行性,才能正确利用可用的硬件资源,特别是 EU。对于极度并行的 ILP 处理器(包括 VLIW 机或高度超标量处理器)来说,这不是一项简单的任务。具体来说,通用程序(包括操作系统或应用程序程序),其基本块大小很小,并行性极不规则,使用不可预测的分支进行表征,这使得这项任务极其困难,甚至无法解决。
在这种方法中,无法预测基本块调度器能否提取足够的并行性来准确地馈送高度并行的 ILP 处理器。因此,针对并行性贪婪的 ILP 处理器的编译器必须使用非常有效的调度技术,即全局调度。
全局调度器在基本块边界之外,甚至在后续循环迭代中起作用,以提取尽可能多的并行性。全局调度完全是一项困难的任务。首先,有两个基本任务需要处理:跨基本块调度单个指令和调度循环,如下面的图所示。
超越基本块调度
基本块调度器仅在基本块范围内提取并行性。相反,全局调度器试图感知控制流图中尽可能多的独立指令,并在图中尽可能地向上移动它们,甚至超出基本块边界,以尽可能地在每个周期保持多个 EU 工作。将指令向上移动的困难限制是正确的数据依赖性,因为错误的数据依赖性可以通过寄存器重命名来消除。
通常,全局调度器不满足于仅通过在基本块边界之前甚至之后移动独立指令而实现的并行性程度。此外,全局调度器通常会尝试猜测未解决的条件语句的结果。因此,沿着猜测路径的指令也将被视为代码移动的后继者。
大多数全局调度器将分两个阶段调度单个指令,这与列表调度器的工作方式相同。首先,全局调度器必须为每个周期选择一组可接受的调度指令,遵循选定的启发式方法。
其次,需要进一步的启发式方法从合格指令集中进行选择。调度决策还可以包含代码移动,代码移动仅限于条件分支的其中一条路径,称为**推测性**。此名称强调了以下情况:这些代码移动是在以下假设下进行的:条件分支遵循代码移动的方向,因此,向上移动的指令的执行将是有益的。
循环调度
循环是 ILP 处理器并行性的重要来源。因此,控制结构的一致性可以加快计算速度。有两种基本方法可以调度循环:循环展开和软件流水线。第一种方法是一种简单、效率较低的方法,与第二种方法相比。在当前的使用方面,循环展开通常用作更复杂的调度方法(包括软件流水线或跟踪调度)的一部分。