论文部分内容阅读
处理器和内存之间的性能差距正变得越来越大,使内存成为整个计算机系统的性能瓶颈之一。提高数据局部性可以有效地利用处理器高速缓存,是缓解内存和处理器性能差距的有效手段。很多程序在运行时从堆中分配大量数据,这些数据的布局优化对程序性能有很大影响,但是这些技术现在仍处于研究阶段,没有在常用编译器中得到广泛应用。动态优化是在运行时对二进制程序进行的优化,它不需要程序的源代码和重新编译,可以在大量的遗产代码和商用软件上直接使用,扩展了优化技术的应用范围。但是由于缺乏源代码等高层信息,如何进行安全和高效的动态优化是具有重要理论意义和实用价值的研究课题。
本文针对堆数据的动态优化技术进行了研究,提出了动态池分配和动态结构体拆分两种优化手段,分别改善了堆中对象之间和对象内部的数据布局,提高了程序的性能。
本文的主要贡献如下:
·提出了使用变长调用链来表达调用点上下文的方法。这种方法可以识别包装函数并在需要的时候增长调用链,在不同程序之间和同一程序内的各个调用点之间具有自适应性,避免了无关对象被分配到同一个内存池的问题。与现有的基于调用点的策略相比,该方法可以减少3%到6%的平均运行时间,最高可达82%。
·提出基于亲缘性的对象组合并的池分配策略。本文提出了两种亲缘性概念,并利用存储形状图上的亲缘性识别,合并具有亲缘性的对象组。这种方法解决了由于算法设计或编译器优化把这些对象分散到不同调用点,导致它们分散到不同的内存池里的问题。采用该合并策略的动态池分配技术能够进一步减少一些程序的运行时间。
·提出一种在运行时进行结构体拆分优化及保证优化安全性的方法。通过对动态结构体拆分的安全性问题的研究,本文提出了使用页保护机制和动态地址检查的方法来保证优化的安全性,也为静态编译器的同类激进优化提供了一种解决途径。本文的方法对一些程序的加速比高达128%。
·提出了动态结构体拆分后降低代码运行开销的几种方法。本文通过代码提升的方法,大大降低了数组中的结构体在拆分后的顺序访问开销。对内存池里的结构体,本文提出了对齐池分配和地址比对的方法,降低了访问这些结构体的操作强度。这些方法进一步提高了动态结构体拆分优化后的程序性能。
·基于上述研究成果,本文设计实现了动态堆数据布局优化原型系统DigitalBridgedopt。该系统直接对应用程序进行优化,自动选择符合要求的堆对象进行动态池分配和动态结构体拆分优化。在该系统中的实验验证了上述方法的有效性。