论文部分内容阅读
编译器内部各种优化的不同组合及其参数的不同设定构成了一个巨大的优化空间。编译器的预设优化级别(如GCC的-0s、-01、-02、-03等)不过是该空间中的几个点,而且性能通常并非最优。迭代编译通过对此优化空间进行自动搜索,试图找到比预设优化级别在性能或是代码大小等指标上效果更好的优化组合。过去十多年的相关研究表明,迭代编译技术能够有效的发掘编译器的优化潜力对程序进行调优,但也仍留有一些未能回答或解决的问题。如迭代编译的数据集敏感性问题,以及因优化开销过大而导致应用范围受限等问题。本文针对这些问题开展研究,取得了以下成果:迭代编译的数据集敏感性问题:此前的迭代编译研究大都基于单一或少量的数据集,回避了迭代编译的数据集敏感性问题:即在少量数据集上通过迭代编译找到的优化组合在其它数据集上的表现如何?本文首次对这个涉及到迭代编译实用性的基本问题进行了研究。为此,我们为32个Cbench基准测试程序各收集了1000个数据集(共32,000个程序一数据集对),并基于两种主流编译器(GNU GCC和Intel ICC,各300个优化组合)花费机时612天在每个程序一数据集对上进行了迭代编译实验,共得到19,200,000个数据点。实验结果表明,使用1个数据集找到的优化组合能以至少91.6%的概率在其它数据集上表现出性能提升,且平均提升幅度至少能够达到最优值的98.7%。换句话说,大多数情况下,迭代编译的优化效果基本上可以说是数据集不敏感的,即使用少量数据集进行迭代编译所找到的优化组合能在其它数据集上表现出接近最优的性能。
面向数据中心的迭代优化策略:迭代编译需要多次编译和运行程序,开销较大,过去多用于能够在大量设备上分摊其开销的嵌入式应用场景中。本文根据迭代编译的特点和对应用趋势的分析,提出了面向数据中心的在线迭代优化策略,扩展了迭代编译的应用范围。策略的核心是一种在运行时自适应地管理迭代编译的收益和开销的方法,能够在提升程序性能的同时降低系统的总体计算资源消耗。我们充分利用数据中心环境的特点,将策略集成到数据中心的软件基础设施中,实现了迭代编译各个环节的自动化,使其能够作为一项基本的性能优化服务提供给运行在数据中心中的应用程序。我们给出了该策略在数据中心常见的MapReduce运行时和任务调度器上的实现。我们花费550天机时,利用11个程序和总共10.7TB的数据集,在不重复使用数据集的条件下,对两个原型系统进行了测试,分别获得1.48和1.14的平均加速比。实验结果不但证明了我们提出的在线迭代编译优化技术的有效性,也为前述迭代编译数据集敏感性问题的结论提供了进一步的证据。
迭代编译优化机制的深入分析:本文还对迭代编译找到的高性能优化组合进行了深入分析。我们发现大部分的性能提升都能归因于对一小组关键优化的调整。基于这一观察,我们提出一种简单易行的确定搜索过程中初始优化组合的方法。使用这种方法,在仅仅尝试一个优化组合后,迭代编译就能在一组程序上获得1.1的平均加速比。通过对三个案例的详细分析,我们还发现,迭代编译对这些关键优化进行调整获得性能提升的机制往往是复杂甚至违反直觉的。这表明,迭代编译能找到一些传统编译优化和人工调优难以发现的优化机会,有其存在的必要性和不可替代性。