Emscripten:我如何编译带有像 immintrin.h 这样的内在头文件的 c 文件?

Posted

技术标签:

【中文标题】Emscripten:我如何编译带有像 immintrin.h 这样的内在头文件的 c 文件?【英文标题】:Emscripten: how can i compile a c file with an intrinsic header like immintrin.h? 【发布时间】:2021-04-01 16:09:45 【问题描述】:

我正在尝试使用 emscripten(C 到 WASM)编译 CLBG 基准。然而,它们中的大多数都包含了内部标题(如 ),这给了我很多错误(让我们以 nbody.c 为例),如下所示:

nbody.c:137:20: error: use of undeclared identifier '__m128d' static alignas(__m128d) double

我已经尝试使用这些标志进行编译

emcc nbody.c -o nbody.js -O2 -s WASM=1 -msse2 -msimd128

然后编译。但是,当我尝试使用 nodejs 运行 nbody.js 时,它不起作用。我也试过用

运行nodejs

--experimental-wasm-simd

就像git 告诉的那样,但它也不起作用。它说:

failed to asynchronously prepare wasm: CompileError: WebAssembly.instantiate(): Compiling function #4:"main" failed: invalid value type 'Simd128', enable with --experimental-wasm-simd @+422CompileError: WebAssembly.instantiate(): Compiling function #4:"main" failed: invalid value type 'Simd128', enable with --experimental-wasm-simd @+422RuntimeError: abort(CompileError: WebAssembly.instantiate(): Compiling function #4:"main" failed: invalid value type 'Simd128', enable with --experimental-wasm-simd @+422).Build with -s ASSERTIONS=1 for more info.

谁能帮帮我?我不明白这是否已经可以做到。

【问题讨论】:

我怀疑您将不得不重写代码。内在函数本质上是特定于特定 CPU 架构的,因为它们调用特定的 CPU 指令,而 WASM 实际上是与 x86 完全不同的架构。您链接的代码似乎提供了一组单独的内在函数,因此您必须重写 x86 代码以改用 WASM 数据类型和内在函数。如果您尝试移植代码以在 ARM 上运行,这与您必须做的事情相同。 SIMD Everywhere 可能是相关的,具体取决于所使用的特定内在函数。 看来你做的一切都是对的,但无论是使用旧的 Emscripten 还是旧的 Node.js - SIMD 规范正在开发中,所以任何版本不匹配都会导致这些操作码错误。尝试将 Emscripten 和 Node.js 都更新到最新版本,看看效果如何。 @RReverser,我已全部更新,但仍然无法正常工作。我宁愿不要在这个问题上浪费更多时间,而是寻找其他不使用内在的基准。谢谢大家的时间。 "invalid simd opcode" 肯定表示旧的工具链或旧的 Node.js - 这是因为 SIMD 提议在几个月前发生了变化,并且一些操作码的编码方式不同。如果你尝试最新的 Emscripten (2.0.16) 和最新的 Node.js (16.0.0),我保证你不会看到这个错误。 【参考方案1】:

将这些编译标志添加到 C 和 CXX 标志

-fPIC -Wno-implicit-function-declaration -msse2 -msimd128 -experimental-wasm-simd

【讨论】:

以上是关于Emscripten:我如何编译带有像 immintrin.h 这样的内在头文件的 c 文件?的主要内容,如果未能解决你的问题,请参考以下文章

Emscripten 无法编译着色器

如何在 React 中使用 Emscripten JavaScript 文件

如何在只有画布的情况下摆脱 emscripten 徽标和控制台?

如何通过 Emscripten 激活抗锯齿

如何使用库导入编译 C 文件到 webassembly 文件(Emscripten)

如何使用 Emscripten-1.38.31 (??) 编译 Boost-1.76.0