NumPy
A SciPy-stack probe for BLAS and LAPACK through NumPy — from opensolvers/benchmarks/numpy (bench_blas.py).
| Kernel | NumPy call | Backend | Metric |
|---|---|---|---|
| DGEMM | A @ B |
dgemm |
GFLOP/s |
| EIGH | np.linalg.eigvalsh(S) |
dsyevd |
seconds |
Unlike raw OpenBLAS verification, eigvalsh exercises BLAS-2 tridiagonalization — a correctness gate for the same gemv_n bug that breaks HPL and ELPA.
module load SciPy-bundle/2025.07-gfbf-2025b
OMP_NUM_THREADS=8 OPENBLAS_NUM_THREADS=8 python3 bench_blas.py [dgemm_N] [eigh_N]
# defaults: dgemm_N=4096 eigh_N=2048
Swap backends per run: OPENBLAS_CORETYPE=RISCV64_GENERIC or FLEXIBLAS=/path/to/libopenblas.so.
Orange Pi RV2 (8 threads, patched RVV)
| Kernel | Scalar | Patched RVV | Speedup |
|---|---|---|---|
| DGEMM N=4096 | 4.77 GFLOP/s | 11.52 GFLOP/s | 2.4× |
| EIGH N=2048 | 10.54 s | 6.72 s | 1.6× |
Both patched results finite. See LAPACK for the LAPACK angle.
Banana Pi F3 (cross-board, 8 threads)
| Kernel | Scalar | Patched RVV | Speedup |
|---|---|---|---|
| DGEMM N=4096 | 4.91 GFLOP/s | 17.51 GFLOP/s | 3.6× |
| EIGH N=2048 | 9.59 s | 5.94 s | 1.6× |
Stock unpatched RVV: eigvalsh raises LinAlgError: Eigenvalues did not converge; DGEMM alone stays finite at 10.94 GFLOP/s (only gemv is broken — see difftest).
Eigensolver speedup (~1.6×) is lower than DGEMM (~2.4–3.6×) because eigvalsh mixes BLAS-3 with latency-bound BLAS-2 — same pattern as ELPA.