Cells measured, cells that came back clean

1,107


cells ok — zero timeouts, zero errors

2


runs end to end on independent hardware

1.5–7.2%


spread on every headline ratio between the two runs

Median of at least three trials per cell. Every ratio is computed within a single machine — absolute seconds move between cloud instances of the same SKU, ratios do not. Full decomposition — eigenvalues and eigenvectors — unless a block says otherwise.

Measured against

Reference netlib LAPACK 3.12.0 and system OpenBLAS

dsyev, full decomposition, via LD_PRELOAD · threads 1 vs 1

Comparison A

Against the call your code already makes.

This is the default path: numpy.linalg.eigh, or a direct dsyev, served by whichever LAPACK stack the machine has. VVE is swapped in with LD_PRELOAD and nothing else changes — same script, same call site, same inputs. On structured matrices it detects the band structure the dense path ignores.

vs single-threaded reference netlib LAPACK 3.12.0 dsyev — the algorithmic baseline

Measured against

single-threaded reference netlib LAPACK

dsyev (the default dense path)full decompositionsingle-threadednetlib reference LAPACK/BLAS 3.12.0

Full decomposition, values and vectors, via LD_PRELOAD with zero code changes. Both sides single-threaded.

Speedup against reference netlib dsyev on clustered spectraA log-log line chart of speedup vs single-threaded reference netlib LAPACK dsyev, both sides single-threaded. Wilkinson rises from 9.8× at N = 2,048 to 89.6× at N = 16,384. Schrödinger rises from 11.1× to 97.7× across the same sizes.10.0×20.0×50.0×100.0×2,0484,0968,19216,384N — matrix dimension (log₂)× vs dsyevone doubling per doublingwilkinson (odd N)89.6×schrödinger97.7×
Speedup vs single-threaded reference netlib LAPACK dsyev — full decomposition, values and vectors, via LD_PRELOAD with zero code changes. Both sides single-threaded. Clustered spectra: wilkinson (odd N) and schrödinger. Both axes log scale.
Speedup vs single-threaded reference netlib dsyev. Full decomposition. Higher is faster.
FamilyN = 2,048N = 4,096N = 8,192N = 16,384
wilkinson (odd N)9.80×23.5×45.7×89.6×
schrödinger11.1×16.3×27.5×97.7×
Speedup vs single-threaded reference netlib dsyev. Full decomposition. Higher is faster.
FamilyN = 2,048N = 4,096N = 8,192N = 16,384
wilkinson (odd N)9.8×23.5×45.7×89.6×
schrödinger11.1×16.3×27.5×97.7×
second_diff10.9×16.2×29.8×101.7×
laplacian1d11.3×15.4×29.0×102.6×
anderson7.5×12.1×20.4×64.1×

Five structured families, and the ordering holds across all of them: the more structure the matrix has, the more work the dense path is doing that does not need doing. anderson is random-disorder — the least structured family in the campaign, and still 64× at N = 16,384.

vs single-threaded fully tuned OpenBLAS dsyev — the delivered stack, one core against one core
Speedup vs single-threaded fully tuned OpenBLAS dsyev. Same call, same sizes, same LD_PRELOAD.
FamilyN = 2,048N = 4,096N = 8,192N = 16,384
wilkinson (odd N)1.2×2.9×6.2×12.2×
schrödinger1.8×3.2×4.8×11.7×
second_diff1.7×3.1×5.1×11.9×
laplacian1d1.7×2.9×4.8×12.0×
anderson1.3×2.6×4.2×9.0×

Full decomposition, N=16,384

9.0–12.2×


vs fully tuned OpenBLAS, one core against one core dsyev (the default dense path) — N = 16,384 — one core against one core

The reference figures above measure the algorithm. These measure the fight. OpenBLAS brings decades of hand-written SIMD to the same call, and the margin still grows monotonically with N, because SIMD is a constant factor and the exponent is not. VVE has written no hand-tuned SIMD; that is headroom, not a result.

Measured against

single-threaded reference netlib LAPACK

dsyev (the default dense path)full decompositionsingle-threadednetlib reference LAPACK/BLAS 3.12.0

Wall clock at N = 16,384A horizontal bar chart comparing reference netlib at 2,932.9 seconds, OpenBLAS at 342.0 seconds, and VVE at 28.8 seconds.01,000.02,000.0seconds — one full decompositionreference netlib LAPACK 3.12.0 dsyevsingle-threaded2,932.9 s48 min 53 sfully tuned OpenBLAS dsyevsingle-threaded342.0 s5 min 42 sVVEsingle-threaded28.8 s28.8 s
second_diff, N = 16,384 — median wall clock for one full decomposition. All three single-threaded.
Wall clock at N = 16,384
StackSecondsWall clock
reference netlib LAPACK 3.12.0 dsyev — single-threaded2,932.9 s48 min 53 s
fully tuned OpenBLAS dsyev — single-threaded342.0 s5 min 42 s
VVE — single-threaded28.8 s28.8 s

Forty-nine minutes, or five minutes and forty-two seconds, or twenty-nine seconds. Same matrix, same call, same core.

Measured against

LAPACK dstemr (MRRR), reference netlib LAPACK 3.10.0

dstemr — LAPACK's expert O(N²) tridiagonal eigensolver · threads 1 vs 1

Comparison B

Against the routine an expert would reach for instead.

The strongest objection to Comparison A is that a numerical expert would never let the dense path see a tridiagonal matrix — they would call dstemr and get O(N²) from LAPACK itself. It is a fair objection, so here is that fight, run separately and never blended with the one above. Accuracy is gated on both sides: neither result counts unless its residual and orthogonality both pass.

vs single-threaded LAPACK dstemr (MRRR), full decomposition, accuracy gated on both sides
Speedup vs single-threaded dstemr on clustered spectra. Full decomposition. Higher is faster.
FamilyN = 4,096N = 16,384N = 32,768N = 45,056
wilkinson3.2×3.8×4.6×5.2×
schrödinger2.6×3.2×3.9×4.9×

Measured against

LAPACK's own expert O(N²) routine, single-threaded

dstemr (MRRR)full decompositionsingle-threadednetlib reference LAPACK 3.10.0, reference BLAS

Wall clock at N = 45,056A horizontal bar chart comparing LAPACK dstemr at 883.3 seconds and VVE at 171.1 seconds.0500.0seconds — one full decompositionLAPACK dstemr (MRRR)single-threaded883.3 s14 min 43 sVVEsingle-threaded171.1 s2 min 51 s
wilkinson, N = 45,056 — median wall clock for one full decomposition. Both single-threaded.
Wall clock at N = 45,056
StackSecondsWall clock
LAPACK dstemr (MRRR) — single-threaded883.3 s14 min 43 s
VVE — single-threaded171.1 s2 min 51 s

The margin vs single-threaded LAPACK dstemr widens monotonically with N — 3.21× at 4,096, 5.16× at 45,056, both sides single-threaded — because VVE holds a flat scaling slope where MRRR's degrades on clusters. The last number in that row is the current floor.

The memory law.

Speed is a comparison. Memory is a law: eigvalsh requires the matrix to exist. The bands-native path does not build one.

Bands-native values-only path, second_diff. Peak RSS against the dense N×N buffer the same problem would require.
NVVE peak RSSDense N×NRatiomax |Δλ|
8,19228.7 MB0.5 GiB18×1.78e-15
32,76831.5 MB8.0 GiB260×1.78e-15
131,072≈ 53.0 MB128 GiB≈ 2,500×1.78e-15
524,288≈ 53.0 MB2,048 GiB≈ 39,600×1.78e-15
VVE peak RSS against dense memory requirementA log-log comparison. The VVE line remains almost flat from 28.7 MB to about 53 MB while the dense requirement rises from 0.5 GiB to 2,048 GiB.8,19232,768131,072524,288VVE peak RSSDense N×N
VVE peak RSS against the dense N×N requirement, log-log. One line is flat; the other is a slope of 2.
Memory figure data
8,19228.7 MB0.5 GiB
32,76831.5 MB8.0 GiB
131,07253.0 MB128 GiB
524,28853.0 MB2,048 GiB

Accuracy does not drift across that 64× range. max |Δλ| = 1.78e-15 at every size in the table — machine precision, flat.

Accuracy is the gate, not the trade.

No result in either comparison counts unless it passes an accuracy gate on both sides — residual and orthogonality recorded per cell. Eigenvalue agreement runs at about 1e-15, machine epsilon, flat with N. On tightly clustered spectra agreement loosens to roughly 1e-10, which is a conditioning limit that constrains every eigensolver on that input equally.

~1e-15


eigenvalue agreement, flat with N

max|Δλ| across the bands-native range

1.78e-15


max |Δλ|, bands-native, N = 8,192 → 524,288

0


correctness failures across the campaign

Bring us a matrix.

Tell us the spectra you actually run and the hardware you have to run them on. We send an evaluation build and the harness we measured with, so the first number you see is one you measured yourself.