【问题标题】:Is There a Way of Providing asm.js or WebAssembly Code to V8 Turbofan?有没有办法向 V8 Turbofan 提供 asm.js 或 WebAssembly 代码?
【发布时间】:2016-03-16 17:34:24
【问题描述】:

在查看了最近宣布的对 WebAssembly 的支持后,我突然想到,如果有一些方法可以显着提高它的实用性:

  1. 让 TurboFan,the V8 JIT Crankshaft optimizer 的继任者输出它生成的所有汇编代码以及静态类型签名,以及生成的代码的执行配置文件。

  2. 允许程序员为覆盖优化器的特定静态类型签名提供自己的 asm.js/WebAssembly 代码。

有没有办法做到这一点?

有一些迹象表明它可能来自this article的以下段落:

在底层,V8 中的 WebAssembly 实现旨在 重用大部分现有的 JavaScript 虚拟机基础架构, 特别是 TurboFan 编译器。一个专门的 WebAssembly 解码器 通过检查类型、局部变量索引、函数来验证模块 引用、返回值和控制流结构在一个单一的 经过。解码器生成一个 TurboFan 图,由 各种优化通过,最后变成机器码 为优化的 JavaScript 生成机器代码的同一后端 和 asm.js。在接下来的几个月里,团队将专注于 通过编译器改进 V8 实现的启动时间 调整、并行性和编译策略改进。

为更广泛的受众扩展这个想法:

典型的自上而下的优化涉及高级编程,然后执行分析以确定哪些代码需要更多的努力。无论优化是自动代码生成还是优化代码的手动编码,都是如此。在动态类型语言的情况下,您经常希望超越优化动态类型算法并提供专门用于特定静态类型的代码。事实上,这就是 V8 JIT 优化器自动执行的操作。如果人们想手动提供一些特别“热门”的专门案例,他们需要以某种方式通知自动优化器他们已经完成了工作,以便自动优化器可以合并手动优化的代码,而不是自动生成次优代码。

【问题讨论】:

  • 你能澄清一下你的意思吗?这听起来更像是 V8 团队的功能请求,而不是 SO 问题,但我不确定请求是什么 :-)
  • 这是对 V8 团队的功能请求,如果该功能在 V8 中尚不可用。所以我的问题是这个功能是否已经存在——它似乎应该存在。我不确定如何更清楚我所说的。我使用的技术术语定义明确。您对其中的哪一个有疑问? node --v8-options 呈现了一个令人眼花缭乱的数组。

标签: v8 asm.js webassembly


【解决方案1】:

不,这是不可能的,而且它永远不可能,因为它可能需要突破系统内的各种抽象障碍。复杂性将是巨大的,并且对可维护性和安全性的影响可能会很严重。

WebAssembly 模块的 Web 界面(通过 Wasm 对象)提供了一种简洁的方式来连接 JS 和 Wasm。将来,ES6 模块可能会进一步简化互操作。像你提议的那样复杂的机制比这有什么优势还不清楚。

【讨论】:

  • 显然有必要施加限制以保持抽象边界。如果这些限制最终在各个方法的编码和/或执行时间上花费了大量开销,那么就没有优势了。我寻求的主要优势是通常使用高级源作为事实上的规范(以及不受支持的环境的执行回退),以在低级语言中按需(由执行时分析确定)人工优化。与先验架构相比,这具有经验驱动的低级编码的优势。
  • @user3673,唯一合适的这种“限制”是我们现在拥有的。 ;) 您的用例仍然涵盖:您可以将快速路径逐步放入 Wasm 模块中就好了。您只需通过导出接口调用它们,没有捷径。如果您担心调用开销:Turbofan 应该能够内联。
【解决方案2】:

对于 1. 您可以使用以下标志:

  • trace_turbo:跟踪生成的 TurboFan IR
  • trace_turbo_graph:跟踪生成的 TurboFan 图
  • trace_turbo_cfg_file:将 turbo cfg 图(用于 C1 可视化工具)跟踪到给定文件名
  • trace_turbo_types: 追踪 TurboFan 的类型
  • trace_turbo_scheduler: 跟踪 TurboFan 的调度器
  • trace_turbo_reduction: 追踪 TurboFan 的各种减速器
  • trace_turbo_jt: 追踪 TurboFan 的跳转线程
  • trace_turbo_ceq: 追踪 TurboFan 的控制等价性
  • turbo_stats: 打印 TurboFan 统计数据

它们可能会在未来的 V8 版本中发生变化,并且不是稳定的 API。

TurboFan 相当复杂,因为它使用来自基线 JIT/解释器的信息,并且可能在 deopt 后获取该信息。编译器并不总是从 JS / wasm 到汇编的直接管道。内联和其他一些事情会影响发生的事情。

对于2.:首先编写wasm代码或有效的asm.js。

我们已经讨论了执行一系列不同类型的动态跟踪、缓存跟踪(并允许注入跟踪以进行测试),但考虑到已经有一种方法可以为编译器提供精确类型,这可能不是我们要公开的内容信息!

【讨论】:

    猜你喜欢
    • 2020-02-24
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    相关资源
    最近更新 更多