3.2 实现ILP的基本编译技巧
3.2 实现ILP的基本编译技巧
指令调度和循环展开
为了尽可能避免流水线的停滞,可以寻找指令间的依赖关系并重叠不相关指令序列。
循环展开可以减少分支指令次数,使用不同的寄存器来避免不必要的约束,更多的指令也可以更方便进行指令调度。但是需要调整循环终止和迭代代码。
所有这些转换背后的关键需求是理解一条指令如何依赖于另一条指令,以及如何根据依赖关系更改或重新排序指令。三种不同的效果限制了循环展开的收益
-
每次展开时平摊的开销减少
-
代码大小限制:对于较大的循环,指令数的增多会导致cache miss增加,过度展开也会导致寄存器不足;
-
编译器限制