V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iqoo
V2EX  ›  程序员

可以让 clang/llvm 编译 WebAssembly 不使用 64bit 吗?

  •  
  •   iqoo · 2023-06-05 17:10:00 +08:00 · 1076 次点击
    这是一个创建于 522 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前 asm.js 时代用 emscripten 编译了一些网页程序。最近更新下算法,编译时发现 emscripten 居然不再支持 asm.js 了,只能生成 WebAssembly 。由于之前一直支持 IE10+,因此还是希望使用 asm.js 版本。

    虽然使用 -s WASM=0 选项还是可以生成 js 版本,但发现内部是先生成 wasm 文件,然后再用 wasm2js 转成 JS 代码。

    由于 wasm 默认是 64bit 的,因此很多数字运算、指针都按 64bit 处理,即使 32bit 足够用。

    这导致最终转出来的 JS 里有大量的 __wasm_i64_mul 、__wasm_i64_xxx 等 32bit 模拟 64bit 的代码,不仅不美观,还严重影响了计算效率。这些代码之前都是没有的。

    打算将 emscripten 退回到支持 asm.js 的版本(fastcomp backend),但发现居然装不上了,而且那个版本好几年前就不再维护了。

    尝试在编译时加上 -m32 等参数,但都没效果。wasm 只能使用 64bit 的架构?

    7 条回复    2023-06-19 15:26:23 +08:00
    tool2d
        1
    tool2d  
       2023-06-05 17:22:21 +08:00
    要不就用以前的老编译器,要不就放弃 ie10 算了。

    wasm 的代码转译成 js 运行,还是挺影响运行效率的。
    pursuer
        2
    pursuer  
       2023-06-05 17:58:42 +08:00
    "由于 wasm 默认是 64bit 的,因此很多数字运算、指针都按 64bit 处理,即使 32bit 足够用。"

    就我了解到的情况,wasm 的 64 位内存模型 Memory64 还未进入标准,emscripten 也需要指定 -sMEMORY64 才会启用。
    iqoo
        3
    iqoo  
    OP
       2023-06-05 18:45:23 +08:00
    @pursuer Memory64 是内存寻址扩展到 64 位,可以用 4G 以上的内存。寄存器一直都是 64 位的,这也是 wasm 比 asm.js 性能高的一个特点。
    pursuer
        4
    pursuer  
       2023-06-06 14:00:07 +08:00
    @iqoo WASM 里没有寄存器的概念,如果是说局部变量我有个快速排序编译出来用的 i32 的变量长度,是不是源码里用了 long 类型了
    iqoo
        5
    iqoo  
    OP
       2023-06-07 11:20:14 +08:00
    @pursuer 循环里的指针被优化成了 64 。目前通过修改源码的方式暂时解决了。
    agagega
        6
    agagega  
       2023-06-10 23:32:40 +08:00
    试试-target wasm32-unknown-emscripten ?
    iqoo
        7
    iqoo  
    OP
       2023-06-19 15:26:23 +08:00
    @agagega 之前也发现这个配置,不过加上后 emcc 提示报错。网上搜到的 wasm32-unknown-emscripten 都是 rust 里的配置。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   972 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:53 · PVG 03:53 · LAX 11:53 · JFK 14:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.