From 3e52951c1e455de9a0c3adfea9afa9b901bf874d Mon Sep 17 00:00:00 2001 From: tannevaled Date: Sun, 4 Oct 2026 18:21:19 +0200 Subject: [PATCH] Landing: ppc64le VSX kernels and ndarray v0.2.3 ndarray v0.2.3 (go-ndarray/ndarray#20) adds VSX SIMD kernels on ppc64le. The SIMD wording now names amd64, arm64 and ppc64le, ppc64le leaves the list of targets running the pure-Go reference code, the GEMM blurb lists the VSX 8x8 micro-kernel next to NEON and AVX2/FMA, and the library card shows v0.2.3. Co-Authored-By: Claude Opus 5.5 --- hugo.toml | 6 +++--- layouts/index.html | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/hugo.toml b/hugo.toml index c6479be..27c6675 100644 --- a/hugo.toml +++ b/hugo.toml @@ -12,7 +12,7 @@ disableKinds = ['taxonomy', 'term', 'rss', 'sitemap', '404'] unsafe = true [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 on amd64 and arm64, with a Workspace arena for loops." + 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, arm64 and ppc64le, with a Workspace arena for loops." # The colours are read by partials/styles.html. Emerald, shared with go-fft: # the two are one scientific-computing family, told apart by their glyphs. @@ -72,9 +72,9 @@ disableKinds = ['taxonomy', 'term', 'rss', 'sitemap', '404'] # its card, "kind" as the card's tag, "href" as both links, "blurb" in full. [[params.repos]] name = "ndarray" - kind = "library · v0.2.2" + kind = "library · v0.2.3" href = "https://github.com/go-ndarray/ndarray" - blurb = "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)." + blurb = "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, VSX 8×8 on ppc64le), and a Workspace arena for loops (Use/Reset/Detach)." [[params.repos]] name = "docs" kind = "site" diff --git a/layouts/index.html b/layouts/index.html index acc3798..aa3825a 100644 --- a/layouts/index.html +++ b/layouts/index.html @@ -60,13 +60,13 @@

NumPy-style n-dimensional arrays in pure Go.
Why go-ndarray

The n-dimensional array, without cgo.

-

NumPy is the lingua franca of numerical computing, but in Go the choices are gonum (matrix-centric, amd64-only assembly) or a C extension. 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, and SIMD on amd64 and arm64.

+

NumPy is the lingua franca of numerical computing, but in Go the choices are gonum (matrix-centric, amd64-only assembly) or a C extension. 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, and SIMD on amd64, arm64 and ppc64le.

🐹

Pure Go

CGO_ENABLED=0 across the org. No cgo, no BLAS shim.

✅

100% test coverage

Gated in CI, differentially checked against numpy.

🔢

NumPy semantics

Row-major strided arrays, NumPy broadcasting, and NumPy basic-indexing Slice returning strided views that share data.

♻️

Workspace arena for loops

Bind the inputs with ws.Use, compute as usual, ws.Reset() at the end of each pass: results stop costing the garbage collector anything. On a Zen 3, x + y on 1 024 elements drops from 2.6 to 0.38 µs (2.1× NumPy).

-
⚡

SIMD on amd64 & arm64

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.

+
⚡

SIMD on amd64, arm64 & ppc64le

go-asmgen SIMD kernels on amd64 (SSE2, AVX2/FMA picked at run time), arm64 (NEON) and ppc64le (VSX); riscv64, loong64, s390x and the 32-bit targets run the same pure-Go code those kernels are tested against.

🎯

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 CI

The suite runs on amd64, arm64 and 386 natively and on riscv64/loong64/ppc64le/s390x/arm under qemu, on Linux, macOS and Windows, and compiles for every GOOS/GOARCH pair Go supports; v0.2.0 was also run on real amd64, arm64, ppc64le, riscv64 and loong64 hardware.

💎

The cgo-free ndarray that was missing

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 SIMD kernels.

@@ -100,7 +100,7 @@

What is here.

The cgo-free ndarray the Go and Ruby ecosystems lacked.

-

No cgo, no BLAS shim. A portable pure-Go core, multicore, with SIMD kernels on amd64 and arm64 and a Workspace arena that takes the garbage collector out of loops. Faster than NumPy on whole-array and row reductions, on large Exp and on MatMul against single-threaded BLAS, slower against 16-thread BLAS — the numbers are on the performance page.

+

No cgo, no BLAS shim. A portable pure-Go core, multicore, with SIMD kernels on amd64, arm64 and ppc64le and a Workspace arena that takes the garbage collector out of loops. Faster than NumPy on whole-array and row reductions, on large Exp and on MatMul against single-threaded BLAS, slower against 16-thread BLAS — the numbers are on the performance page.

Read the source on GitHub →