Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ describes**:

| Source | Published under |
| --- | --- |
| branch `main`, with `params.ndarray.version: v0.15.0` in `hugo.yaml` | `https://go-ndarray.github.io/docs/<MAJOR.MINOR>/`, here `/docs/0.15/` |
| branch `main`, with `params.ndarray.version: v0.16.0` in `hugo.yaml` | `https://go-ndarray.github.io/docs/<MAJOR.MINOR>/`, here `/docs/0.16/` |
| the newest version | also `https://go-ndarray.github.io/docs/latest/` |

`https://go-ndarray.github.io/docs/` redirects to `latest/`. Each push to
Expand Down
2 changes: 1 addition & 1 deletion content/en/dtypes.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.15.0/docs/design-dtypes.md) at v0.15.0.
> Mirrored from [`docs/design-dtypes.md`](https://github.com/go-ndarray/ndarray/blob/v0.16.0/docs/design-dtypes.md) at v0.16.0.

> Status: implemented (Phase 2). Supersedes decision 4 of
> [plan-ndarray.md](roadmap.md) ("`float64` first").
Expand Down
4 changes: 2 additions & 2 deletions content/en/linalg.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.15.0/docs/linalg.md) at v0.15.0.
> Mirrored from [`docs/linalg.md`](https://github.com/go-ndarray/ndarray/blob/v0.16.0/docs/linalg.md) at v0.16.0.

Package [`linalg`](https://pkg.go.dev/github.com/go-ndarray/ndarray@v0.15.0/linalg) gives ndarray arrays the functions of
Package [`linalg`](https://pkg.go.dev/github.com/go-ndarray/ndarray@v0.16.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.

Expand Down
20 changes: 16 additions & 4 deletions content/en/performance.md
Original file line number Diff line number Diff line change
Expand Up @@ -948,10 +948,22 @@ 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.
**ppc64le (2026-10-18).** Go's assembler has no `xvaddsp`, so go-asmgen
emits it as a `WORD`. The encoding is pinned against GNU as 2.44 and llvm-mc
on a POWER9 (go-asmgen/asmgen#27). The cmd/asm spelling is
[CL 846285](https://go.dev/cl/846285), and go-asmgen's registry check
assembles every entry with that CL applied. The eight accumulators sit in two
VSX registers, loaded and stored with `LXVW4X`/`STXVW4X`, so every word keeps
its lane. VSX is the ppc64le baseline, so there is no feature check. The kernel
tests passed on the POWER9, and a sabotaged kernel (one `xvsubsp`) failed them.

| float32 `Sum`, 2¹⁴ / 2²⁰ | change | controls |
|---|---:|---|
| POWER9 (cfarm29) | −36% / −48% | float64, int32 ~ |

Left: s390x runs the scalar block loop. Go's assembler lacks `vfasb`
(vector-enhancements facility 1, z14), which [CL 846286](https://go.dev/cl/846286)
adds, and go-asmgen's registry has no s390x entries yet to pin its encoding.

## SIMD coverage

Expand Down
8 changes: 4 additions & 4 deletions content/en/random.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.15.0/docs/random.md) at v0.15.0.
> Mirrored from [`docs/random.md`](https://github.com/go-ndarray/ndarray/blob/v0.16.0/docs/random.md) at v0.16.0.

Package [`random`](https://pkg.go.dev/github.com/go-ndarray/ndarray@v0.15.0/random) is `numpy.random` over go-ndarray arrays. Its goal
Package [`random`](https://pkg.go.dev/github.com/go-ndarray/ndarray@v0.16.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.

Expand All @@ -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.15.0/random/example_test.go) print NumPy's own numbers.
[`example_test.go`](https://github.com/go-ndarray/ndarray/blob/v0.16.0/random/example_test.go) print NumPy's own numbers.

## What is implemented

Expand Down Expand Up @@ -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.15.0/random/libm.go)): a fast evaluation to about 2⁻⁶⁸ with Ziv's
([`libm.go`](https://github.com/go-ndarray/ndarray/blob/v0.16.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
Expand Down
4 changes: 2 additions & 2 deletions content/en/roadmap.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.15.0/docs/plan-ndarray.md) at v0.15.0.
> Mirrored from [`docs/plan-ndarray.md`](https://github.com/go-ndarray/ndarray/blob/v0.16.0/docs/plan-ndarray.md) at v0.16.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
Expand Down Expand Up @@ -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.15.0/BENCHMARKS.md)):
[BENCHMARKS.md](https://github.com/go-ndarray/ndarray/blob/v0.16.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
Expand Down
13 changes: 12 additions & 1 deletion content/en/security.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.15.0.
> Mirrored from [`SECURITY.md`](https://github.com/go-ndarray/ndarray/blob/main/SECURITY.md) at v0.16.0.

## Reporting

Expand Down Expand Up @@ -76,6 +76,17 @@ standard library's known vulnerabilities; `govulncheck ./...` reports none.

## Audit log

**2026-10-18 (v0.16.0).** The float32 pairwise-sum block kernels (SSE2, NEON,
RVV, LSX since v0.14.0/v0.15.0, VSX now) take raw pointers and a block count.
`AddBlocks8F32` refuses a length that is not a positive multiple of 8, and
each wrapper touches the last element before the call, so a kernel never sees
a count its operand cannot hold. `TestBlocks8StaysInsideItsOperands` puts the
accumulators and the input against PROT_NONE pages, and it passes on real
hardware for each kernel: Zen 3, Neoverse N1, SpacemiT X60, Loongson
3C5000L and POWER9. The ppc64le kernel's `xvaddsp` is a `WORD` whose encoding
go-asmgen pins against GNU as and llvm-mc. A sabotaged one (`xvsubsp`) failed
the bit-identity test on the POWER9.

**2026-10-17 (after v0.12.0, tests only).** v0.10.0 added thirteen dtypes,
and `FuzzOps` builds only float64 arrays; `values.json` checks every
operation on operands of one dtype, so the values of a mixed-dtype operation
Expand Down
4 changes: 2 additions & 2 deletions hugo.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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.15/"
baseURL: "https://go-ndarray.github.io/docs/0.16/"
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,
Expand Down Expand Up @@ -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.15.0"
version: "v0.16.0"

navbar:
displayTitle: true
Expand Down
Loading