反馈指导预取的运行时引擎
本文中提出了一种动态指导预取的运行时引擎,创新点主要包括:第一,我们提出了一种动态预取检测机制,该机制除了可以检测循环内预取机会和循环间预取机会,还可以检测跨函数的预取机会。就目前而言,本文的预取检测机制首次在动态运行环境中完整地检测所有预取机会;第二,为了降低运行时开销,通过程序分析,如果有多个访存地址访问的对象是相同的,那么我们只对其中一处进行插桩以降低插桩带来的开销;另一方面,对于无效的插桩,我们将在运行过程中实现动态取消;第三,将上面两种技术进行整合,称为运行时预取引擎,并将之实现在一个产品级的Java虚拟机中,最终利用两个工业界中广泛采用的测试程序对引擎的有效性进行验证。
该引擎的设计可以分成两部分,一部分是插桩器,实现在即时编译器中,另一部分是预取控制器,作为一个单独的部件进行设计。插桩器在即时编译器对程序进行编译的时候完成插桩,插桩用来收集访存对象的信息。在程序的运行过程中,访问对象的信息被写入到Trace缓冲区中,Trace缓冲区大小固定,并且其底部的内存页面被设置成不可写,当缓冲区被写满时,便会发出一个段错误信号,虚拟机截获该信号并对缓冲区中的数据进行分析,如果检测到相关对象访问,预取控制器便会插入相应的预取指令。运行时引擎设计的关键在于预取准确性和运行时开销之间的权衡。为了保证预取的准确性,我们对程序进行插桩;为了降低运行时的开销,我们避免冗余的插桩、控制预取指令的插入并且实现无效的插桩删除优化,与此同时,步长检测的机制非常灵巧,因为我们只收集区间[-64,64]中的步长。
总的来说,该引擎有两个显著的优点:一方面,它可以检测到任何代码中(规则的或者不规则的)的所有步长模式,而不像以前的方法仅仅局限于循环中或者函数内,实验表明跨函数的步长模式占所有模式的30%以上;另一方面,该引擎的开销非常低,最多不超过4%,平均为3.2%。最后我们在Harmony VM中实现了该引擎,并用两个著名的测试程序集SpecJVM98和Dacapo对其进行验证,实验结果表明在Intel Pentinum 4平台上,它可以获得平均6.2%的性能提升,这充分说明该引擎对于改善程序的访存性能起到重要的作用,也为Harmony虚拟机平
台的建设做出一定的贡献。spring framework组件
接下来的研究中,我们希望将对象重排技术和预取优化相结合,预取优化针对的是时间局部性,而对象重排技术改善的是空间局部性,两者的结合能够更好地提高应用程序的性能。另外,我们将利用硬件性能分析器来帮助收集访问对象信息,这样可以进一步地降低软件收集信息带来的开销,充分展示预取优化带来的改进。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。