You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Cross-board summary of **High Performance Linpack (HPL)**runs on consumer RISC-V hardware through the EESSI stack.
3
+
Cross-board summary of **High Performance Linpack (HPL)** on consumer RISC-V hardware through the EESSI stack. Configs and an A/B runner (`run-hpl-ab.sh`) are in [opensolvers/benchmarks/hpl](https://github.com/opensolvers/benchmarks/tree/main/hpl).
4
4
5
-
**Toolchain:** GCC 14.3.0, OpenBLAS 0.3.30, HPL 2.3.0. EESSI runs use `2025.06-001` on [`dev.eessi.io/riscv`](https://www.eessi.io/docs/repositories/dev.eessi.io-riscv/).
**After** — fixed OpenBLAS via EasyBuild + FlexiBLAS backend swap (no HPL rebuild). See [BLAS overview](../scientific-libs/blas.html).
18
+
19
+
## Orange Pi RV2 — detailed results
20
+
21
+
Stock EESSI dispatches RVV `ZVL256B` on the X60, but the unpatched `gemv_n` kernel makes HPL report ~8.5 GFLOP/s while **failing** the residual check (`nan`). With the [easyconfigs#26444](https://github.com/easybuilders/easybuild-easyconfigs/pull/26444) fix, all runs below **PASSED**.
A squarer **2×4** grid beats 1×8 for peak throughput. `HPL_big.dat` needs ~6.6 GB RAM — tight on 8 GB boards.
43
+
44
+
## VisionFive 2
14
45
15
-
**After** — board-specific fixed OpenBLAS via EasyBuild, swapped in at runtime with FlexiBLAS (no HPL rebuild). Details in the [BLAS overview](../scientific-libs/blas.html).
On **VisionFive 2** (scalar U74), stock OpenBLAS uses a generic kernel; the fix adds a tuned U74 micro-kernel ([easyconfigs#26436](https://github.com/easybuilders/easybuild-easyconfigs/pull/26436), [EESSI/docs#818](https://github.com/EESSI/docs/pull/818)).
48
+
## Banana Pi F3
18
49
19
-
On **X60 boards** (RVV 1.0, VLEN=256), stock OpenBLAS already dispatches RVV kernels but **0.3.30's `gemv_n` produces NaN**, so HPL fails its residual check despite reporting plausible GFLOP/s. The fix backports the upstream `gemv_n` correction ([easyconfigs#26444](https://github.com/easybuilders/easybuild-easyconfigs/pull/26444), [OpenBLAS#5408](https://github.com/OpenMathLib/OpenBLAS/pull/5408), [EESSI/docs#819](https://github.com/EESSI/docs/pull/819)). Banana Pi F3 uses the same K1/X60 SoC — the same fix applies; peak result not yet recorded.
50
+
Same K1 / X60 SoC as the Orange Pi RV2 — same stock failure and same [easyconfigs#26444](https://github.com/easybuilders/easybuild-easyconfigs/pull/26444)fix applies. Peak HPL not yet recorded.
With the fixed backend, scalar-vs-RVV A/B ([benchmarks/hpl](https://github.com/opensolvers/benchmarks/tree/main/hpl)): **6.41 → 11.55 GFLOP/s** (N=8000, 1×8) and **7.38 → 13.41 GFLOP/s** (N=28672, 1×8).
16
18
| Residual (N=8000, 1×8) |`nan`| 4.04e-03 |
17
19
18
20
**Before** — stock EESSI OpenBLAS 0.3.30 (RVV `gemv_n` bug). **After** — fixed OpenBLAS built with `TARGET=RISCV64_ZVL256B` and a backported `gemv_n` patch ([easyconfigs#26444](https://github.com/easybuilders/easybuild-easyconfigs/pull/26444)), swapped in via FlexiBLAS — no HPL rebuild.
Improvements to **OpenBLAS 0.3.30** on RISC-V boards in this project — built via EasyBuild, deployed through [EESSI](https://www.eessi.io/) with **FlexiBLAS** runtime swapping. See also the [HPL app](../apps/hpl.html) for end-to-end benchmark results.
3
+
Improvements to **OpenBLAS 0.3.30** on RISC-V boards — built via EasyBuild, deployed through [EESSI](https://www.eessi.io/) with **FlexiBLAS** runtime swapping. Verification tools and A/B scripts live in the [opensolvers/benchmarks](https://github.com/opensolvers/benchmarks) repo (`dgemm/`, `numpy/`).
|[Banana Pi F3](../boards/F3.html) — same K1 / X60 SoC | Same RVV `gemv_n` bug as RV2 | Same [easyconfigs#26444](https://github.com/easybuilders/easybuild-easyconfigs/pull/26444) fix | Fix applies; peak HPL not yet recorded |
12
+
|[Orange Pi RV2](../boards/RV2.html) — 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](../apps/hpl.html) and A/B tables below |
13
+
|[Banana Pi F3](../boards/F3.html) — same K1 / X60 SoC | Same RVV `gemv_n` bug as RV2 | Same [easyconfigs#26444](https://github.com/easybuilders/easybuild-easyconfigs/pull/26444) fix | Fix applies; peak results not yet recorded |
14
+
15
+
## X60 A/B — patched RVV vs scalar (Orange Pi RV2)
16
+
17
+
All runs use a **fixed** RVV OpenBLAS (`gemv_n` patch) swapped in via FlexiBLAS. Source: [benchmarks/dgemm](https://github.com/opensolvers/benchmarks/tree/main/dgemm), [benchmarks/numpy](https://github.com/opensolvers/benchmarks/tree/main/numpy).
| NumPy `eigvalsh` N=2048, 8 threads | 10.54 s | 6.72 s |**1.6×**|
24
+
25
+
## X60 — isolating the `gemv_n` bug (`difftest`)
26
+
27
+
The [benchmarks `difftest`](https://github.com/opensolvers/benchmarks/blob/main/dgemm/difftest.c) tool `dlopen`s a BLAS `.so` and reports NaN counts per routine:
28
+
29
+
| Backend |`dgemv` NaN |`dgemm` NaN |`dgemv` sum |
Build from a PR with `eb --from-pr <num> --robot` into an **EESSI-extend** user install, then register with `flexiblas add` / `flexiblas default` — no need to rebuild downstream apps like HPL.
44
+
Build with `eb --from-pr <num> --robot` into an **EESSI-extend** user install, then `flexiblas add` / `flexiblas default` — no downstream rebuild.
23
45
24
46
## Notes
25
47
26
48
-**U74** — performance kernel; stock OpenBLAS works but leaves FP throughput on the table.
27
-
-**X60** — correctness fix first: the stock EESSI `DYNAMIC_ARCH`build *does* dispatch RVV`ZVL256B` kernels, but 0.3.30's broken `gemv_n`makes HPL silently wrong. OpenBLAS **≥ 0.3.34** should carry the fix natively and improve RVV performance further.
28
-
-On the experimental `dev.eessi.io/riscv` toolchain, pin a valid `-march` via `EASYBUILD_OPTARCH`when building (see board walkthroughs).
49
+
-**X60** — correctness fix first. Stock EESSI `DYNAMIC_ARCH`*does* dispatch RVV, but 0.3.30's broken `gemv_n`corrupts BLAS-2 paths. OpenBLAS **≥ 0.3.34** should fix this natively.
50
+
-Pin a valid `-march` via `EASYBUILD_OPTARCH`on the experimental `dev.eessi.io/riscv` toolchain (see board walkthroughs).
[ELPA](https://elpa.mpcdf.mpg.de/) is a dense real-symmetric eigensolver used in DFT codes (CP2K, VASP, ELSI). It exercises a **mix of BLAS-2 and BLAS-3** (`dsymv`, `dsyr2k`, `dgemm`, `dtrmm`) — a more representative BLAS probe than raw `dgemm`.
The stock vector backend is faster than scalar but **wrong** — the same OpenBLAS 0.3.30 `gemv_n` NaN bug that breaks [HPL](../apps/hpl.html). With the patch, RVV is **1.58×** faster than scalar (54.92 / 34.81) and numerically correct.
18
+
19
+
Speedup is smaller than pure `dgemm` (~2.3×) because tridiagonalization is latency-bound BLAS-2 — by design.
20
+
21
+
See also the [BLAS overview](blas.html) and [LAPACK](lapack.html) NumPy probe.
LAPACK correctness and performance here are probed through **NumPy** (`eigvalsh` → `dsyevd`) and pure BLAS (`A @ B` → `dgemm`) — a real-application path for SciPy/NumPy stacks on EESSI.
Backends swapped via FlexiBLAS on a NumPy linked against the FlexiBLAS hub (`SciPy-bundle` module). Patched RVV OpenBLAS uses the `gemv_n` fix from [easyconfigs#26444](https://github.com/easybuilders/easybuild-easyconfigs/pull/26444).
| EIGH (`eigvalsh`, N=2048) | 10.54 s | 6.72 s |**1.6×**|
15
+
16
+
Both patched runs are **finite** (correct through real LAPACK). The eigensolver speedup is lower than DGEMM because `eigvalsh` mixes BLAS-3 with BLAS-2 tridiagonalization — the same pattern seen in [ELPA](elpa.html).
17
+
18
+
Stock EESSI default RVV would return NaN on the eigensolver path; see the [BLAS `difftest` table](blas.html) for how the fault isolates to `dgemv`.
Nav config: `_config.yml` (`navigation`, `navigation_boards`, `navigation_apps`, `navigation_scientific_libs`). Rendered in `_includes/header.html`. Cayman theme requires `_layouts/default.html` override to include the header.
0 commit comments