Skip to content

docs: the NOAA record after #191 with a 10-run median; plan 005, W3SRCE points in lanes - #197

Merged
h0ffmann merged 5 commits into
mainfrom
goal/c3e7eecf-3917-noaa-record-production
Oct 18, 2026
Merged

h0ffmann merged 5 commits into
mainfrom
goal/c3e7eecf-3917-noaa-record-production

Conversation

@h0ffmann

@h0ffmann h0ffmann commented Oct 18, 2026 •

Copy link
Copy Markdown
Owner

Before. docs/NOAA_PROGRESS_RECORD_202610.md described the fork at 80644ba9 and a six-part preset, and quoted speed-ups measured before #191 (1.5 to 2.4). One loaded run after #191 had Kokkos slower than the Fortran (46.4 s against 31.8 s). The batched W3SRCE ran one sea point per team, with everything but the DIA on one thread, and the per-point sums g++ cannot vectorise.

After.

  • The NOAA record covers the pin 50a10730 and the seven-part preset with CPRT. It describes strict mode, the NaN fill of a stale host VA and the one copy of the spectrum to the device on full. It lists 22 regtest entries with 0 files different and the four FAIL rows you keep. A status table opens it.
  • Its speed figure is a median of ten alternated runs on main: NOAA WW3 26.18 s, Kokkos resident 15.84 s, 1.65 times less wall time, every output byte-identical to the first run's. Regtest pending ⚠: 22 entries, not the whole matrix.
  • The READMEs and the gap list are updated: rows 6, 7 and 13 are now at the pin.
  • Plan 005 (docs/compound/plans/2026-10-18-005-srce-points-in-lanes-plan.md): sea points in the vector lanes of the batched W3SRCE. It gives the per-lane parity argument and seven units.
    • S0: a one-thread profile of today's batch (docs/log/2026-10-18-srce-lanes-s0-profile.md). It puts 51 % of the samples in the scalar per-point routines lanes can vectorise, 39 % in the DIA and 9 % in libm.
    • L1, the lane layer: W3SRCE's sections are member functions of SrcePoint, with bodies moved verbatim. w3srce_lanes runs up to eight points per team in turns, set by WW_KOKKOS_SRCE_LANES (default 1). smoke and full are byte-identical to the Fortran with 1 and 8.

Goal c3e7eecf-3917, Claude Code session ec4548a3-46a8-46e2-be0a-2d74c3e7eecf. Follows the "After merge" list of #191.

Evidence

Machine: Intel Core i9-14900, 32 threads, switch_lab_ompg, OpenMP backend, WW3@50a10730.

Check Result
bash scripts/ww3-gpu.sh --ww3-gpu full --cpu --kokkos resident --repeat 10, code tree identical to 5cd0140 medians 26.18 / 15.84 s, 1.65x; every output byte-identical to run 1's; load 2.3 at start
the owner's just regtest-selected on 5cd0140 (ww3-gpu-3) ww3_tp2.15 x4 and ww3_ts2 ST4_PR3_UQ: test.comp 0/23, 0/23, 0/23, 0/25, 0/22, nccmp-tol PASS, SRCE spectra 6 900 to 137 000; smoke byte-identical
L1: smoke, full with WW_KOKKOS_STRICT=1 WW_KOKKOS_VA_POISON=1, WW_KOKKOS_SRCE_LANES 1 and 8 every model file byte-identical to the Fortran of the same executable; counter shows 1 and 8 points per team
just kokkos-test serial-debug, openmp-release 11/11 each, no warning
scripts/vale.sh, lychee --offline, port_score.py --check, figures.py check, python3 -m unittest discover tests (clean worktree) pass

Needs your review

  • Loop nesting: L1 changes the order in which the points of a team take their turns (AGENTS.md, "Porting"). It changes no point's arithmetic, and the moved bodies are verbatim.
  • WW_KOKKOS_SRCE_LANES is a new run-time variable. Its default of 1 is today's path, and a device always uses 1.

Still in this PR

  • L2: W3SIN4's stress scan on 8-wide vectors, one point per lane. It is bit-identical on smoke and full, but not committed until a pinned one-thread timing shows its gain.
  • The CUDA --build-only check of the lane code, and the regtest selection with 8 points per team.
  • The restart pair (scripts/restart_pair.sh) has not run.

🤖 Generated with Claude Code

…main

The record for NOAA's wave modellers still described the fork at 80644ba9 and a six-part
preset, and quoted speed-ups measured before #191. It now gives the pin 50a10730, the seven
parts with CPRT, the preset variable, strict mode, the NaN fill of a stale host VA, the one
copy to the device on full, and the 22 regtest entries of the U3 log with the four kept FAIL
rows and their reasons. A status table up front answers what such a reader asks first,
with a link to the gap list. The speed lines now carry the median of three on the merged code
(29.83 s NOAA WW3, 19.99 s Kokkos, 1.49) and the loaded run where Kokkos was slower, both
marked as measured on a shared machine. The gap list marks rows 6, 7 and 13 as at the pin.
The READMEs link the record and give the patch footprint at the new pin.

Goal c3e7eecf-3917, Claude Code session ec4548a3-46a8-46e2-be0a-2d74c3e7eecf.

Tested: bash scripts/ww3-gpu.sh --ww3-gpu full --cpu --kokkos resident --repeat 3 at 5cd0140 (every output byte-identical, medians 29.83 s / 19.99 s, load 1.8 to 24.9); scripts/vale.sh on the three English files, 0 errors; lychee --offline on the four files, 0 errors; python3 -m unittest discover tests, 88 OK in a clean worktree (test_results fails in this checkout only on the untracked .claude/worktrees copy); git -C WW3 diff --stat 03adda91 50a10730 -- model and a script over its -U0 hunks for the patch claims
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@h0ffmann h0ffmann changed the title docs: the NOAA progress record after #191 docs: the NOAA progress record after #191, with a median on main Oct 18, 2026
h0ffmann and others added 4 commits October 18, 2026 17:08
The owner fast-forwarded the fork's ww3-gpu/kokkos-pnt from 80644ba9 to 50a10730, so the
integration branch again holds the pin and the README rows name it, as before #191.

Tested: git -C WW3 ls-remote origin shows ww3-gpu/kokkos-pnt and ww3-gpu/integ-fixes both at 50a10730
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The owner asked for item 1 of the opportunity ranking in this PR: the batched W3SRCE runs W
sea points at once, one per vector lane. The plan gives the parity argument (per-lane
arithmetic in the Fortran's order, no cross-lane sum, masks for branches, libm scalar per
lane) and seven units. Unit S0, a one-thread gdb-sampled profile of today's batch on full,
finds 51.1 % of its samples in the scalar per-point routines lanes can vectorise (W3SDS4,
W3SIN4, w3srce_team, W3SPR4), 39.0 % in the DIA, which #193's halo already vectorises over
directions, and only 8.9 % in libm and libmvec. So the plan goes on to its lane layer.

Tested: the S0 profile of docs/log/2026-10-18-srce-lanes-s0-profile.md (1 602 samples, out_grd.ww3 byte-identical to the timing run's Kokkos output); scripts/vale.sh on the plan and the log, 0 errors; lychee --offline on the plan, the log and docs/log/README.md, 0 errors; python3 scripts/figures.py check, current
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…lan 005 L1)

Unit L1 of plan 005, the lane layer. The batched kernel's sections become member functions of
SrcePoint (init, step_a, dia, step_c, finish) whose bodies are the one-point kernel's
statements, moved without a change; w3srce_team composes them as before. w3srce_lanes runs
them for up to eight points per team, each section for every point still in the integration
loop in turn, and each point's DIA on the whole team. A point reads and writes only its own
arrays, so the points' turns cannot change a bit. WW_KOKKOS_SRCE_LANES (1 to 8, default 1,
host backends only) sets the number and the exit counters print it. Nothing is vectorised
across points yet; L2 does that on the layer.

Tested: just kokkos-test openmp-release and serial-debug, 11/11 each, no warning; bash scripts/ww3-gpu.sh --ww3-gpu smoke and full --cpu --kokkos resident with WW_KOKKOS_STRICT=1 WW_KOKKOS_VA_POISON=1, WW_KOKKOS_SRCE_LANES unset (1) and 8: every model file byte-identical to the Fortran of the same executable, every file but the NetCDF to --ww3, nccmp-tol PASS, counter shows 1 and 8 points per team; the four moved bodies found verbatim in order (a line comparison); python3 scripts/port_score.py --write then --check; scripts/vale.sh and lychee --offline on the changed Markdown, 0 errors
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The owner asked for ten runs once the other worker was idle. On the merged code (5cd0140,
WW3 50a10730), full case, 32 threads, ten alternated runs each: NOAA WW3 median 26.18 s,
the Kokkos resident runtime 15.84 s, 1.65 times less wall time, every output byte-identical
to the first run's. The machine was idle at the start (load 2.3). This replaces the
shared-machine median of three as the record's figure; the speed still says regtest pending,
since 22 entries and not the whole matrix have passed on that commit.

Tested: bash scripts/ww3-gpu.sh --ww3-gpu full --cpu --kokkos resident --repeat 10 with the code tree identical to 5cd0140 (git diff --stat empty for kokkos scripts regtests switches), 2026-10-18 21:21-21:32 UTC; scripts/vale.sh on the record, 0 errors
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@h0ffmann h0ffmann changed the title docs: the NOAA progress record after #191, with a median on main docs: the NOAA record after #191 with a 10-run median; plan 005, W3SRCE points in lanes Oct 18, 2026
@h0ffmann
h0ffmann merged commit 332e5a0 into main Oct 18, 2026
10 checks passed
h0ffmann added a commit that referenced this pull request Oct 18, 2026
Brings in #197 (the NOAA record, plan 005, the S0 log and L1). One conflict, in the dated
table of docs/log/README.md: both sides appended a 2026-10-18 row; the log is append-only, so
both rows are kept, main's first.

Tested: scripts/vale.sh and lychee --offline on docs/log/README.md and the PR's four files, 0 errors; python3 scripts/figures.py check, current
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
h0ffmann added a commit that referenced this pull request Oct 18, 2026
What this session finished (#197: the NOAA record and its ten-run median, plan 005, S0, L1;
the merge that unblocked #198), what is open (#199's regtest run and review, plan 005 L3 to
L7, the uncommitted opportunity and GFS-Wave analysis), what waits on the owner, and the traps
met: unpinned one-thread timings on a hybrid CPU, the load average counting the job itself,
g++'s -ftrapping-math and lane loops, -Wpsabi without -march, pkill -f killing its own shell.

Tested: scripts/vale.sh on the entry and docs/log/README.md, exit 0, 0 errors; lychee --offline on both, 0 errors
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant