论文部分内容阅读
随着计算机体系结构的不断发展,新的处理器会在旧处理器的基础上增加新功能或使用新的处理器体系结构来提高处理器性能。这些新的体系结构特征为应用程序提供了更多的优化机会,然而旧体系结构上设计的软件并不能利用新体系结构中一些新添加的硬件资源(比如,更多的寄存器)来加速程序执行。虽然应用程序可以通过重编译的方法来利用这些新的体系结构特征,但实际情况是在新体系结构出现后的一段时间内,在新体系结构上运行的大量应用程序仍是遗产代码程序(旧体系结构上编译生成的可执行程序)。另外,虽然现在静态编译优化技术的功能越来越强大,但是静态优化方法不能准确地把握程序的动态执行行为,使得许多优化技术要采取保守的优化策略。在静态编译生成的二进制代码中仍存在大量的优化机会。
本文的主要研究内容是动态访存优化系统中低开销的程序执行行为获取和基于平台差异的动态优化技术。在动态优化系统中,我们首先在程序执行过程中利用低开销的运行时信息收集方法来获取动态执行信息,然后在对动态信息进行分析的基础上,结合遗产代码和目标体系结构平台的各自特点,选择相应的动态优化技术对程序进行优化。在对程序动态执行行为深入分析的基础上,我们提出了两种动态优化技术,分别是基于异常处理的非对齐访存优化技术和动态栈变量寄存器提升技术。
本文的主要贡献包括:
提出了一种低开销的、易用的、动态自适应的在运行时获取函数调用路径的方法(DACCE)。该方法能够有效地获取多线程程序和单线程程序的运行时函数调用路径,可以动态处理程序中的间接调用,并且可以根据程序动态行为自适应地调整函数调用路径编码。另外,该方法不需要额外的程序分析或静态剖析信息来辅助编码,提高了方法的易用性。而且,它是以共享库的形式实现的,可以被非常方便的集成到其它工具中。基于SPECCPU2006,Parsec2.1和Cilk程序的实验数据表明,DACCE不仅可以准确地获取所有测试用例的运行时函数调用路径信息,而且它的运行时开销也非常小(2.4%左右)。
提出了两种新的非对齐访存优化方法,包括基于异常处理机制的优化方法和持续剖析(continuousprofiling)方法。基于异常处理机制的非对齐访存信息收集方法是一种可以持续监控程序非对齐访存行为的轻量方法。持续剖析方法可以持续收集程序执行过程中的非对齐访存信息,从而可以得到程序在不同输入数据下的非对齐访存信息,使程序可以受益于之前执行过程中收集的非对齐访存信息。另外,我们对程序中的非对齐访存指令的动态访存行为进行了深入分析,并提出了一种基于多版本代码的非对齐访存指令处理方法。实验结果表明,与已有方法相比我们提出的非对齐访存优化方法可以更好地适应程序执行行为的变化。对一些测试用例,我们的方法可以取得10%以上的性能提升。
提出了一种基于页保护和栈切换机制的运行时内存别名检测方法。我们利用已有的页保护机制和基于虚存页和物理页之间别名映射方法的栈切换机制,来动态识别程序中潜在的内存别名,保证优化后代码正确执行。我们的运行时别名检测方法不需要专门的硬件支持,因此适用范围更广,可移植性更好。这个方法可以应用于动态指令调度等比较激进的猜测优化中。
提出了一种关键路径优先的栈变量寄存器提升方法。在对程序动态执行行为深入分析后,我们发现程序中数据依赖关系比较紧密的代码中的指令延迟很难被处理器中的乱序执行掩盖掉。因此,在考虑对栈变量读操作的数量,访问栈变量指令所在的循环嵌套层次等因素的同时,我们还提出了一种优先提升关键路径中栈变量的待提升栈变量选择方法。另外,我们在Intel64机器上实现了一个动态二进制翻译和优化系统,这个系统可以将IA-32代码中的栈变量提升到Intel64上多提供的寄存器中。对一些IA-32程序,最大性能提升可达45%。