论文摘要
二进制翻译(Binary Translation)是指在没有二进制文件的源代码的情况下,将一个平台的二进制程序翻译到另外一个平台上运行的方法。动态二进制翻译就在翻译的同时并且执行代码。而动态二进制翻译器可以做很多优化和探测,所以动态二进制翻译为解决代码遗留,代码移植以及构建分布式虚拟计算环境等问题提供了一个良好的解决方法,因此在近年来得到了越来越广泛的关注和研究。本文主要研究在动态二进制翻译中研究程序的后端代码在内存布局上跟程序的特性(超级块,跳转等方面)之间的关系,以及对程序的性能的影响。有效地收集运行时的profiling信息,利用这些信息对程序进行优化,以及检测内存布局是如何影响程序超级块的质量以及其他特性的,研究内容主要包括:利用profiling对热路径进行识别与监测,利用动静结合框架对内存布局进行重组,以及在动态执行中的代码复制(Code Replication)对超级块生成质量进行优化,并通过实验数据分析上述方法对系统所带来的特性变化。Profiling是指对程序运行时信息的统计和收集。传统的动态二进制翻译器采用的profiling方法分为三种:基于基本块、基于跳转边、基于路径。不同的方法有不同的特性,基于基本块的方法实现复杂度最低,但是收集的信息是最少的,而基于路径的方法实现的复杂度最高,但是收集的信息却是最多的。热路径是指程序中频繁执行的代码块序列。热路径需要通过一定的预测算法来识别。动态二进制翻译器通常采用基本块或边的执行信息来预测热路径。本文在CrossBit平台上利用基于基本块的执行信息预测热路径的方法来预测热路径,并基于此算法得出的热路径进行分析。超级块是指将热路径上的基本块合并成具有单一入口和多个出口的指令序列。热路径的构造实际操作来说就是超级块的构造。超级块可以减少因基本块的结束而带来的上下文切换,也可以给代码优化带来更广阔的优化空间。程序在运行过程中从超级块内部跳出的概率越小意味着超级块的性能越好。所以超级块的长度越长越好,而数量越少越好。代码复制是超级块的构造过程中利用复制共享基本块以生成质量更好的超级块的方法。它可以很好的提高超级块的质量和数量等指标。动静结合的动态二进制翻译器是指运行完程序一次记录下来程序的运行信息,然后离线的对内存布局进行整理优化,再重新加载到内存中运行优化后的代码。这样可以充分利用profiling信息进行离线的优化,在重新加载阶段获取性能的大幅提升。本文中的动静结合框架是首先利用边的profiling信息来检测热路径,并执行完程序然后按照热度在内存空间上对程序超级块进行重排,再重新加载到内存中运行。本文在CrossBit平台上利用代码复制和对超级块内存中按热度重排来改变程序的内存布局,并通过SPEC CPU2000基准测试程序对超级块生成质量以及程序行为特性进行测试。实验数据表明,CrossBit生成的超级块质量有不同程度的提高,而相应的整体性能有所提高。从而证明合理的内存布局对程序的优化提升。