From 88daa0f30e16cf39f78871d5ea2f8d32e5ffeb2a Mon Sep 17 00:00:00 2001 From: tannevaled Date: Fri, 9 Oct 2026 08:33:19 +0200 Subject: [PATCH 1/2] =?UTF-8?q?landing:=20library=20=C2=B7=20v0.9.0;=20s39?= =?UTF-8?q?0x=204x8=20GEMM,=20measured=20on=20a=20real=20IBM=20z17;=20play?= =?UTF-8?q?ground=20on=20ndarray=20v0.9.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- hugo.toml | 4 ++-- layouts/index.html | 2 +- playground/go.mod | 4 ++-- playground/go.sum | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/hugo.toml b/hugo.toml index 530ec3c..73b00c4 100644 --- a/hugo.toml +++ b/hugo.toml @@ -16,9 +16,9 @@ disableKinds = ['taxonomy', 'term', 'rss', 'sitemap', '404'] [[params.repos]] name = "ndarray" - kind = "library · v0.8.0" + kind = "library · v0.9.0" 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, VSX 8×8 on ppc64le, LASX 8×8 on loong64, RVV 6×8 on riscv64), 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, LASX 8×8 on loong64, RVV 6×8 on riscv64, 4×8 on s390x), 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 bd5f311..1b5c2a2 100644 --- a/layouts/index.html +++ b/layouts/index.html @@ -85,7 +85,7 @@

The n-dimensional array, without cgo.

✅

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 every 64-bit target

go-asmgen SIMD kernels on amd64 (SSE2, AVX2/FMA picked at run time), arm64 (NEON), ppc64le (VSX), loong64 (LASX, when the CPU has it), riscv64 (RVV, when the CPU has it) and s390x (vector facility, validated under emulation only); the 32-bit targets run the same pure-Go code those kernels are tested against.

+
⚡

SIMD on every 64-bit target

go-asmgen SIMD kernels on amd64 (SSE2, AVX2/FMA picked at run time), arm64 (NEON), ppc64le (VSX), loong64 (LASX, when the CPU has it), riscv64 (RVV, when the CPU has it) and s390x (vector facility, measured on a real IBM z17); 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.

diff --git a/playground/go.mod b/playground/go.mod index c9bef54..f1e59e3 100644 --- a/playground/go.mod +++ b/playground/go.mod @@ -1,9 +1,9 @@ module github.com/go-ndarray/go-ndarray.github.io/playground -go 1.27.1 +go 1.27.2 require ( - github.com/go-ndarray/ndarray v0.8.0 + github.com/go-ndarray/ndarray v0.9.0 github.com/go-widgets/mvvm v0.13.0 github.com/go-widgets/mvvmtk v0.14.1 github.com/go-widgets/painter v0.15.0 diff --git a/playground/go.sum b/playground/go.sum index 5b20154..2fb2eb7 100644 --- a/playground/go.sum +++ b/playground/go.sum @@ -22,8 +22,8 @@ github.com/go-images/jpeg2000 v0.1.0 h1:SiFAZ6NGvGLU+VmxKji74RiSQDeK6TyjUZr1wjlx github.com/go-images/jpeg2000 v0.1.0/go.mod h1:MwSmrbiP6RK7eLphoNyzY60BAXWOD+8LVdBYDPIBrN4= github.com/go-images/png v0.1.0 h1:OI4yHotS0lA75sLnG2FTL2Vooh4PWpVWEidre1msSe0= github.com/go-images/png v0.1.0/go.mod h1:V9vaEbr2nrZGorUWn4xv9F24Yuu1/qLVtmailM9GBVo= -github.com/go-ndarray/ndarray v0.8.0 h1:wdEWnMD2jxGI5BSwRtV2vdU7XoyOTvXsrSDu5w8uC5A= -github.com/go-ndarray/ndarray v0.8.0/go.mod h1:MI/3teJK5hMJ4Chz6Auy2w+DnQAjtbekhHRg+NUbNMI= +github.com/go-ndarray/ndarray v0.9.0 h1:j4pvNri/0CzuICwU6iCCKkwobbNkNozNZ3WRgX0SSuQ= +github.com/go-ndarray/ndarray v0.9.0/go.mod h1:URXtNNKKw05MdWCqSCOmiw4zE38HQl95PztFSwgeVdk= github.com/go-opentype/fonts v0.10.0 h1:9f7ik795SlBEJjz6iqBE/ZV2PaTauAj537MMWw9t4OQ= github.com/go-opentype/fonts v0.10.0/go.mod h1:b+o8v1zDZ6B3GixA398jGILAh09+WwfyoYz52zKe7DA= github.com/go-opentype/opentype v0.13.0 h1:q9K7IGDfwMP/ik51ZkwiYf6jbaqPfocvAIuojetd0UQ= From e4706798c2364c507336ac9a6856cbfba1974358 Mon Sep 17 00:00:00 2001 From: tannevaled Date: Fri, 9 Oct 2026 08:35:41 +0200 Subject: [PATCH 2/2] ci: Go 1.27.2 (ndarray v0.9.0 requires it) Co-Authored-By: Claude Opus 5.5 --- .github/workflows/hugo.yml | 2 +- .github/workflows/playground.yml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/hugo.yml b/.github/workflows/hugo.yml index f2692f5..c02cd1d 100644 --- a/.github/workflows/hugo.yml +++ b/.github/workflows/hugo.yml @@ -60,7 +60,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v7 with: - go-version: "1.27.1" + go-version: "1.27.2" cache-dependency-path: playground/go.sum - name: Build the playground diff --git a/.github/workflows/playground.yml b/.github/workflows/playground.yml index 1deea6a..f0ae188 100644 --- a/.github/workflows/playground.yml +++ b/.github/workflows/playground.yml @@ -39,7 +39,7 @@ jobs: - uses: actions/checkout@v7 - uses: actions/setup-go@v7 with: - go-version: "1.27.1" + go-version: "1.27.2" cache-dependency-path: playground/go.sum - uses: actions/setup-node@v7 with: @@ -74,7 +74,7 @@ jobs: - uses: actions/checkout@v7 - uses: actions/setup-go@v7 with: - go-version: "1.27.1" + go-version: "1.27.2" cache-dependency-path: playground/go.sum - name: install the guards run: | @@ -99,7 +99,7 @@ jobs: - uses: actions/checkout@v7 - uses: actions/setup-go@v7 with: - go-version: "1.27.1" + go-version: "1.27.2" cache-dependency-path: playground/go.sum - uses: actions/setup-node@v7 with: