From 6b1181af7ff157c0a30b4bb8102049b7f22acafb Mon Sep 17 00:00:00 2001 From: tannevaled Date: Sun, 4 Oct 2026 16:50:45 +0200 Subject: [PATCH] Sync the landing page with ndarray v0.2.0 SIMD kernels exist on amd64 and arm64 only; the other targets run the pure-Go reference code. Replace the blanket 'faster than NumPy' and 'Dot wins at parity' claims with the measured Zen 3 wins and losses against NumPy 2.5.3 + OpenBLAS 0.3.34, add Workspace and the optimized-routines Exp/Log, state the CI matrix, and fix the licence line: source files carry no per-file header. Co-Authored-By: Claude Opus 5.5 --- hugo.toml | 4 ++-- layouts/index.html | 19 +++++++++++-------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/hugo.toml b/hugo.toml index 6110625..c633050 100644 --- a/hugo.toml +++ b/hugo.toml @@ -6,7 +6,7 @@ title = 'go-ndarray' disableKinds = ['taxonomy', 'term', 'rss', 'sitemap'] [params] - description = "go-ndarray is a pure-Go (CGO=0) NumPy-style n-dimensional array library for float64 — slicing/views, broadcasting, ufuncs, reductions and linear algebra, multicore + SIMD, faster than NumPy on the parallelizable core." + description = "go-ndarray is a pure-Go (CGO=0) NumPy-style n-dimensional array library for float64 — slicing/views, broadcasting, ufuncs, reductions and linear algebra, multicore + SIMD on amd64 and arm64, with a Workspace arena for loops." brand = "go-ndarray" github = "go-ndarray" heroAccent = "go-ndarray" @@ -14,7 +14,7 @@ disableKinds = ['taxonomy', 'term', 'rss', 'sitemap'] heroIntro = [ "go-ndarray is the 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.

@@ -28,11 +30,11 @@

Repositories

ndarray

-

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).

docs

-

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 →

brand

@@ -45,10 +47,11 @@

brand

Quality bar

  • Pure Go. CGO_ENABLED=0 across the org. No cgo, no BLAS shim.
  • -
  • 100% test coverage. Gated in CI, differentially checked against numpy 2.2.
  • -
  • Faster than NumPy on the parallelizable core (Add/Mul/Sum/Sqrt/Max) — multicore fan-out + SIMD. The packed GEMM reaches tuned-BLAS parity at 1024² (≈1.00× single-threaded vecLib, ~373 GFLOP/s) and beats the pure-Go gonum 4–10×; Dot wins at parity. Honest where tuned BLAS still leads at small n.
  • -
  • Multi-arch. Portable scalar core on all six 64-bit targets; go-asmgen SIMD kernels where the Go assembler allows it.
  • -
  • BSD-3-Clause on every source file.
  • +
  • 100% test coverage. Gated in CI, differentially checked against numpy.
  • +
  • Measured, wins and losses. Against NumPy 2.5.3 + OpenBLAS 0.3.34 on a 16-core AMD Zen 3: faster on whole-array 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×.
  • +
  • Accurate 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).
  • +
  • Multi-arch. go-asmgen SIMD kernels on amd64 (SSE2, AVX2/FMA picked at run time) and arm64 (NEON); riscv64, loong64, ppc64le, s390x and the 32-bit targets run the same pure-Go code those kernels are tested against. CI runs the suite on amd64, arm64 and 386 natively and on riscv64/loong64/ppc64le/s390x/arm under qemu, on Linux, macOS and Windows, and compiles it for every GOOS/GOARCH pair Go supports; v0.2.0 was also run on real amd64, arm64, ppc64le, riscv64 and loong64 hardware.
  • +
  • BSD-3-Clause licensed; Exp and Log are MIT-licensed ports of Arm's optimized-routines.
{{ end }}