Skip to content

Commit 69bb9bd

Browse files
authored
Merge pull request #30 from opensolvers/site-updates
Add U74 video production pack
2 parents 3b0b4be + 85b7b71 commit 69bb9bd

6 files changed

Lines changed: 452 additions & 0 deletions

File tree

video/u74/README.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# U74 progress video — hybrid production pack
2+
3+
**Status:** assets ready · **no render yet**
4+
**Language:** English
5+
**Format:** 16:9 · 1080p target · ~75 s
6+
**Style:** motion slides (screen-capture) + terminal clip(s)
7+
8+
## What’s in this folder
9+
10+
| File | Purpose |
11+
| ---- | ------- |
12+
| [`script.en.md`](script.en.md) | Voiceover with timestamps (~75 s) |
13+
| [`storyboard.md`](storyboard.md) | Shot list: motion vs terminal, edit notes |
14+
| [`terminal-recording.md`](terminal-recording.md) | Exact commands to record on VisionFive 2 |
15+
| [`slides/index.html`](slides/index.html) | Branded slide deck — open in browser, record with OBS/etc. |
16+
17+
## How to produce (when ready to render)
18+
19+
1. **Record motion (~45 s)** — open `slides/index.html` fullscreen (1920×1080). Advance with → or Space; optional auto-play via `?autoplay=1`. Screen-record at 60 fps.
20+
2. **Record terminal (~25 s)** — follow [`terminal-recording.md`](terminal-recording.md) on real VF2 hardware (or use placeholder if unavailable).
21+
3. **Record voiceover** — read [`script.en.md`](script.en.md) in a quiet room; export WAV/MP3.
22+
4. **Edit** — cut to [`storyboard.md`](storyboard.md); duck music under VO if used; end card = slide 6.
23+
5. **Export** — H.264 1080p, ~8 Mbps; optional 9:16 centre crop for social.
24+
25+
## Site links to cite on end card
26+
27+
- [opensolvers.com](https://www.opensolvers.com)
28+
- [VisionFive 2 board page](https://www.opensolvers.com/boards/VisionFive2.html)
29+
- [EESSI/docs#818](https://github.com/EESSI/docs/pull/818)
30+
- [easyconfigs#26436](https://github.com/easybuilders/easybuild-easyconfigs/pull/26436)
31+
32+
## Do not do yet
33+
34+
- Remotion / ffmpeg final render (explicitly deferred)
35+
- Upload to YouTube or embed on site until review

video/u74/script.en.md

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# Voiceover script — U74 on VisionFive 2 (English)
2+
3+
**Target duration:** 72–78 seconds
4+
**Pace:** ~140 words/minute · **Word count:** ~175
5+
6+
Record as one take per section if easier; align to [`storyboard.md`](storyboard.md).
7+
8+
---
9+
10+
## [0:00 – 0:14] Setup — SLIDE 1 → 2
11+
12+
OpenSolvers benchmarks open-source scientific software on real RISC-V hardware — through the EESSI stack, without rebuilding every application.
13+
14+
Our first board is the StarFive VisionFive 2: four SiFive U74 cores at one point five gigahertz. Scalar RV64GC — no vector extension. On this chip, our optimisation target is the **Scalar** path: tuned BLAS kernels, not RVV.
15+
16+
---
17+
18+
## [0:14 – 0:28] Problem — SLIDE 3
19+
20+
Out of the box, stock OpenBLAS on EESSI uses a generic C GEMM kernel.
21+
22+
High Performance Linpack on four cores reaches about **three point one three** gigaflops per second. The answer is correct — but we’re leaving throughput on the table.
23+
24+
---
25+
26+
## [0:28 – 0:52] Fix — SLIDE 4 + TERMINAL CLIP
27+
28+
We built an U74-tuned OpenBLAS with a hand-tuned **four-by-four DGEMM** micro-kernel — `TARGET=U74` — and swapped it in at runtime with FlexiBLAS.
29+
30+
Same HPL binary. No rebuild.
31+
32+
*(Terminal clip: module load, FlexiBLAS list, optional xhpl banner)*
33+
34+
Single-core DGEMM goes from about **one point four** to **one point eight** gigaflops per second. Four-core GEMM hits **six point three**. The kernel change propagates straight into Linpack.
35+
36+
---
37+
38+
## [0:52 – 1:15] Result — SLIDE 5 → 6
39+
40+
End-to-end HPL on the VisionFive 2: **three point one three** to **five point two eight** gigaflops per second — **one point seven times** faster. Wall time drops from **two hundred thirteen** seconds to **one hundred twenty-six**.
41+
42+
Same methodology we use on SpaceMiT X60 boards — change one backend, verify correctness first — but on U74 the story is **silicon-tuned scalar**, not fixing a broken vector path.
43+
44+
Everything is documented at **opensolvers dot com**.
45+
46+
---
47+
48+
## Pronunciation / on-screen numbers
49+
50+
| Spoken | On screen |
51+
| ------ | --------- |
52+
| three point one three | 3.13 GFLOP/s |
53+
| five point two eight | 5.28 GFLOP/s |
54+
| one point seven times | 1.69× |
55+
| one point four → one point eight | 1.4 → 1.77 GFLOP/s |
56+
| six point three | 6.31 GFLOP/s |
57+
| two hundred thirteen → one hundred twenty-six | 213 s → 126 s |

video/u74/slides/index.html

Lines changed: 236 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,236 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1">
6+
<title>OpenSolvers — U74 progress (slides)</title>
7+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
8+
<link href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;600;700&display=swap" rel="stylesheet">
9+
<style>
10+
:root {
11+
--blue: #155799;
12+
--green: #159957;
13+
--teal: #157878;
14+
--link: #1e6bb8;
15+
--text: #606c71;
16+
--white: #fff;
17+
}
18+
* { box-sizing: border-box; margin: 0; padding: 0; }
19+
html, body { height: 100%; overflow: hidden; font-family: "Open Sans", sans-serif; background: #111; }
20+
.deck { height: 100%; position: relative; }
21+
.slide {
22+
position: absolute; inset: 0;
23+
display: flex; flex-direction: column; align-items: center; justify-content: center;
24+
padding: 3rem 4rem;
25+
opacity: 0; pointer-events: none;
26+
transition: opacity 0.45s ease;
27+
background: var(--white);
28+
}
29+
.slide.active { opacity: 1; pointer-events: auto; z-index: 1; }
30+
.slide--hero {
31+
background: linear-gradient(120deg, var(--blue), var(--green));
32+
color: var(--white); text-align: center;
33+
}
34+
.slide--hero h1 { font-size: 3.2rem; font-weight: 700; margin-bottom: 0.5rem; }
35+
.slide--hero p { font-size: 1.35rem; opacity: 0.85; max-width: 42rem; line-height: 1.5; }
36+
.slide h2 { color: var(--green); font-size: 2rem; font-weight: 600; margin-bottom: 1.5rem; text-align: center; }
37+
.slide p, .slide li { color: var(--text); font-size: 1.15rem; line-height: 1.55; }
38+
.row { display: flex; gap: 2.5rem; align-items: center; max-width: 1100px; width: 100%; }
39+
.row--center { justify-content: center; flex-wrap: wrap; }
40+
.board-img {
41+
width: 280px; border-radius: 0.5rem;
42+
box-shadow: 0 8px 32px rgba(21, 87, 153, 0.2);
43+
}
44+
.diagram { max-width: 560px; width: 100%; }
45+
.diagram img { width: 100%; height: auto; }
46+
.scalar-glow {
47+
outline: 3px solid var(--blue);
48+
outline-offset: 6px;
49+
border-radius: 12px;
50+
animation: pulse 2s ease-in-out infinite;
51+
}
52+
@keyframes pulse {
53+
0%, 100% { outline-color: var(--blue); box-shadow: 0 0 0 0 rgba(21, 87, 153, 0.4); }
54+
50% { outline-color: var(--link); box-shadow: 0 0 24px 4px rgba(30, 107, 184, 0.35); }
55+
}
56+
table {
57+
border-collapse: collapse; font-size: 1.1rem; margin: 0 auto;
58+
box-shadow: 0 4px 20px rgba(0,0,0,0.08); border-radius: 0.5rem; overflow: hidden;
59+
}
60+
th, td { padding: 0.75rem 1.25rem; border: 1px solid #e9ebec; text-align: left; }
61+
th { background: #f3f6fa; color: var(--green); font-weight: 600; }
62+
.badge {
63+
display: inline-block; padding: 0.35rem 0.9rem; border-radius: 0.35rem;
64+
font-weight: 700; font-size: 1.5rem; margin-top: 1rem;
65+
background: linear-gradient(120deg, var(--blue), var(--green));
66+
color: var(--white);
67+
}
68+
.stack {
69+
display: flex; flex-direction: column; align-items: center; gap: 0.5rem;
70+
font-size: 1.05rem; font-weight: 600;
71+
}
72+
.stack-box {
73+
padding: 0.6rem 1.5rem; border: 2px solid var(--blue); border-radius: 0.4rem;
74+
min-width: 220px; text-align: center; color: var(--blue);
75+
}
76+
.stack-arrow { color: var(--text); font-size: 1.2rem; }
77+
.stack-box--highlight { background: rgba(21, 121, 87, 0.12); border-color: var(--green); color: var(--green); }
78+
.end-links { text-align: center; margin-top: 1.5rem; }
79+
.end-links a { color: var(--link); text-decoration: none; font-size: 1.05rem; display: block; margin: 0.35rem 0; }
80+
.end-links a:hover { text-decoration: underline; }
81+
.hint {
82+
position: fixed; bottom: 1rem; right: 1.25rem;
83+
font-size: 0.8rem; color: rgba(255,255,255,0.5);
84+
z-index: 10; pointer-events: none;
85+
}
86+
.slide:not(.slide--hero) .hint { color: #999; }
87+
.counter {
88+
position: fixed; bottom: 1rem; left: 1.25rem;
89+
font-size: 0.85rem; color: #999; z-index: 10;
90+
}
91+
.before { color: #819198; }
92+
.after { color: var(--green); font-weight: 700; }
93+
ul { margin: 1rem 0 0 1.5rem; }
94+
ul li { margin: 0.4rem 0; }
95+
</style>
96+
</head>
97+
<body>
98+
<div class="deck" id="deck">
99+
100+
<!-- Slide 1: Title -->
101+
<section class="slide slide--hero active" data-duration="6">
102+
<h1>OpenSolvers</h1>
103+
<p>U74 progress on the VisionFive 2 — scalar BLAS tuning through EESSI</p>
104+
<p style="margin-top:1.5rem;font-size:1rem;opacity:0.7">RISC-V learnings and fun</p>
105+
</section>
106+
107+
<!-- Slide 2: Board + Scalar -->
108+
<section class="slide" data-duration="8">
109+
<h2>VisionFive 2 — Scalar path (RV64GC)</h2>
110+
<div class="row row--center">
111+
<img class="board-img" src="../../boards/vf2.jpg" alt="StarFive VisionFive 2 board">
112+
<div>
113+
<ul>
114+
<li><strong>JH7110</strong> — 4× SiFive U74 @ 1.5 GHz</li>
115+
<li><strong>rv64gc</strong> — scalar, no RVV</li>
116+
<li>Optimisation target: tuned <strong>BLAS</strong>, not vector extensions</li>
117+
</ul>
118+
<div class="diagram scalar-glow" style="margin-top:1.25rem">
119+
<img src="../../assets/images/compute-backends.svg" alt="Compute paths — Scalar highlighted">
120+
</div>
121+
</div>
122+
</div>
123+
</section>
124+
125+
<!-- Slide 3: Before -->
126+
<section class="slide" data-duration="14">
127+
<h2>Before — stock OpenBLAS</h2>
128+
<p style="text-align:center;margin-bottom:1.25rem;max-width:36rem">
129+
Generic <code>RISCV64_GENERIC</code> C GEMM kernel — correct, but slow
130+
</p>
131+
<table>
132+
<thead><tr><th></th><th>HPL (4 cores, N=10000)</th></tr></thead>
133+
<tbody>
134+
<tr><td><strong>Before</strong></td><td class="before"><strong>3.13 GFLOP/s</strong> · 213 s</td></tr>
135+
<tr><td><strong>After</strong></td><td class="after"></td></tr>
136+
</tbody>
137+
</table>
138+
</section>
139+
140+
<!-- Slide 4: Fix stack -->
141+
<section class="slide" data-duration="10">
142+
<h2>The fix — one backend swap</h2>
143+
<div class="row row--center">
144+
<div class="stack">
145+
<div class="stack-box">EESSI · HPL 2.3</div>
146+
<div class="stack-arrow"></div>
147+
<div class="stack-box">FlexiBLAS (runtime swap)</div>
148+
<div class="stack-arrow"></div>
149+
<div class="stack-box stack-box--highlight">OpenBLAS TARGET=U74<br><span style="font-weight:400;font-size:0.9rem">4×4 DGEMM micro-kernel</span></div>
150+
</div>
151+
<div style="max-width:22rem">
152+
<ul>
153+
<li>Same <strong>xhpl</strong> binary</li>
154+
<li>No HPL rebuild</li>
155+
<li>easyconfigs#26436 · OpenBLAS#5903</li>
156+
</ul>
157+
</div>
158+
</div>
159+
</section>
160+
161+
<!-- Slide 5: After + numbers -->
162+
<section class="slide" data-duration="13">
163+
<h2>After — U74-tuned OpenBLAS</h2>
164+
<table style="margin-bottom:1rem">
165+
<thead><tr><th>Metric</th><th>Before</th><th>After</th></tr></thead>
166+
<tbody>
167+
<tr><td>HPL (4 cores)</td><td class="before">3.13 GFLOP/s</td><td class="after">5.28 GFLOP/s</td></tr>
168+
<tr><td>Wall time</td><td class="before">213 s</td><td class="after">126 s</td></tr>
169+
<tr><td>DGEMM (1 core)</td><td class="before">~1.4 GFLOP/s</td><td class="after">1.77 GFLOP/s</td></tr>
170+
<tr><td>DGEMM (4 cores)</td><td class="before"></td><td class="after">6.31 GFLOP/s</td></tr>
171+
</tbody>
172+
</table>
173+
<div style="text-align:center"><span class="badge">1.69× faster HPL</span></div>
174+
<p style="text-align:center;margin-top:1rem;font-size:0.95rem;max-width:40rem">
175+
U74: silicon-tuned <strong>scalar</strong>. X60 boards: RVV + IME — same “one backend” methodology.
176+
</p>
177+
</section>
178+
179+
<!-- Slide 6: End card -->
180+
<section class="slide slide--hero" data-duration="10">
181+
<h1>opensolvers.com</h1>
182+
<p>Full walkthroughs, benchmarks, and board notes</p>
183+
<div class="end-links">
184+
<a href="https://www.opensolvers.com/boards/VisionFive2.html">VisionFive 2 · HPL 3.13 → 5.28 GFLOP/s</a>
185+
<a href="https://github.com/EESSI/docs/pull/818">EESSI/docs#818 — U74 via EESSI</a>
186+
<a href="https://github.com/easybuilders/easybuild-easyconfigs/pull/26436">easyconfigs#26436 — U74 OpenBLAS</a>
187+
</div>
188+
</section>
189+
190+
</div>
191+
192+
<div class="counter" id="counter">1 / 6</div>
193+
<div class="hint">← → or Space · <kbd>F</kbd> fullscreen · <kbd>?</kbd>autoplay</div>
194+
195+
<script>
196+
const slides = [...document.querySelectorAll(".slide")];
197+
const counter = document.getElementById("counter");
198+
let idx = 0;
199+
let autoplayTimer = null;
200+
201+
function show(i) {
202+
idx = (i + slides.length) % slides.length;
203+
slides.forEach((s, n) => s.classList.toggle("active", n === idx));
204+
counter.textContent = `${idx + 1} / ${slides.length}`;
205+
}
206+
207+
function next() { show(idx + 1); }
208+
function prev() { show(idx - 1); }
209+
210+
function startAutoplay() {
211+
stopAutoplay();
212+
const run = () => {
213+
const dur = (parseInt(slides[idx].dataset.duration, 10) || 8) * 1000;
214+
autoplayTimer = setTimeout(() => { next(); run(); }, dur);
215+
};
216+
run();
217+
}
218+
function stopAutoplay() {
219+
if (autoplayTimer) clearTimeout(autoplayTimer);
220+
autoplayTimer = null;
221+
}
222+
223+
document.addEventListener("keydown", (e) => {
224+
if (e.key === "ArrowRight" || e.key === " ") { e.preventDefault(); stopAutoplay(); next(); }
225+
if (e.key === "ArrowLeft") { e.preventDefault(); stopAutoplay(); prev(); }
226+
if (e.key === "f" || e.key === "F") {
227+
if (!document.fullscreenElement) document.documentElement.requestFullscreen();
228+
else document.exitFullscreen();
229+
}
230+
});
231+
232+
if (location.search.includes("autoplay=1")) startAutoplay();
233+
show(0);
234+
</script>
235+
</body>
236+
</html>

video/u74/storyboard.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# Storyboard — hybrid (motion + terminal)
2+
3+
**Total runtime:** ~75 s · **Aspect:** 16:9 · **No render yet**
4+
5+
Legend: **M** = motion (record `slides/index.html`) · **T** = terminal (record on VF2)
6+
7+
| # | Time | Type | Visual | Audio (script section) | Notes |
8+
| - | ---- | ---- | ------ | ---------------------- | ----- |
9+
| 1 | 0:00–0:06 | **M** | Slide 1 — title + tagline | “OpenSolvers benchmarks…” | Fade in from black |
10+
| 2 | 0:06–0:14 | **M** | Slide 2 — board + Scalar highlight | “…VisionFive 2… Scalar path” | Pulse highlight on Scalar box |
11+
| 3 | 0:14–0:28 | **M** | Slide 3 — Before 3.13 GFLOP/s | “Out of the box… three point one three” | Animate “Before” row |
12+
| 4 | 0:28–0:38 | **M** | Slide 4 — stack diagram | “We built U74-tuned OpenBLAS…” | Hold while VO explains FlexiBLAS |
13+
| 5 | 0:38–0:52 | **T** | Terminal: EESSI + FlexiBLAS + xhpl snippet | “Same HPL binary… six point three” | See `terminal-recording.md`; cut to best 12–14 s |
14+
| 6 | 0:52–1:05 | **M** | Slide 5 — After 5.28 + speedup table | “End-to-end HPL… one hundred twenty-six” | Animate After row + 1.69× badge |
15+
| 7 | 1:05–1:15 | **M** | Slide 6 — end card + links | “Same methodology… opensolvers dot com” | Hold 3 s after VO ends |
16+
17+
## Edit rhythm
18+
19+
- **Crossfade** M↔T at shot 4→5 and 5→6 (0.3 s).
20+
- **Lower third** optional on terminal clip: `VisionFive 2 · EESSI 2025.06 · FlexiBLAS swap`.
21+
- **Music:** optional subtle bed (−18 dB under VO); none in terminal clip.
22+
- **Captions:** burn-in key numbers (3.13 → 5.28 GFLOP/s) on slide 5.
23+
24+
## Asset checklist before recording
25+
26+
- [ ] VisionFive 2 powered, EESSI/CVMFS working
27+
- [ ] U74 OpenBLAS module or FlexiBLAS backend registered
28+
- [ ] Terminal font ≥ 18 pt, dark theme, 1920×1080 display scaling 100%
29+
- [ ] `slides/index.html` tested fullscreen in Chrome/Safari
30+
- [ ] Mic test; room tone sample for noise reduction
31+
32+
## Deferred (not in this pass)
33+
34+
- Remotion project / automated render
35+
- Background music file
36+
- YouTube thumbnail

0 commit comments

Comments
 (0)