Compiler construction 静态调度OOO处理器

Compiler construction 静态调度OOO处理器,compiler-construction,llvm,compiler-optimization,llvm-codegen,Compiler Construction,Llvm,Compiler Optimization,Llvm Codegen,LLVM混合指令调度程序使用处理器功能单元、管道和延迟的声明性TableGen描述。想象一下,试图从这些声明中确定英特尔优化参考手册中的编码准则的等价物 广义而言,静态调度OOO处理器的目标/技术是什么?对于OOO处理器,它何时将指令A安排在B之前,何时将指令A安排在B之后 超标量处理器一次可以执行多条指令。按序处理器只考虑指令的原始顺序。无序(OOO)处理器可以无序执行指令,然后按顺序提交结果。对于这个问题,猜测并不重要,但我假设这些处理器是流水线的。考虑A53(按顺序)和Haswell(OO

LLVM混合指令调度程序使用处理器功能单元、管道和延迟的声明性TableGen描述。想象一下,试图从这些声明中确定英特尔优化参考手册中的编码准则的等价物

广义而言,静态调度OOO处理器的目标/技术是什么?对于OOO处理器,它何时将指令A安排在B之前,何时将指令A安排在B之后

超标量处理器一次可以执行多条指令。按序处理器只考虑指令的原始顺序。无序(OOO)处理器可以无序执行指令,然后按顺序提交结果。对于这个问题,猜测并不重要,但我假设这些处理器是流水线的。考虑A53(按顺序)和Haswell(OOO)

OOO处理器接下来将执行的指令是处理器在运行时做出的调度决策。所以这通常被称为动态调度。处理器执行的指令顺序由编译器在编译程序时决定。因此,这通常称为静态调度

然而,编译器也静态地以OOO处理器为目标/调度OOO处理器。在顺序和OOO两种情况下,编译器都可以查看一个大的指令窗口;编译器必须处理寄存器压力;在这两种情况下,编译器都希望让功能单元保持忙碌。OOO处理器通常还可以重命名寄存器,从而降低寄存器压力


假设OOO处理器动态调度指令,那么提前编译器应该做些什么来帮助实现这一点?

您通常是正确的,但编译时调度仍然可以略微提高执行速度。之所以会出现这种情况,是因为编译器可以以更优化的方式重新排列指令,以加快解码速度(只有当序列满足某些约束条件时,x86的旧版本才能并行解码多条指令),或者将它们更紧密地打包在处理器的指令缓冲区中。引用Robert Morgan的“构建优化编译器”:


实际上,胜利通常很小(很少)。

您通常是正确的,但编译时调度仍然可以稍微提高执行速度。之所以会出现这种情况,是因为编译器可以以更优化的方式重新排列指令,以加快解码速度(只有当序列满足某些约束条件时,x86的旧版本才能并行解码多条指令),或者将它们更紧密地打包在处理器的指令缓冲区中。引用Robert Morgan的“构建优化编译器”:


在实践中,胜利通常很小(只有几个百分点)。

这实际上不是一个调度决策本身,而是一个优化。基本上,通过查看LLVM的AddilOpts()为OOO超标量后端添加的过程,可以很好地了解可能的情况。早期的if转换是生成并行运行的代码,避免必须串行运行的代码

LLVM具有OOO超标量的早期转换过程。它被PowerPC、X86、AMDGPU、SystemZ和AARC64后端使用。EarlyIfConverter并行计算两个表达式,并插入一个select以选择一个:TII->insertSelect(…)


此过程由后端添加到AddilOpts()中。它是使用ILP并行评估两个备选方案,而不是有条件地先评估一个再评估另一个。

这实际上不是一个调度决策本身,而是一个优化。基本上,通过查看LLVM的AddilOpts()为OOO超标量后端添加的过程,可以很好地了解可能的情况。早期的if转换是生成并行运行的代码,避免必须串行运行的代码

LLVM具有OOO超标量的早期转换过程。它被PowerPC、X86、AMDGPU、SystemZ和AARC64后端使用。EarlyIfConverter并行计算两个表达式,并插入一个select以选择一个:TII->insertSelect(…)

此过程由后端添加到AddilOpts()中。它是使用ILP并行评估两个备选方案,而不是先有条件地评估一个然后再评估另一个

The compiler should schedule the insns as if the processor were
not an out-of-order execution processor.  The more effective this
schedule is, the larger the size of the effective insns buffer.
 // Early if-conversion is for out-of-order CPUs that don't have a lot of
 // predicable instructions. The goal is to eliminate conditional branches that
 // may mispredict.
 //
 // Instructions from both sides of the branch are executed speculatively, and a
 // cmov instruction selects the result.