Name the opponent

A ratio is a comparison between two timings, and it means nothing until the other side is named: which library, which version, which routine, and how many cores it was given. On this site a ratio cannot be written down without that label, because the data structure that holds it refuses to exist without an opponent.

It matters because the opponents are different fights. The default dense routine that deployed code actually calls is one comparison. The expert tridiagonal routine a specialist would call instead is another, much closer one. Blending them produces a number that is true of neither.

Same field, same conditions

  • Same matrix. Both sides receive the identical input, from the same generator, at the same size.
  • Same machine. Both timings are taken on one box. Absolute seconds move between cloud instances of the same type; ratios taken within a machine do not.
  • One core against one core. Threading is a separate question with its own chart, and it is never folded into a headline.
  • Reference arithmetic on both sides. The opponent is reference netlib LAPACK, the same plain-arithmetic field VVE stands on. VVE carries no hand-written processor-specific kernels, so a ratio against a vendor library that does would compare two different playing fields.
  • Median of repeated trials, at least three per cell, full eigendecomposition unless a block says otherwise.

Accuracy is a gate, not a trade

A fast wrong answer is worthless, so every result on both sides is checked before it is timed. The eigenpairs are put back into the original problem and the residual measured; the eigenvectors are checked for orthogonality. A run that fails either test is discarded, and no ratio can come from one side doing less work than the other.

Eigenvalue agreement between the two sides runs at about fifteen digits, the limit of double precision, flat with size. On tightly clustered spectra it loosens to about ten digits, which is a conditioning limit of the input that constrains every eigensolver equally.

VVE and reference LAPACK, the same matrix

  • LAPACK0.70710678118654752
  • VVE0.70710678118654753

agree to the last digit a double can hold


About fifteen digits agree at every size, the limit of what a double can hold. Illustrative digits; the gate is recorded per cell.

Run it twice

A number that exists once on one machine is an anecdote. The whole campaign behind this site was run end to end on two independent sets of hardware, and the spread between the two runs is published with the results rather than averaged away.

Cells measured, cells that came back clean

1,107


cells measured and returned clean, zero timeouts, zero errors, run twice

Watch the slope, not the peak

A single large ratio can be an artefact of one size on one machine. A ratio that doubles every time the problem doubles is the arithmetic signature of one algorithm growing with N² while the other grows with N³, and it cannot be produced by tuning.

The ladder, N = 8,192

91.3×


vs single-threaded reference netlib LAPACK dsyev (the default dense path) — one core against one core; the ratio doubles with each doubling of N

The same discipline applies to memory. The scaling exponent was fitted on small sizes and used to predict the largest run before it was made, and the prediction is published next to the measurement.

Say where it loses

  • Dense, unstructured matrices: no speed claim. Tuned vendor libraries own that case.
  • Small, well-separated problems against the expert tridiagonal routine: LAPACK's dstemr leads until the problem is large, and the record shows the crossover rather than starting the chart past it.
  • The random-disorder family is measured and published because it is where the structural advantage is smallest.
  • The determinism guarantee is per build of VVE, not across versions.

Measure us yourself

The evaluation build ships with the harness that produced these numbers. It names the library that answered each call before it records a timing, applies the same accuracy gate to both sides, and writes the opponent into every result. Run it on your matrices and your hardware, and the first number you see will be one you measured.

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.