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: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 @+422
CompileError: WebAssembly.instantiate(): Compiling function #4:"main" failed: invalid value type 'Simd128', enable with --experimental-wasm-simd @+422
RuntimeError: 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 文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 React 中使用 Emscripten JavaScript 文件
如何在只有画布的情况下摆脱 emscripten 徽标和控制台?