浏览器运行 NumPy 速度提升 64 倍

Faster NumPy in the Browser

浏览器运行 NumPy 速度提升 64 倍

长期以来,在浏览器中运行 NumPy 受限于缺乏加速的 BLAS,矩阵运算只能依赖低效的纯循环。这一局面已被 Emscripten-forge 打破,其通过 WebAssembly 链接了 OpenBLAS,使 np.matmul 在 float32 下速度提升约 30 倍。随着 OpenBLAS 0.3.35 的推出及 Relaxed SIMD 的引入,端到端性能更是实现了 64 倍的飞跃。这一突破不仅依赖于 Flang 编译器对 wasm32 的支持,更得益于 conda 生态在 WebAssembly 上的重构,让 SciPy、R 等科学计算工具也能在浏览器中高效运行。

运行 NumPy 意味着在没有加速 BLAS 的情况下运行它,矩阵乘法回退到普通的循环,这已经改变了。
  1. sharktheone

    看到这个真的很酷。WASM 终于有了 SIMD,真是太让人高兴了。

  2. miohtama

    到了这一步,用 AI 重写像 BLAS 这样的遗留 Fortran 包,难道不比努力让 Fortran 继续活下去更容易吗?

  3. wangxiaoxiang55

    动态链接的细节是我觉得最有趣的部分。在 PyPI 上,NumPy 的 wheel 包捆绑了一个 BLAS 快照,所以一旦 BLAS 有了改进,就得等下一个 NumPy 版本发布。而在这里,OpenBLAS 是一个独立的 conda 包,因此 JupyterLite / notebook.link 环境只需添加一个 channel 就能获取 0.3.35 版本,其他什么都不用改。这正是将 wasm32 视为 conda 平台而非 wheel 目标所带来的实实在在的好处。

    问作者一个问题:附录 F 显示 0.3.35 版本在 GEMM 上的性能大约是单线程 linux-64 的 0.4-0.5 倍。剩下的性能差距中,你们认为有多少是归因于 wasm 代码生成,又有多少是缺失线程导致的?pthread 版本有任何路线图吗?很多 JupyterLite 部署都是静态托管(如 GitHub Pages 等),无法设置 SharedArrayBuffer 所需的 COOP/COEP 头,所以我猜单线程模式在很长一段时间内都会是默认选项。

同日更多故事

2026-09-20