LLVM MISched 指令调度程序使用处理器功能单元、管道和延迟的声明性 TableGen 描述。想象一下,试图从这些声明中确定与英特尔优化参考手册中的编码指南等效的情况。
从广义上讲,静态调度 OOO 处理器的目标/技术是什么?对于OOO处理器,它什么时候会在B之前调度指令A,什么时候在B之后调度A?
超标量处理器一次可以执行多条指令。有序处理器将只考虑原始顺序中的指令。乱序(OOO)处理器可以乱序执行指令,然后按顺序提交结果。推测对于这个问题并不重要,但我认为这些处理器是流水线的。想想 A53(有序)和 Haswell(OOO)。
OOO 处理器接下来将执行哪条指令是处理器在运行时做出的调度决策。所以这通常被称为动态调度。顺序处理器执行哪条指令是由编译器在编译程序时决定的。因此,这通常称为静态调度。
然而,编译器也静态地定位/调度 OOO 处理器。在有序和 OOO 情况下,编译器可以查看大窗口的指令;编译器必须处理寄存器压力;在这两种情况下,编译器都希望使功能单元保持忙碌。OOO 处理器通常还可以重命名寄存器,从而减少寄存器压力。
鉴于 OOO 处理器动态调度指令,提前编译器应该做些什么来帮助这一点?