计算机体系结构基础知识介绍之编译器优化技术和寄存器分配技术

编译器优化技术

编译器优化技术是指编译器对程序进行的一系列转换,目的是使得编译后的代码更加高效、紧凑、正确和可移植。编译器优化技术可以根据转换的范围和方式分为以下几类:

  • 高级优化是在源代码层面进行的,输出会作为输入传递给后面的优化步骤。例如,常量折叠、常量传播、循环展开等。
  • 局部优化是在一段无分支的代码片段(基本块)内进行的。例如,局部公共子表达式消除、局部死代码消除、局部复写传播等。
  • 全局优化是跨越分支和循环的优化。例如,全局公共子表达式消除、全局死代码消除、全局复写传播、循环不变量外提等。
  • 寄存器分配是把程序变量分配到寄存器中,以减少内存访问的开销。例如,图着色算法、线性扫描算法等。
  • 依赖于处理器的优化是利用特定的架构知识进行的优化。例如,指令调度、指令选择、指令重排等。

寄存器分配技术

寄存器分配技术是把数据分配到寄存器中,而不是内存中,以减少内存访问的开销。寄存器分配技术是一个非常重要的优化技术,也会影响其他优化技术的效果。

寄存器分配技术今天主要基于一种叫做图着色的技术。图着色的基本思想是构造一个图来表示可能分配到寄存器的候选数据,并用图来分配寄存器。大致来说,问题是如何用有限的颜色(对应寄存器)给图中的节点(对应数据)着色,使得相邻的节点(对应有依赖关系的数据)不同色。这种方法强调要尽可能地把活跃的变量(在一段时间内会被使用的变量)都分配到寄存器中。图着色问题一般来说是一个很难解决的问题(NPhard),但是有一些启发式算法可以在实际中很好地工作,用近似线性的时间得到接近最优的分配结果。图着色方法在有至少16个(最好更多)通用寄存器和额外的浮点寄存器可供全局分配时效果最好。

寄存器分配技术是编译器优化技术中最为重要的一种,因为寄存器是CPU中速度最快的存储单元,合理地利用寄存器可以显著提高程序执行速度。寄存器分配技术的基本思想是构造一个冲突图来表示程序中可能分配到寄存器的变量,然后用图着色算法来给每个变量分配一个不同颜色(对应寄存器)的标记,使得相互冲突(同时活跃)的变量不分配同一个寄存器。

下面给出一个具体的例子来说明寄存器分配技术:

假设有以下四条指令:

  1. a = b + c
  2. d = a + e
  3. f = d + g
  4. h = f + i

假设有三个可用寄存器:R1, R2, R3

首先,我们需要构造冲突图,表示每个变量在哪些指令中被定义或使用,以及哪些变量之间有冲突(同时活跃)。

然后,我们需要用图着色算法来给每个节点分配一个颜色(对应寄存器)。图着色算法有多种实现方法,这里简单介绍一种贪心算法:

  • 从冲突图中选择一个度数(相邻节点数)小于可用颜色数(可用寄存器数)的节点,并将其从图中移除,并压入一个栈中。
  • 重复上一步直到冲突图为空。
  • 从栈中弹出一个节点,并给它分配一个与它的相邻节点不同的颜色(如果有多种选择,可以随机或按顺序选择)。
  • 重复上一步直到栈为空。

寄存器分配对于栈分配的对象来说更有效,而对于全局变量来说则不太有效,对于堆分配的对象来说几乎不可能,因为它们用指针进行访问。全局变量和一些栈变量无法分配,因为它们被别名所影响,使得把它们放入寄存器是非法的。

猜你喜欢

转载自blog.csdn.net/qq_52505851/article/details/131750519