论文部分内容阅读
针对循环进行优化一直是编译器优化方法中性能提升的主要来源之一,软件流水技术就是其中一个比较著名和成熟的循环指令调度技术。软件流水技术的主要思想是将多个连续的迭代持续交叠地执行,直到所有迭代执行完毕。其过程包括构建数据依赖图、计算最小初始化间隔、模调度、循环寄存器文件分配和代码生成五个步骤。它可以充分挖掘指令级并行性(Instruction LevelParallelism),从而充分利用硬件资源,提高循环执行效率。
Open64编译器是由SGI(Silicon Graphics)开发的一款开源可重定向编译器,它包含面向x86、MIPS、IA64等多种体系结构的后端,软件流水是其一种重要的优化方法。对于IA64体系结构的安腾处理器,Open64编译器后端就包含了这项技术。由于x86体系结构缺乏循环寄存器文件、断言执行等硬件特征,目前最新的Open64编译器5.0版本中,面向x86体系结构的后端并不包含软件流水技术的实现。
本文的主要工作就是为Open64编译器面向x86体系结构的后端添加软件流水方法。首先,筛选出不利于软件流水的循环,对于过小的循环和非规则循环(如包含if语句的for循环和while循环),直接将其循环展开优化或交给Open64编译器后端进行EBO(Extended Block Optimizer)优化。然后,对其他的循环进行预处理,主要包括消除假依赖简化数据依赖图、代码移动减少循环体代码等工作,使得循环体更适合做软件流水优化。最后,再进行软件流水过程,本文补充的工作主要包括:对于循环寄存器文件的缺乏,重写了寄存器分配算法达到使用通用寄存器的目的,并添加了模变量扩展模块来保证执行的正确性;对于寄存器的匮乏,利用x86体系结构的多个64位寄存器和它的乱序执行机制,为软件流水添加寄存器溢出模块;对于断言执行机制的缺乏,利用x86体系结构的静态分支预测算法并重写了代码生成算法,使之能够产生面向x86体系结构的多尾声流水代码。整个软件流水方法实现以后,在GSL(GNU ScientificLibrary)测试用例上,实验结果反映出平均获得了9%的性能提升。