NumPy en el navegador deja de arrastrarse: OpenBLAS llega a WebAssembly
El paquete de NumPy en Emscripten-forge enlaza OpenBLAS en WebAssembly y un matmul de n = 1024 pasa de 0,90 a 28,0 GFLOPS en float32, hasta 30 veces más rápido que la línea base sin BLAS.

NumPy en WebAssembly ya puede multiplicar matrices con una BLAS acelerada. El paquete de NumPy en Emscripten-forge enlaza desde ahora OpenBLAS 0.3.34 compilado a wasm, y un np.matmul cuadrado de n = 1024 sube de 0,90 a 28,0 GFLOPS en float32 y de 0,98 a 14,6 GFLOPS en float64. En tiempos, entre 30,92 y 14,90 veces más rápido que la línea base sin BLAS.
Hasta la versión anterior, NumPy 2.5.2 en emscripten-forge-4x, no había BLAS de ningún tipo: np.matmul, el operador @ y np.linalg caían a bucles en C portables, ciegos a la jerarquía de caché y a SIMD. El producto de matrices se iba casi entero en tráfico de memoria en lugar de en aritmética. Con el cambio, el paquete por defecto de la rama 4x, NumPy 2.5.3 build 3, enlaza OpenBLAS con WASM SIMD y TARGET=WASM128_GENERIC. Es un lanzamiento estable, en el canal principal, no una rama de pruebas.
Por qué costó tanto
El obstáculo de fondo era Fortran. LAPACK, buena parte de SciPy y las rutinas estadísticas compiladas de R están escritas en ese lenguaje, así que llevarlas a wasm32 exigía un compilador de Fortran con ese target. Pyodide lo esquivó durante años con f2c: traducía el código a C y lo compilaba con la cadena de Emscripten. A R no le servía ese atajo.
De ahí salió el trabajo sobre Flang, el frontend de Fortran de LLVM, para WebAssembly. Isabel Paredes y Serge Guelton escribieron los primeros parches, inspirados por el trabajo de George Stagg, y Guelton subió parte a LLVM. Paredes mantiene hoy la receta flang_emscripten-wasm32. Con Flang funcionando todavía faltaba adaptar la biblioteca: WebAssembly impone convenciones de llamada más estrictas que un target nativo, y Ian Thomas parcheó OpenBLAS para Flang y Emscripten.
Lo que cambia al operarlo
Aquí está la parte que le importa a quien empaqueta: OpenBLAS es un paquete conda aparte y NumPy enlaza libopenblas dinámicamente en tiempo de ejecución. Se puede actualizar OpenBLAS sin recompilar NumPy, y toda la pila comparte la misma biblioteca: SciPy, scikit-learn o xtensor-blas. Los wheels de NumPy en PyPI, en cambio, congelan una copia de BLAS en el momento de la compilación. Por eso el mismo NumPy 2.5.3 usará OpenBLAS 0.3.35 en cuanto se publique.
Emscripten-forge se presenta como un conda-forge para WebAssembly: recetas que producen paquetes con ABI coherente para cualquier lenguaje, no solo Python. La siguiente versión de OpenBLAS ya está como paquete experimental, con kernels aportados por QuantStack, y hay una build opcional con Relaxed SIMD que añade otro escalón en los motores que lo soportan.
Queda por ver cuánto de ese margen se traslada a cargas reales. Las cifras salen de un matmul cuadrado, en un solo hilo y sobre un banco de pruebas concreto; el repositorio de mediciones tiene las rejillas completas y la referencia en linux-64 si alguien quiere reproducirlas antes de mover cargas de trabajo al navegador.
