BLAS (OpenBLAS)
Improvements to OpenBLAS 0.3.30 on RISC-V boards — built via EasyBuild, deployed through EESSI with FlexiBLAS runtime swapping. Verification tools and A/B scripts live in the opensolvers/benchmarks repo (dgemm/, numpy/).
Base stack: GCC 14.3.0, OpenBLAS 0.3.30, EESSI 2025.06-001 (dev.eessi.io/riscv).
Improvements
| Board / CPU | Problem (stock 0.3.30) | Fix | Result |
|---|---|---|---|
| VisionFive 2 — SiFive U74 (scalar) | No U74 kernel; falls back to generic RISCV64_GENERIC C 2×2 GEMM |
New 4×4 DGEMM micro-kernel in RV64 assembly, TARGET=U74 |
Single-core DGEMM ~1.4 → 1.77 GFLOP/s; 4-core DGEMM 6.31 GFLOP/s; HPL 1.69× |
| Orange Pi RV2 — SpacemiT X60 (RVV VLEN=256) | RVV gemv_n zeroes an uninitialized vector register → dgemv returns NaN |
Backport upstream gemv_n fix; TARGET=RISCV64_ZVL256B |
Correct dgemv; see HPL and A/B tables below |
| Banana Pi F3 — same K1 / X60 SoC | Same RVV gemv_n bug as RV2 |
Same easyconfigs#26444 fix | Fix applies; peak results not yet recorded |
X60 A/B — patched RVV vs scalar (Orange Pi RV2)
All runs use a fixed RVV OpenBLAS (gemv_n patch) swapped in via FlexiBLAS. Source: benchmarks/dgemm, benchmarks/numpy.
| Probe | Scalar (RISCV64_GENERIC) |
Patched RVV (ZVL256B) |
Speedup |
|---|---|---|---|
bench_dgemm N=2048, 1 core |
1.16 GFLOP/s | 2.62 GFLOP/s | 2.3× |
NumPy A @ B N=4096, 8 threads |
4.77 GFLOP/s | 11.52 GFLOP/s | 2.4× |
NumPy eigvalsh N=2048, 8 threads |
10.54 s | 6.72 s | 1.6× |
X60 — isolating the gemv_n bug (difftest)
The benchmarks difftest tool dlopens a BLAS .so and reports NaN counts per routine:
| Backend | dgemv NaN |
dgemm NaN |
dgemv sum |
|---|---|---|---|
| Stock EESSI, default RVV | 192 | 0 | 198.94 (wrong) |
| Stock EESSI, forced scalar | 0 | 0 | 42.06549 (reference) |
Patched RVV (gemv_n fix) |
0 | 0 | 42.06549 (matches) |
dgemm looks fine on the broken build — which is why a raw GEMM benchmark can pass while HPL and ELPA fail.
Packages
| Target | EasyBuild PR | Upstream OpenBLAS | Walkthrough |
|---|---|---|---|
| SiFive U74 | easyconfigs#26436 | OpenBLAS#5903 | EESSI/docs#818 |
| SpacemiT X60 | easyconfigs#26444 | OpenBLAS#5408, #5476 | EESSI/docs#819 |
Build with eb --from-pr <num> --robot into an EESSI-extend user install, then flexiblas add / flexiblas default — no downstream rebuild.
Notes
- U74 — performance kernel; stock OpenBLAS works but leaves FP throughput on the table.
- X60 — correctness fix first. Stock EESSI
DYNAMIC_ARCHdoes dispatch RVV, but 0.3.30’s brokengemv_ncorrupts BLAS-2 paths. OpenBLAS ≥ 0.3.34 should fix this natively. - Pin a valid
-marchviaEASYBUILD_OPTARCHon the experimentaldev.eessi.io/riscvtoolchain (see board walkthroughs).