BLAS (OpenBLAS)
OpenBLAS on consumer RISC-V boards via EESSI and FlexiBLAS (swap backends without rebuilding apps).
Harness: opensolvers/benchmarks/OpenBLAS. Related: BLIS, NumPy, HPL. Video: NaN Linpack on RISC-V · EESSI blog.
What broke / what we fixed
| Board | Stock problem | Fix | Headline |
|---|---|---|---|
| VisionFive 2 (U74) | Generic 2×2 GEMM only |
4×4 DGEMM asm (TARGET=U74) |
HPL 3.13 → 5.28 GFLOP/s (1.69×) |
| Orange Pi RV2 (X60 RVV) | RVV gemv_n → NaN |
Backport gemv_n fix |
HPL FAILED → 10.53 GFLOP/s; DGEMM 2.3× vs scalar |
| Banana Pi F3 (same K1) | Same gemv_n bug |
Same fix | HPL 11.52 GFLOP/s; DGEMM 2.35× |
| BeagleV-Ahead (C910) | Stock target uses Xuantie v0p7 march |
GCC 14 xtheadvector + th.* GEMM asm |
DGEMM 7.42 / SGEMM 16.58 GFLOP/s (4 cores). Real/double gemm/symm/syrk fail small CBLAS shapes |
Fault is in dgemv only — plain dgemm can look fine on a broken build, which is why HPL / QE / PETSc fail while a GEMM microbench passes.
OpenBLAS 0.3.34 (RV2)
Upstream v0.3.34 (TARGET=RISCV64_ZVL256B) has a working RVV path on X60 — verified with run-034-tests.sh:
| Check | Result |
|---|---|
dgemv NaN |
0 (stock 0.3.30: 768) |
| SYRK PSD / CTRSM | PASS / 2400/0 |
| DGEMM N=2048×8 thr | 15.54 GFLOP/s (~1.6× stock 0.3.30) |
| HPL N=8000 / N=20000 | 11.04 / 10.97 GFLOP/s PASSED |
EESSI still ships 0.3.29/0.3.30; use a local 0.3.34 + FlexiBLAS until the stack bumps.
Packages
| Target | EasyBuild | Upstream |
|---|---|---|
| U74 | easyconfigs#26436 | OpenBLAS#5903 |
| X60 | easyconfigs#26444 | OpenBLAS#5408, #5476 |
eb --from-pr <num> --robot into EESSI-extend, then flexiblas add / flexiblas default.
Reproduce
gcc -O2 bench_dgemm.c -o bench_dgemm -lflexiblas
gcc -O2 difftest.c -o difftest -ldl -lm
OPENBLAS_NUM_THREADS=8 ./bench_dgemm 4096
./difftest /path/to/libopenblas.so
| Tool | Role |
|---|---|
bench_dgemm |
Square GEMM GFLOP/s + C[0] |
difftest |
Level-1/2/3 sums + NaN counts |
verify_ctrsm |
TRSM parameter sweep (VLEN bugs) |