Skip to content

Fedora 45 in CI: groff 1.24, col, OpenBLAS's batch crash - #331

Merged
MathieuCAISSA merged 3 commits into
mainfrom
issue-330-fedora45
Nov 3, 2026
Merged

MathieuCAISSA merged 3 commits into
mainfrom
issue-330-fedora45

Conversation

@MathieuCAISSA

Copy link
Copy Markdown
Owner

Closes #330.

fedora:latest became Fedora 45, and the man and flexiblas jobs fail on every PR (#328, #329) and would on main.

  • groff 1.24.1 (first commit): it resets hyphenation from HY at every paragraph, so .nr HY 0 now follows .nh in the four pages. It also renders the header's hyphens as U+2010, so the .TH lines now write \-. Checked with a groff 1.24.1 built locally and with the system's 1.23.
  • col: the man job installs util-linux, which Fedora 45's man-db pulls in only as a weak dependency.
  • OpenBLAS 0.3.28–0.3.34 with DYNAMIC_ARCH segfaults on a batch of small matrices (M·N·K ≤ 100³): Fix: Small matrix gemm_batch with DYNAMIC_ARCH OpenMathLib/OpenBLAS#5980 for the group call, #6086 for the strided one, both fixed for 0.3.35. The benchmark now refuses such a run before the call, saying why (exit 77). Larger sizes and loop are still measured. The second commit adds:
    • a unit test of the version parser;
    • bmb_batch_crash in test_helper.sh;
    • the batch test (the refusal, a sweep whose small size comes last, a batch past 100³);
    • the man page (--batch-mode, EXIT STATUS), the CHANGELOG and AGENTS.md.

Tested:

  • make check passes on Ubuntu's OpenBLAS and on a local 0.3.34 DYNAMIC_ARCH build (the one that crashes);
  • make distcheck and cppcheck pass;
  • the man tests pass strictly under groff 1.24.1 and 1.23;
  • two mutations are caught: the sweep minimum taken from the first value, and the refusal removed.

🤖 Generated with Claude Code

m.caissa and others added 2 commits November 3, 2026 10:50
fedora:latest became Fedora 45, and the man job failed (#330). groff
1.24 resets hyphenation from HY at every paragraph, as it does
adjustment from AD, so .nh lasted one paragraph and the site's URL was
split across a line: .nr HY 0 follows it in the four pages. groff 1.24
also renders the title's hyphen in the header as U+2010, which
test_man_install found once man could run: the .TH lines write \-. And
man runs col, which Fedora 45's man-db no longer pulls in without its
weak dependencies: the job installs util-linux.

Checked with groff 1.24.1 built here and the system's 1.23.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
OpenBLAS 0.3.28 to 0.3.34 built with DYNAMIC_ARCH, as distributions
build it, calls its small-matrix kernel through an offset instead of an
address in a batch whose M x N x K is at most 100^3: the group call
from 0.3.28 (OpenMathLib/OpenBLAS#5980), the strided one from 0.3.31
(#6086), both fixed for 0.3.35. Fedora 45's 0.3.34 made the man job's
strided example segfault (#330). Reproduced here with a 0.3.34
DYNAMIC_ARCH build on every core type, 100^3 crashing and 101^3 not;
a build for one target does not crash.

bmb_build_batch_crash() reads the library's version string; where the
run's smallest product is at most 100^3, the benchmark refuses the
batch mode before calling it: exit 77, the libraries and the upstream
issue said, nothing measured. Larger sizes and loop are measured.
test_bmb_gemm_batch.sh checks the refusal, a sweep whose small size is
not its first, and a batch past 100^3, where bmb_batch_crash says the
library would crash; the alloc failures' group call is at 101.

Checked: make check on Ubuntu's OpenBLAS and on the 0.3.34 DYNAMIC_ARCH
build, distcheck, cppcheck; the sweep minimum taken from the first
value, and the refusal removed, both caught.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MathieuCAISSA

Copy link
Copy Markdown
Owner Author

Review against .github/REVIEWS.md

The core is right: the product of each dimension's minimum is an actual point, in all four -M/-K combinations, so the refusal is exact. These were checked against the source and on the 0.3.34 DYNAMIC_ARCH build:

  • the cut-off (MNK <= 100^3, inclusive) and the offset called as a kernel, in OpenBLAS 0.3.28 and 0.3.34;
  • the C parser and the shell helper agree;
  • Fedora 45's string matches;
  • bmb_mcp and bmb_suite take the 77 as a skip, and verify-sweep.sh (-m 256 -M 33) is past the cut-off.

Findings

  1. The docs promise more than the code does. The man page, CHANGELOG and warning say "larger sizes are measured". The code refuses the whole run as soon as one point is that small. The man page's own example (-m 16:128 --batch-mode group) exits 77 on Fedora 45, its 128³ point included.
  2. Docs left behind.
    • The Known issues entry the issue announced is missing.
    • These still give 77 for a missing mode only: doc/dev/backends.md, doc/dev/benchmarks.md (Batches, and library bugs), bmb_suite(1).
    • The "Also" item, the #6214 bound, is not addressed. It has moved to Test OpenBLAS 0.3.35 when it is out, then bound its fixed bugs #332: fixed in OpenBLAS develop, bounded once 0.3.35 is out.
  3. No CI job runs the new test path. Only the man job has an affected OpenBLAS, and it runs only the man tests. The group refusal is never exercised there. The fail text at test_man_content.sh:191 gives only one cause of 77.
  4. A comment is attached to the wrong function. bmb_range_min() sits between bmb_check_args()'s comment and that function.
  5. A comment gives the wrong reason. "every size swept against the others": without -M/-K, N and K follow M point by point. The conclusion still holds.
  6. Mutations the unit test misses. NO_DYNAMIC_ARCH_X breaks both word boundaries at once, so dropping either check alone passes. Nothing pins >= 331 from below (0.3.30 strided).
  7. (Low) GEMM's shape is encoded in common/. Defensible, since bmb_bench_dim3 is already there.
  8. (Low, latent) Under FlexiBLAS the version string never matches. FlexiBLAS 3.5 has no batch, so there is no effect today. The shell helper reads uname -m, the C code the compiler's architecture.

The man page, CHANGELOG and warning said larger sizes are measured,
while a run with one point at most 100^3 is refused whole: they say so
now, and the man page's many-small-GEMMs example says it exits 77 on an
affected OpenBLAS. backends.md, benchmarks.md and bmb_suite(1) give the
refusal as a cause of 77, and test_man_content.sh's message both.

The man job, the only one on an affected OpenBLAS (Fedora 45's 0.3.34),
runs test_bmb_gemm_batch.sh: its refusal never ran in CI. The unit test
pins DYNAMIC_ARCH's two word ends apart, the strided call's 0.3.31 from
below and .dev from below (both mutations caught). bmb_range_min() no
longer separates bmb_check_args() from its comment, and the comment on
the smallest product gives the right reason. #6214, fixed for 0.3.35,
gets its bound with 0.3.35 (#332), as benchmarks.md and test_helper.sh
now say.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MathieuCAISSA
MathieuCAISSA merged commit 7c59583 into main Nov 3, 2026
34 checks passed
@MathieuCAISSA
MathieuCAISSA deleted the issue-330-fedora45 branch November 3, 2026 10:32
@MathieuCAISSA MathieuCAISSA mentioned this pull request Nov 3, 2026
15 tasks done
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.

Fedora 45 in CI: groff 1.24, no col, OpenBLAS's batch crash with DYNAMIC_ARCH

1 participant