diff --git a/README.md b/README.md index 80f3031..cf94848 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ describes**: | Source | Published under | | --- | --- | -| branch `main`, with `params.ndarray.version: v0.14.0` in `hugo.yaml` | `https://go-ndarray.github.io/docs//`, here `/docs/0.14/` | +| branch `main`, with `params.ndarray.version: v0.15.0` in `hugo.yaml` | `https://go-ndarray.github.io/docs//`, here `/docs/0.15/` | | the newest version | also `https://go-ndarray.github.io/docs/latest/` | `https://go-ndarray.github.io/docs/` redirects to `latest/`. Each push to diff --git a/content/en/dtypes.md b/content/en/dtypes.md index 0cc8d4c..3ec7443 100644 --- a/content/en/dtypes.md +++ b/content/en/dtypes.md @@ -8,7 +8,7 @@ description: "Why the dtype is a run-time property of one Array type, how arrays tags: [dtypes, numpy] --- -> Mirrored from [`docs/design-dtypes.md`](https://github.com/go-ndarray/ndarray/blob/v0.14.0/docs/design-dtypes.md) at v0.14.0. +> Mirrored from [`docs/design-dtypes.md`](https://github.com/go-ndarray/ndarray/blob/v0.15.0/docs/design-dtypes.md) at v0.15.0. > Status: implemented (Phase 2). Supersedes decision 4 of > [plan-ndarray.md](roadmap.md) ("`float64` first"). diff --git a/content/en/linalg.md b/content/en/linalg.md index 028acf0..174072f 100644 --- a/content/en/linalg.md +++ b/content/en/linalg.md @@ -8,9 +8,9 @@ description: "Solve, Inv, Det, Cholesky, QR, SVD, Eig and the rest of numpy.lina tags: [linalg, numpy] --- -> Mirrored from [`docs/linalg.md`](https://github.com/go-ndarray/ndarray/blob/v0.14.0/docs/linalg.md) at v0.14.0. +> Mirrored from [`docs/linalg.md`](https://github.com/go-ndarray/ndarray/blob/v0.15.0/docs/linalg.md) at v0.15.0. -Package [`linalg`](https://pkg.go.dev/github.com/go-ndarray/ndarray@v0.14.0/linalg) gives ndarray arrays the functions of +Package [`linalg`](https://pkg.go.dev/github.com/go-ndarray/ndarray@v0.15.0/linalg) gives ndarray arrays the functions of `numpy.linalg`, written in Go without cgo or assembly of its own: the matrix products it relies on are the ndarray package's packed SIMD GEMM. diff --git a/content/en/performance.md b/content/en/performance.md index 05bfa30..3f9822b 100644 --- a/content/en/performance.md +++ b/content/en/performance.md @@ -930,10 +930,28 @@ and multiplication wrap modulo 2⁶⁴, so the order changes nothing). They also consume the slice instead of indexing `i+1…i+3`, which had left four bounds checks per iteration in the amd64 code; now there are none. -Left: ppc64le, s390x, loong64 and riscv64 run the scalar block loop. ppc64le -needs `xvaddsp`, which Go's assembler lacks: go-asmgen/asmgen#27 adds the -VSX single-precision family to its registry, with references from GNU as -and llvm-mc. +**riscv64 and loong64 (2026-10-18).** RVV: `VSETIVLI $8, E32, M2` gives +vl = 8 on every VLEN ≥ 128, and `VFADDVV` adds a block to the two-register +group. LSX: the eight accumulators sit in two 128-bit registers, and +`VFADD.S` (`VADDF`) adds a block. Each runs behind the feature bit its float64 +kernels use. Both were run on the real hardware: the kernel tests passed +there, and a sabotaged kernel failed them, so the kernel path is the one +taken. Same A/B protocol, idle hosts: + +| float32 `Sum`, 2¹⁴ / 2²⁰ | change | controls | +|---|---:|---| +| SpacemiT X60 (cfarm95, RVV, VLEN 256) | −30% / −41% | float64, int32 ~ | +| Loongson 3C5000L (cfarm401, LSX) | −24% / −24% | float64, int32 ~ | + +The first loong64 kernel used one 256-bit LASX register for all eight +accumulators, and was **26–47% slower** than the scalar loop. Every block's +addition waited on the previous one, a single dependency chain, where the +scalar loop has eight. Two registers give two chains, as SSE2 does on amd64. + +Left: ppc64le and s390x run the scalar block loop. Go's assembler lacks +`xvaddsp` (ppc64) and `vfasb` (s390x). go-asmgen/asmgen#27 adds the VSX +single-precision family to go-asmgen's registry, with references from GNU as +and llvm-mc, and needs a cmd/asm patch of its own. ## SIMD coverage diff --git a/content/en/random.md b/content/en/random.md index f0a6c18..6ab53ae 100644 --- a/content/en/random.md +++ b/content/en/random.md @@ -8,9 +8,9 @@ description: "numpy.random with NumPy's numbers for the same seed: the bit gener tags: [random, numpy] --- -> Mirrored from [`docs/random.md`](https://github.com/go-ndarray/ndarray/blob/v0.14.0/docs/random.md) at v0.14.0. +> Mirrored from [`docs/random.md`](https://github.com/go-ndarray/ndarray/blob/v0.15.0/docs/random.md) at v0.15.0. -Package [`random`](https://pkg.go.dev/github.com/go-ndarray/ndarray@v0.14.0/random) is `numpy.random` over go-ndarray arrays. Its goal +Package [`random`](https://pkg.go.dev/github.com/go-ndarray/ndarray@v0.15.0/random) is `numpy.random` over go-ndarray arrays. Its goal is migration: a notebook moved from NumPy to Go keeps its numbers for the same seed. @@ -24,7 +24,7 @@ u, _ := random.Rand(3) // np.random.rand(3) ``` `Example`, `ExampleSeed` and `ExampleGenerator_ChoiceN` in -[`example_test.go`](https://github.com/go-ndarray/ndarray/blob/v0.14.0/random/example_test.go) print NumPy's own numbers. +[`example_test.go`](https://github.com/go-ndarray/ndarray/blob/v0.15.0/random/example_test.go) print NumPy's own numbers. ## What is implemented @@ -118,7 +118,7 @@ random arguments. Used as-is, that made 3% of `np.random.randn` values and 10% of `lognormal` values one ULP off. So `random` rounds `log`, `log1p`, `exp`, `expm1` and `pow` **correctly** -([`libm.go`](https://github.com/go-ndarray/ndarray/blob/v0.14.0/random/libm.go)): a fast evaluation to about 2⁻⁶⁸ with Ziv's +([`libm.go`](https://github.com/go-ndarray/ndarray/blob/v0.15.0/random/libm.go)): a fast evaluation to about 2⁻⁶⁸ with Ziv's rounding test, and a double-double fallback (about 2⁻¹⁰⁰) for the one argument in ~2¹⁵ that needs it. Checked against mpmath at 300 bits on 63,000 arguments (0 misrounded; the committed `libm.json` keeps 8,400), and the fast paths diff --git a/content/en/roadmap.md b/content/en/roadmap.md index f350d87..543fc28 100644 --- a/content/en/roadmap.md +++ b/content/en/roadmap.md @@ -8,7 +8,7 @@ description: "The plan for go-ndarray and what ships today." tags: [roadmap] --- -> Mirrored from [`docs/plan-ndarray.md`](https://github.com/go-ndarray/ndarray/blob/v0.14.0/docs/plan-ndarray.md) at v0.14.0. +> Mirrored from [`docs/plan-ndarray.md`](https://github.com/go-ndarray/ndarray/blob/v0.15.0/docs/plan-ndarray.md) at v0.15.0. > Goal: a **pure-Go (CGO=0)** NumPy-style N-dimensional array library, as a > **standalone, reusable** module with correct scalar kernels now and a clean @@ -112,7 +112,7 @@ suite (plus the per-arch CI jobs already wired in `.github/workflows/ci.yml`). - **Performance — DONE (beats NumPy on its core ops; matmul at tuned-BLAS parity).** Several levers behind the kernel seam, measured honestly vs NumPy 2.2.4 (see [docs/perf.md](performance.md) and the repo's - [BENCHMARKS.md](https://github.com/go-ndarray/ndarray/blob/v0.14.0/BENCHMARKS.md)): + [BENCHMARKS.md](https://github.com/go-ndarray/ndarray/blob/v0.15.0/BENCHMARKS.md)): - **Multicore.** `Add/Sub/Mul/Div/Map`, `Sum/Max/Min`, the axis reductions, `Concatenate`/`Stack`, and the GEMM fan out across `GOMAXPROCS` above a size threshold (small arrays stay serial). Plus an allocation fix: the diff --git a/content/en/security.md b/content/en/security.md index a162ad7..c04c8ff 100644 --- a/content/en/security.md +++ b/content/en/security.md @@ -8,7 +8,7 @@ description: "How to report a vulnerability, what the library guarantees, and th tags: [security] --- -> Mirrored from [`SECURITY.md`](https://github.com/go-ndarray/ndarray/blob/main/SECURITY.md) at v0.14.0. +> Mirrored from [`SECURITY.md`](https://github.com/go-ndarray/ndarray/blob/main/SECURITY.md) at v0.15.0. ## Reporting diff --git a/hugo.yaml b/hugo.yaml index b9e686b..8963f67 100644 --- a/hugo.yaml +++ b/hugo.yaml @@ -6,7 +6,7 @@ # have used since the site was built with MkDocs and mike. The CI sets it # through --baseURL, from params.ndarray.version below. This default is the # same build. -baseURL: "https://go-ndarray.github.io/docs/0.14/" +baseURL: "https://go-ndarray.github.io/docs/0.15/" title: "go-ndarray" # themes/hextra is the tannevaled/hextra fork, pinned at a release tag: # upstream Hextra plus opt-in features (partial menu items, combos, @@ -97,7 +97,7 @@ params: # The ndarray release these pages describe. Its minor version is the # documentation's version label (v0.9.1 -> 0.9): the CI reads it here. ndarray: - version: "v0.14.0" + version: "v0.15.0" navbar: displayTitle: true