From 6b1181af7ff157c0a30b4bb8102049b7f22acafb Mon Sep 17 00:00:00 2001
From: tannevaled numpy equivalent for Go: a float64 n-dimensional array with creation routines, strided views that share data, broadcasting elementwise ops and ufuncs, reductions (incl. arg / cumulative / clip / where), manipulation, and linear algebra (a panel-packed, cache-blocked GEMM) — all in pure Go, with cgo disabled.",
- "Ruby has no cgo-free ndarray (Numo::NArray and NMatrix are C extensions) and gonum's optimized assembly is amd64-only. go-ndarray pairs a portable scalar core with multicore fan-out and go-asmgen SIMD kernels, beating single-threaded NumPy on the parallelizable core. 100% test coverage is the bar, differentially checked against numpy 2.2."
+ "Ruby has no cgo-free ndarray (Numo::NArray and NMatrix are C extensions) and gonum's optimized assembly is amd64-only. go-ndarray pairs a portable pure-Go core with multicore fan-out and, on amd64 and arm64, go-asmgen SIMD kernels; a Workspace arena takes the garbage collector out of loops. Measured against NumPy 2.5.3 on a 16-core Zen 3 it is faster on whole-array and row reductions, on Exp from 256 Ki elements and on MatMul against single-threaded OpenBLAS, and slower against 16-thread BLAS. 100% test coverage is the bar, differentially checked against NumPy."
]
[menu]
diff --git a/layouts/index.html b/layouts/index.html
index cd842de..9dccc8f 100644
--- a/layouts/index.html
+++ b/layouts/index.html
@@ -18,8 +18,10 @@ Why go-ndarray
brings the n-dimensional array vocabulary — shapes, strided
views, broadcasting, ufuncs, reductions and linear algebra — to Go with
no cgo, cross-compiling to a static binary everywhere. The hot paths
- are multicore + SIMD, so it beats single-threaded NumPy on the
- parallelizable core. It is the cgo-free ndarray the Go and Ruby ecosystems lacked.
+ are multicore, and SIMD on amd64 and arm64, so it beats NumPy on
+ whole-array and row reductions, large Exp and MatMul against
+ single-threaded BLAS; a Workspace arena removes the garbage-collector cost
+ of temporaries in loops. It is the cgo-free ndarray the Go and Ruby ecosystems lacked.
The library. Creation (Zeros/Arange/Linspace/…), strided views, broadcasting elementwise + ufuncs, reductions (Sum/Max/ArgMax/CumSum/Clip/Where), manipulation (Reshape/Concatenate/Stack), and linalg (MatMul/Dot) via a panel-packed cache-blocked GEMM with a go-asmgen SIMD-FMA micro-kernel.
The library. Creation (Zeros/Arange/Linspace/…), strided views, broadcasting elementwise + ufuncs, reductions (Sum/Max/ArgMax/CumSum/Clip/Where), manipulation (Reshape/Concatenate/Stack), linalg (MatMul/Dot) via a panel-packed cache-blocked GEMM with a go-asmgen SIMD-FMA micro-kernel (NEON 4×8 on arm64, AVX2/FMA 6×8 on amd64), and a Workspace arena for loops (Use/Reset/Detach).
Versioned documentation site (MkDocs Material): API reference, the roadmap, and honest benchmark pages versus NumPy 2.2 / OpenBLAS. Source →
+Versioned documentation site (MkDocs Material): API reference, the roadmap, and honest benchmark pages versus NumPy 2.5.3 / OpenBLAS 0.3.34. Source →
CGO_ENABLED=0 across the org. No cgo, no BLAS shim.numpy 2.2.gonum 4–10×; Dot wins at parity. Honest where tuned BLAS still leads at small n.numpy.Sum/Mean/Max at 4 Mi (2.3–4.5×), SumAxis(1) (2.2×), MaxAxis(1) (1.7×), Exp from 256 Ki elements (2.4–5.6×) and MatMul against single-threaded OpenBLAS (3.7–5.9× from 512²); slower against 16-thread OpenBLAS (MatMul 0.55× at 1024², Dot/mat·vec 0.16×) and on allocating elementwise forms outside a Workspace. In a Workspace, x + y on 1 024 elements drops from 2.6 to 0.38 µs (2.1× NumPy). On Apple silicon the packed GEMM reaches tuned-BLAS parity at 1024² and beats the pure-Go gonum 4–10×.Exp/Log. Ports of Arm's optimized-routines: worst 0.504 / 0.508 ULP against a 300-bit reference, and correct where Go's amd64 math.Exp returns +Inf (golang/go#81995) and math.Log is wrong on subnormals (golang/go#56600).GOOS/GOARCH pair Go supports; v0.2.0 was also run on real amd64, arm64, ppc64le, riscv64 and loong64 hardware.Exp and Log are MIT-licensed ports of Arm's optimized-routines.