利用JavaScript并行编译器 开发数据并行HTML5应用外文翻译资料

 2022-10-26 10:23:17

英语原文共 25 页,剩余内容已隐藏,支付完成后下载完整资料


利用JavaScript并行编译器

开发数据并行HTML5应用

YEOUL NA and SEON WOOK KIM, Korea University
YOUNGSUN HAN, Kyungil University

摘 要

随着HTML5标准的出现,JavaScript被越来越多地用于处理计算大量密集的并行数据。尽管JavaScript性能的提高一直被反复强调,JavaScript和PC端应用程序之间的性能差距仍然很大。迫于此原因,尽管现在的移动设备配备强大的并行数据处理的硬件平台,如多核处理器和GPGPUs。

传统的JavaScript编译器很少利用并行的方式处理数据,甚至在数据并行的JavaScript应用程序里也是如此。本文我们提出了一种自动化的JavaScript并行编译器,即利用传统的静态编译器的成熟仿射回路分析,数据并行的HTML5应用程序。我们确信并行的JavaScript进行传统的静态分析时,最关键的问题在于确保正确的并行化,最大限度地减少编译开销,当并行执行过程中出现错误时进行低成本的数据恢复。对此我们提出了一个机制,基于编译技术和幂等的属性安全地低成本地处理执行错误。实验表明此JavaScript并行编译器能够检测到大部分仿射并行循环。此外,我们实现了四核系统上的3.22倍最大加速,从而针对并行的HTML5应用程序进行成本几乎可以忽略的编译和数据恢复的。

CCS概念:理论计算→并行计算模型;软件和软件工程→即时编译器;脚本语言;

关键词:JavaScript,JIT ,javascriptcore,循环并行化,JavaScript引擎,javascript编译器,HTML5

ACM参考格式:Yeoul Na, Seon Wook Kim, and Youngsun Han. 2015.JavaScript parallelizing compiler for exploiting parallelism from data-parallel HTML5 applications. ACM Trans. Archit. Code Optim. 12, 4, Article 64 (December

2015), 25 pages.

DOI: http://dx.doi.org/10.1145/2846098

第1节 介绍

JavaScript[Flanagan 2006]是一种动态脚本语言,由网景通信公司开发的Mocha演变而来。JavaScript被主要用于web页面的动态事件的处理,特别是由用户或系统环境创建的特定事件的交互[Richards et al. 2010a; Ratanaworabhan et al. 2010]。

过去,作为轻量级脚本语言,相比JavaScript的单线程的性能,其并行性通常并不那么重要。然而,这个趋势随着HTML5[Hickson and Hyatt 2011]标准的提出发生了改变。作为最新版的html标准,HTML5通过引入新的特性如JavaScript API[Anttonen et al.2011]将web浏览器转换为通用的应用平台。结合了WebGL[Marrin 2011] 以及HTML5,JavaScript被迅速应用于新的计算领域如2 d和3 d图形,地理位置等新的计算领域和互动媒体内容等传统的领域。这些新功能支持大型的有丰富的并行性(Herhut et al . 2013年)的web应用程序,包括游戏引擎,物理模拟及浏览器视频处理等。换句话说,JavaScript被越来越多的应用于庞大的并行性的数据处理。然而,由于其彻底的单线程环境带来的功能问题,很多程序仍不能通过JavaScript使用这些新功能。虽然其单线程性能在“浏览器战争”之后已经明显改善,相比潜在受益于并行计算密集计算和并行数据处理,JavaScript的性能仍然落后。因此,提供并行执行的JavaScript应用程序现在已经成为一个紧迫的问题。

现代移动设备中包含丰富的并行硬件平台,如多核处理器和GPGPUs[Qualcomm Inc. 2015]。因此,许多方法利用并行性开发使现有的本地和动态语言的应用成为可能,并通过并行硬件平台显著提高其性能[Campanoni et al. 2014; Beletska et al. 2011;Bikshandi et al. 2006; Campanoni et al. 2012]。然而,目前JavaScript很难利用丰富的并行硬件资源,因为它的动态语言特性,JavaScript应用程序的并行编译器允许许多错误行为并且令底层并行数据变得更加复杂。

曾经也有一些研究项目,致力于研究并行性的JavaScript应用程序。Mehrara等于2011年提出了一种基于线程级别的动态并行JavaScript引擎。这个JavaScript引擎在一个多核系统上成功地利用循环级的并行性提高了JavaScript的性能。然而,这种方法的潜在缺点是,运行时受制于大量的检查和恢复数据以及支持可处理大量数据的新兴HTML5应用程序的必要费用。值得注意的是,通过非推测性的并行循环和编译器的分析有很大可能减小这种投机开销[Ooi et al. 2001]。因此,我们可以采用传统静态编译器的相关性分析并行处理JavaScript应用程序。通过这种基于静态编译的方法,我们可以消除运行时的相关性检查和减少不必要的推测错误。同时,反复检查带来的大量开销将被轻量级的利用幂等性的开发机制代替[Kim et al. 2006]。尽管前面的JavaScript并行化方案采用基于推测的方法避免运行时的编译开销[Mehrara et al. 2011],然而我们的想法是,如果一个应用程序长期运行或反复出现足够多次,它的执行时间将补偿额外的编译开销,编译开销将变得微不足道,这是JIT编译技术的一般性原则。

在本文中,我们提出一个新的JavaScript并行编译器,能够基于LLVM静态循环分析和生成并行代码,自动检测DOALL并行循环,生成多线程JIT代码,并在多核cpu上执行这段代码。目前,这是一种与过去截然不同的利用静态编译器分析,并生成并行低级媒介执行JavaScript函数的JavaScript编译器。我们的环境是基于JavaScriptCore的四线LLVM JIT(FTL JIT)[Pizlo 2014]产生LLVM IR和并行代码,并利用循环分析和基于LLVM生成的并行静态代码[Kotha et al. 2013]。

我们的并行化的目标是现实的和密集计算型方式的可能受益于并行执行的并行数据HTML5应用程序。V8[Richards et al. 2010b],SunSpider[Stachowiak 2007],和Octane [Cazzulani 2012]等当代测评套件并不代表真正的web应用程序(Ratanaworabhan et al . 2010年),Alexa的网页列表[Alexa 2015]也并不包含密集计算。所以,我们通过River Trail [Herhut et al. 2013] 套件替代以上套件来评估现在新兴的数据并行HTML5应用程序,取自一种广泛使用的图像处理库--Pixastic[Seidelin 2014],[Porcides et al. 2011; Mehrara et al. 2011; Bartsch et al. 2014; Cho et al. 2014]。

我们建议JavaScript通过并行性的测算程序和库自动并行化,在四核平台上最大可达3.22倍的速度。

本文的主要贡献如下:
--我们详细说明了并行与传统的JavaScript静态编译器技术出现的问题并提出了可行的解决方案

--我们提出了一个想法利用并行循环执行的编译器技术和的性质幂等性来自由和安全管理一个测算错误。

--我们提出了系统在同一级别的本地应用程序自动检测并行循环,实验数据显示了这项技术真正改进了HTML5应用程序的性能。

本文的其余部分组织如下。第二节讨论了并行JavaScript与静态编译技术的问题。第三节提出了JavaScript并行编译器,解决了上述问题。第四节描述了我们的安全的和轻量级的测算恢复机制。第五节给出了研究在JavaScriptCore实施的一个案例。第六节介绍了实验结果,第七节描述了相关工作。最后,我们在第八节得出结论。

第二节 并行JAVASCRIPT中的挑战

在本节中,我们讨论了并行JavaScript使用静态编译器分析时遇到的问题。

安全的并行化和执行。JavaScript是一种连续的编程语言。因此,JavaScript引擎以串行的方式管理其执行环境以至于忽略并行执行的JavaScript可能违反程序语义。这个困难当前的JavaScript引擎缺乏并行性的支持[Google Inc. 2012; Mozilla Developer Network 2015; Apple Inc. 2015]。然而,这项研究的根本原因是,如果并发执行多个线程没有数据关系违规,线程级并行的应用程序是可以实现的[Kennedy and Allen 2002],这在JavaScript中也没有例外。我们提出的JavaScript并行编译器是为了避免数据阻塞的情况,保护数据序列的一致性的精心设计的多线程JavaScript程序(3.1节)。

依赖分析。在本文中,我们目标是不通过跨迭代的方式而是通过DOALL循环完成并行循环。为了证明一个顺序循环自动以并行DOALL方式执行,首先应该解决的是数据循环依赖关系。大多数数据并行应用程序下的并行循环会操纵下标数组,并行化应保证所有的数组元素访问的迭代是彼此独立的[Wolf and Lam 1991; Banerjee 1988]。为此我们在动态JavaScript编译器上了采用这项静态的并行化技术。但是,JavaScript的固有性质--动态类型和解释性语言,使得编译器分析其依赖关系变得更加复杂。首先,从JavaScript JIT编译过程中分析从IR中生成的代码的数据依赖关系是有问题的,因为JavaScript对象是通过JavaScript引擎动态管理的,引擎管理对象的方式是指针对指针的,这在编译时会阻碍内存消歧。为了访问对象的属性,引擎首先加载对象的地址,然后从这个已被加载的对象地址中读取地址。这个生成指针访问的过程,必须克服的一个障碍就是检测到最基本的并行循环。我们提出的编译器基于现实情况通过每个对象操纵其独有的属性克服了这一问题,(3.1节)。同样,JavaScript的动态特性阻碍了数组对数据循环并行化必要的依赖性分析。像其他对象类型一样,操纵数组类型的数据是在运行时就确定的。因此,JavaScript引擎应该自动推测哪些内存操作是数组访问并测算出数组信息转发给一个最优的编译器。当前的JavaScript引擎根据推测哪些操作访问了数组来分析数据。然而,JavaScript引擎编译器还不会利用这些数组信息进行优化。我们建议系统通过这些数组信息来优化编译器,以便它可以更容易地执行一个数组分析(3.1节)。

费用开销。尽管并行化技术提高了程序的性能,他们仍需要相当大的开销。这笔费用主要是并行化技术带来的并行化分析费用及测算恢复费用。由于JavaScript是一种解释语言,它的总执行时间包括编译时间,应被计入编译开销。鉴于这种情况,可以通过使用TLS方法最小化编译开销。然而,TLS方法运行时依赖检查错误由此产生开销[Mehrara et al. 2009; Raman et al. 2010],包含密集计算的大数据在新兴HTML5应用程序大量涌现的情况下变得更加关键。原因是TLS不是可伸缩的大量的线程,它需要数据同步和通信,运行时需要检查每一步迭代。减少细致的检查可以缓解这个问题,但数据恢复将会有额外的开销。 Kim et al. [2012]提出一个可伸缩的TLS-based集群解决方案;然而,他们的数据显示,这只是略微增加了误算率,即0.04%,加剧了TLS性能的可伸缩性。不幸的是,自从JavaScript编译器采用了JIT测算技术,JavaScript执行已包括固有误差,这意味着现有的可伸缩的TLS解决方案不适合JavaScript运行环境。此外,Mehrara et al. [2009]实验数据表明,在没有静态指针分析最小化运行时的依赖检查,TLS的开销可以远低于单独的顺序执行时的开销。因此,我们采用传统的静态编译器的并行循环分析并增加编译开销。这种基于编译器的方法使得运行时少去了很多不必要的依赖性检查。同时,我们可以消除由于运行时依赖性错误产生的测算反馈[Ooi et al. 2001]。正如前面提到的,编译开销可能是个问题,但现在,JavaScript引擎,包括我们提出的编译器,采用多层策略和一个并发JIT编译技术减少编译开销(3节)。

与此同时,由于当JavaScript编译器并行运行时需要对其他测算进行优化,当我们采用一种基于编译器的方法时,我们仍然需要支持的测算反馈时[Koo and Toueg 1986]。由于测算恢复,大量新兴的需要处理大量数据的HTML5应用程序开始出现。相反,我们提出的编译器利用幂等性的性质将恢复开销降到最低(3.3节)。

第三节 JAVASCRIPT并行编译器

我们提出的系统采用多层和并发JIT编译技术减少编译开销,如图1所示。JavaScript引擎利用多层策略,改善启动延迟和优化质量。由于JavaScript只执行代码几

剩余内容已隐藏,支付完成后下载完整资料


资料编号:[153879],资料为PDF文档或Word文档,PDF文档可免费转换为Word

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。