将ffmpeg中的x86 asm和inline-asm编译成WebAssembly的问题

Posted

技术标签:

【中文标题】将ffmpeg中的x86 asm和inline-asm编译成WebAssembly的问题【英文标题】:Problems in compiling x86 asm and inline-asm in ffmpeg to WebAssembly 【发布时间】:2019-02-18 17:03:27 【问题描述】:

抱歉,我是 WebAssembly(wasm) 的新手,正在开发一个项目,使用 ffmpeg 和 wasm 在浏览器上解码视频以提高性能。

我已经使用 Emscripten(emcc) 将 ffmpeg 编译为 wasm 并完成了工作。但是,由于 Emscripten 无法编译内联汇编代码,因此在 web 上使用 wasm 进行视频解码几乎比不支持 asm 的本地解码慢 3-5 倍,并且 cpu 使用率可能非常高。

据我所知,wasm 是一个基于堆栈的虚拟机,而 asm 是特定于 cpu 的,但是没有 asm,wasm 与实现本机速度的目标相差甚远。经过一天对 wasm 和 asm 等基本概念的搜索。我知道一些编译器,如 nasm 来执行 cross-platform asm,是否有一些编译器前端有 llvmir和 asm 指令一起,以便在 wasm 中具有 inline-asm 和 asm-supported

【问题讨论】:

NASM 只是跨平台的,因为它可以在潜在的许多不同平台上运行,而不是它生成可以在 x86 CPU 以外的任何平台上运行的机器代码。 WebAbbsembly 不会提供为目标平台(例如 x86)生成任意机器代码的方法,因为这会破坏它的目的,即成为类似于 Java 虚拟机的“安全”虚拟机环境。 【参考方案1】:

为了补充 szatmary 的答案,实际上没有办法将 x86 代码转换为 wasm 字节码。因此,以 wasm 为目标的 C 编译器只是忽略了内联 asm 指令(无论是 x86、ARM 等)。

我想这在理论上是可能的,但我怀疑有人会这样做。恕我直言,用例真的很薄。人们正在编写内联 x86 以尝试优化性能瓶颈,但这是以可移植性为代价的。可移植性是 Wasm 的主要目标之一......

您的性能受到影响并不是因为缺乏 x86 支持。只是因为 wasm 是字节码,它永远不会像原生代码那样快。也许 JIT 可以在这方面有所帮助,但不要抱太大期望。

【讨论】:

【参考方案2】:

不,不使用 C 或其他高级语言作为中介,就没有 x86 到 wasm 编译器。

【讨论】:

抱歉问题标题有误会,我实际上是在 C 中编译 x86 inline asm,关于 inline-asm 有什么想法吗?非常感谢! @Sparkmorry:C + x86 inline asm 仅在它可以编译为 x86 asm 时才有效,而不是像 WASM 这样的其他目标。

以上是关于将ffmpeg中的x86 asm和inline-asm编译成WebAssembly的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何将 x86 和 x64 asm 文件包含到单个 Visual Studio 项目中?

x86 ASM 中的简单 Hello World - Windows 控制台

asm x86中的变量声明顺序?

如何在x86 ASM中原子地移动64位值?

x86 asm 指令集:任何 _searchable_ 离线参考?

x86 ASM - cpuid 是不是设置标志?