Mozilla 正在 SpiderMonkey 中测试 JavaScript 并行计算

  • 谢丽

2015 年 3 月 5 日

话题:JavaScriptMozilla语言 & 开发架构

Mozilla 正致力于实现 JavaScript“并行(parallelism)计算”,以便充分利用硬件性能。Dave Herman 是 Mozilla Research 的首席研究员和策略总监。近日,他在一篇博文中提到,他们正在其 JavaScript 引擎 SpiderMonkey 中进行相关实验。

他们试图通过一种底层的、渐进的方法为 JavaScript 添加更加灵活和强大的并行计算原语。他首先指出:

我正在谈论的不是“并发(concurrency)”……JavaScript 的异步并发模型很受欢迎,也取得了成功,而且promisesES6 generators和即将到来的async/await正使它变得越来越好。

这里要探讨的是可以释放设备(GPU、SIMD 指令及多内核处理器)潜能的并行计算。Web Workers已经在多核并行计算方面做了一些工作,但其工作线程是完全隔离的,只能通过postMessage进行通信。

还有一种方案比较激进,就是像Nashorn那样将 JavaScript 变成一种完全多线程的数据模型。不过,那需要宿主 Java 程序小心地同步脚本,否则,JavaScript 应用程序无法得到“运行至完成(run-to-completion)”的保证。而且,这个过程会伴随大量的标准化和实现工作,进而会带来生态系统方面的风险。

另一方面,Mozilla Research 和 Intel Labs 这些年来也在确定性并行计算 API(有人称为River TrailPJS)方面做了一些实验。但他们选择了一种很困难的方法,因为很难找到一种足够通用的高级模型能够适合各式各样的并行程序。

于是,他们引入了 SharedArrayBuffer 类型。不同于 PJS,它内置的锁定机制为工作线程带来了新的锁定形式,但同样地,部分对象也可能因此遭受数据争用。不过,与 Nashorn 不同的是,这种情况只会出现在选择使用共享内存作为后台存储的对象中。如果创建了一个不使用共享缓冲区的对象,那么可以确定,它永远不会出现数据争用。Dave 表示,这是一种相对保守的方法,但应该能够满足许多应用场景的需求。实际上,几年前就有人探讨过这种方法。在去年的JSConf大会上,谷歌 PNaCI 团队的 Nick Bray 还演示了一个在 Chrome 中共享缓冲区的原型

目前,Dave 及其团队正在 SpiderMonkey 中测试 SharedArrayBuffer API,并且正在草拟它的规范Firefox 每日构建版本中已经提供了原型实现,感兴趣的读者可以下载试用并提供反馈。


感谢郭蕾对本文的审校。

给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

JavaScriptMozilla语言 & 开发架构