计算机体系结构中代码调度有哪些不同的级别?
代码调度用于覆盖依赖项检测和解析以及并行优化。代码调度通常与传统编译结合使用。代码调度器将一组或一系列可执行指令和一组对其强制执行的优先级约束(通常以 DAG 的形式)作为输入。作为输出,它在每个调度阶段都承担着交付一个无依赖项的指令的任务,并定义了调度管理精确可用执行时间的最佳选项。
**传统的非优化编译器**可以被视为包含两个主要部分。编译器的前端部分实现源字符串的扫描、解析和语义分析,并生成中间表示。这种中间形式通常由带属性的抽象语法树和符号表描述。反过来,后端部分创建目标代码。
**传统的优化编译器**通过删除冗余操作来加快顺序执行速度并减少所需的内存空间。顺序优化需要程序分析,包括前端部分的控制流、数据流和依赖项分析。
将传统编译和代码调度合并有两种不同的方法。第一种是将代码调度集成到编译过程中。在这种方法中,代码调度器利用编译器前端部分进行的程序分析的结果。
代码调度器通常在后端部分的寄存器分配和后续代码生成之前遵循传统的顺序优化器。这种类型的代码调度称为**预遍历调度**。另一种方法是辅助传统的(顺序)优化编译器并在之后执行代码调度,称为**后遍历调度**。
代码调度可以在三个不同的级别实现,例如基本块、循环和全局级别,如图所示。
相关的调度技术被称为基本块(或局部)、循环和全局技术。这些技术按列出的顺序提高性能。
**基本块调度**在这种情况下,调度和代码优化是为每个基本块独立完成的,一个接一个。
**循环级调度**下一级调度是循环级调度。因此,属于循环后续迭代的指令通常可以重叠,从而导致显着的加速。
人们普遍认为循环是并行性的重要来源,尤其是在数学程序中。因此,对于包括 VLIW 体系结构在内的高度并行 ILP 处理器,编译器必须至少在循环级别实现调度。因此,已经开发了大量用于在此级别进行调度的技术。
**全局调度**- 调度的最有效方法是在尽可能大的级别上使用全局调度技术来完成。因此,并行性是在基本块和简单循环之外以及在包含循环和条件控制结构的复合程序方法等结构中期望和获得的。