论文部分内容阅读
指令调度依据机器资源特征和程序属性,通过调整指令的执行次序来提高指令级并行度,是一种重要的编译优化技术。一般地,指令调度考虑的机器资源主要是计算部件。本论文在指令调度中增加考虑了寄存器资源和访存相关的硬件资源的使用情况,提出了一组方法来减少寄存器溢出以及提高存储级并行,从而有效地提高程序的性能。本文的主要贡献如下:
1.提出了结合考虑溢出代价的寄存器压力模型。编译优化中考虑寄存器压力时,般以指令的或者活跃变量的数量来作评估,而不考虑不同变量的溢出代价对性能的影响。本文在考虑寄存器压力时,将变量溢出代价的影响视为重要因素,并提出了两种溢出代价的估算方法,以函数的平均频度估算该函数内变量溢出带来的溢出代价,或者通过具体分析预测将被溢出的变量并以它的溢出代价作为估算的溢出代价。将结合考虑溢出代价的寄存器压力模型,应用到编译优化中,能更好地控制寄存器压力过大时的溢出对程序性能的影响,改善程序性能。
2.考虑到不同变量的溢出代价及其对程序性能的影响差异很大,我们将上述考虑寄存器溢出代价的寄存器压力模型应用在全局指令调度中,提出了两种寄存器压力敏感的指令调度算法:
(1)频度信息指导的方法,以函数的平均频度估算函数内变量的溢出代价,并反映在给基本块设定的压力限值的大小上。在调度过程中,只有指令的调度不会导致指令沿途经过的基本块的寄存器需求超过寄存器压力限值时,才被允许。
(2)基于收益代价分析的方法,在寄存器压力的分析中根据压力情况预测溢出变量及溢出代价。在调度过程中,会具体地分析一次指令调度带来的性能收益和可能的溢出代价,只有收益不小于溢出代价的指令调度才被允许。
从实验结果来看,在全局指令调度上,基于收益代价分析的方法比编译器原有的策略提高2.60%,频度方法则提高2.12%,两者的平均性能都比前人的IPS方法提高了1%左右。
3.提出了一种MLP敏感的循环展开策略。面对长延迟的访存指令,利用传统的ILP优化发掘访存与计算之间的并行度是不足够的,应考虑提高存储级并行度。本文将循环体内访存操作的数据缓存缺失信息作为求取循环展开因子的重要因素来考虑,从而尽量发掘循环的存储级并行度。实验分别在显式并行的安腾2机器和乱序执行的龙芯2E机器上进行,在安腾2机器上的实验,Art和Galgel高达19%,平均性能提高了4.36%;在龙芯2E机器上平均性能提高了0.54%,并分析了在两种机器上性能的差异和原因。实验所获得的良好的性能提升也表明在循环展开中考虑Cache行为和存储级并行是很有意义的。