Skip to content

CI: select the test element types per run, two on pull requests, all four weekly (#91) - #103

Merged
github-actions[bot] merged 2 commits into
mainfrom
ci/eltype-selection-91
Oct 8, 2026
Merged

github-actions[bot] merged 2 commits into
mainfrom
ci/eltype-selection-91

Conversation

@michel2323

@michel2323 michel2323 commented Oct 7, 2026 •

Copy link
Copy Markdown
Member

Refs #91

Task: CI — select the test element types per run (issue #91, owner decision: fewer element types per CI run, no CPU-specific kernel specialisation tricks). Tests and CI configuration only, no library code.

What was built:

  • test/backends.jl: SDS_TEST_ELTYPES (comma-separated, default all four, at least one real type) read once into SELECTED_ELTYPES (selected_eltypes), shown in the backend banner.
  • test/utils.jl: ELTYPES/REAL_ELTYPES/COMPLEX_ELTYPES derive from it; eltypes_among(types) / eltypes_among(Complex) for testsets that run for some types only (notes a skip when the selection has none of them). backends.jl is now included before utils.jl.
  • test/runtests.jl: SPLIT_FILES split over the selected types only; RUN_SHARED goes to the Float64 part, or the first selected type's when Float64 is left out.
  • Audit: the two complex-only testsets (test_numeric_ldlt, test_reference_ldlt) and the (Float64, ComplexF32) FGMRES batch testset use eltypes_among; no testset indexes ELTYPES positionally; the RUN_SHARED testsets that pin Float64 (refinement to 1e-14, Schur/FGMRES edge cases) are precision-specific and stay Float64. No assertion changed. test_helpers tests the parser.
  • .github/workflows/ci.yml: workflow-level SDS_TEST_ELTYPES = Float64,ComplexF32 on pull_request/push, all four on the weekly schedule, and a new workflow_dispatch input (default all four). Job names unchanged; the CUDA job keeps SDS_TEST_CPU=0, SDS_TEST_SKIP=test_aqua.
  • AGENTS.md: test-conventions bullet, the ParallelTestRunner paragraph and the Commands block; README.md: SDS_TEST_ELTYPES in "Running the tests" (review round 1).

Tests: Both selections pass in full, with no failures or broken tests. Locally (CPU backend, SDS_TEST_GPU=0, 4 cores, 4 workers, Julia 1.13.1): all four types 71462/71462, SDS_TEST_ELTYPES=Float64,ComplexF32 41076/41076. CI on cc98eaf with Float64,ComplexF32: CPU 41076/41076, CUDA 44215/44215.

Wall time per job (before: run 37693884475 of #100, all four types; after: this PR on cc98eaf, Float64+ComplexF32):

job before after summed part time before → after
CUDA (test-gpu, 12 workers), test step 18m20s (job 19 min) 19m03s (job 20 min) 12428 → 7370 s (−41%)
CPU (test-github-cpuonly, kkt, 32 workers), test step 21m40s (job 22 min) 20m59s (job 22 min) 32532 → 20707 s (−36%)
CPU local, 4 workers 21m14s 11m53s 4858 → 2702 s (−44%)

The CI jobs do not get shorter. With 12 or 32 workers, the slowest single part sets the wall time, and the slowest part is a complex part kept in the selection. On CUDA that is test_numeric_ldlt[ComplexF32] (1132 s now; before, [ComplexF64] 1089 s and [ComplexF32] 1014 s). On kkt every complex part takes about 1100 s, whichever complex type it is. The selection cuts total work (and runner occupancy) by about 40%. It only shortens the wall time where the run is throughput-bound, i.e. locally and on small runners. To shorten the CI jobs, the heavy files have to be split below the element type: test_numeric_ldlt, test_solve, test_numeric_cholesky_c and test_numeric_cholesky_a on CUDA. That is not done here.

Per file, seconds summed over the parts (each worker's cold compilation is charged to the first file it runs, so single rows are noisy)
file CPU local, 4 types (s) CPU local, 2 types (s) CUDA CI, 4 types (s) CUDA CI, 2 types (s)
test_api 147 17 236 201
test_bench_compare 6 6 6 6
test_bench_smoke 6 5 5 11
test_dense 179 96 311 182
test_fgmres 195 37 280 91
test_helpers 13 7 18 11
test_matching 270 134 281 142
test_matrix 6 4 10 9
test_numeric_cholesky_a 336 198 696 787
test_numeric_cholesky_b 488 248 258 58
test_numeric_cholesky_c 121 115 982 965
test_numeric_ldlt 256 132 3514 1897
test_numeric_lu 77 89 617 400
test_options 6 6 6 5
test_ported 1226 622 748 430
test_reference_cholesky 12 16 9 25
test_reference_ldlt 38 22 94 63
test_refinement 59 93 653 339
test_schur 625 488 867 360
test_solve 616 297 2509 1242
test_symbolic_etree 8 6 8 9
test_symbolic_pairs 15 20 62 12
test_symbolic_schedule 13 15 20 20
test_symbolic_supernodes 3 3 6 5
test_ubatch 137 26 232 100
sum 4858 2702 12428 7370

Deviations from PLAN.md / TASKS.md: none (PLAN.md untouched).

Follow-up issues opened: none. #91 stays open for lever 3 (folding the small Val flags into run-time branches, T25 work).

This PR changes ci.yml, which was expected to make the Claude reviewer skip it; the reviewer ran anyway (VERDICT: APPROVE on 2a6bf54). The owner merges it by hand once CI is green.

🤖 Generated with Claude Code

https://claude.ai/code/session_01AvwMxoGmJm3eSmpzxAy72A


Generated by Claude Code

…requests, all four weekly (#91)

test/backends.jl reads SDS_TEST_ELTYPES once (default all four, at least one
real type); ELTYPES/REAL_ELTYPES/COMPLEX_ELTYPES and the SPLIT_FILES parts
follow it, RUN_SHARED goes to the Float64 part or the first selected type's.
Testsets for some element types only use eltypes_among(...), which notes a
skip when the selection has none of them. ci.yml: pull_request/push run
Float64,ComplexF32, the weekly schedule all four, workflow_dispatch takes the
list as an input. AGENTS.md documents the switch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AvwMxoGmJm3eSmpzxAy72A
@michel2323 michel2323 added this to the M11 — Performance milestone Oct 7, 2026 — with Claude
@michel2323 michel2323 added the claude:pr PR opened by the Claude implementer; handled by the Claude pipeline label Oct 7, 2026 — with Claude
Comment thread AGENTS.md

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

VERDICT: APPROVE (head cc98eaf)

Infrastructure PR for issue #91 (not a TASKS.md task, so no Report block; the PR body serves as the report). Reviewed the full diff against AGENTS.md, the issue and the test conventions.

Checked

  • Scope: tests, test helpers, ci.yml and AGENTS.md only; no library code, PLAN.md and TASKS.md untouched, no Manifest.toml, no public names involved.
  • test/backends.jl: selected_eltypes parses the comma list in ALL_ELTYPES order, rejects unknown names, duplicates collapse, and a selection without a real type is an error (needed by the shared testsets). SELECTED_ELTYPES is read once per process and shown in the banner.
  • test/utils.jl: ELTYPES/REAL_ELTYPES/COMPLEX_ELTYPES derive from the selection; eltypes_among(types) and eltypes_among(S::Type) filter the running part and log the skip only from the part that owns the shared testsets. Include order backends.jl → utils.jl → matrices.jl is sound: backends.jl has no top-level use of the other helpers, and utils.jl needs SELECTED_ELTYPES.
  • test/runtests.jl: the banner module now runs before the suite is built so a bad SDS_TEST_ELTYPES fails early; SPLIT_FILES split over the selected types only; SHARED_ELTYPE falls back to the first selected type when Float64 is left out; test names unchanged (SDS_TEST_ONLY/SKIP prefix matching and the runner history still work). Workers read the same environment as the main process, as SDS_TEST_CPU already does.
  • ci.yml: workflow-level env with inputs is valid; pull_request/push get Float64,ComplexF32, schedule an empty string (all four), workflow_dispatch its input (default all four). Job ids, check names and the GPU job's SDS_TEST_CPU=0 SDS_TEST_SKIP=test_aqua unchanged.
  • Tests: no assertion weakened; the three testsets moved to eltypes_among are equivalent to the old filters; test_helpers covers the parser (@test_logs match_mode = :any with no pattern passes with or without the skip note and returns the value). No ELTYPES[k] or first(ELTYPES) anywhere in test/.
  • CI: all checks pending at review time (the red fix job is the implementer workflow, not a test). I could not run Julia in this session, so the behaviour under a non-default selection rests on reading plus the pending CI.

Blocking findings: none.

Non-blocking (one inline comment on AGENTS.md:195):

  • test_numeric_cholesky_a.jl:63-69 still compiles a Float32 regime-A Cholesky in the Float64 part regardless of the selection; test_symbolic_schedule.jl:340 hard-codes (Float32, ComplexF64) (host-only, cheap, but the new "never" in AGENTS.md should be qualified to numeric testsets).
  • README.md "Running the tests" does not list SDS_TEST_ELTYPES.
  • The PR body's Tests section says "the table follows"; please fill in the local CPU run with both selections (and the CUDA numbers once CI is green) before the owner merges, so the body matches what was verified.

…PES in the README (#91)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AvwMxoGmJm3eSmpzxAy72A

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

VERDICT: APPROVE (head 2a6bf54)

Re-review after the push that answered the previous round. Infrastructure PR for issue #91 (no TASKS.md task, so the PR body stands in for the Report). The head differs from the approved cc98eaf only in AGENTS.md (the "numeric testset … never over a hard-coded list" wording, with the host-only symbolic elsize checks exempted) and one README.md line adding SDS_TEST_ELTYPES to the "Running the tests" block, both as the owner said on the earlier thread. The Float32 factorization in the shared regime-A elsize check stays by the owner's decision.

Checked on this head

  • Scope: test/, ci.yml, AGENTS.md, README.md only; no library code, PLAN.md, TASKS.md and Manifest.toml untouched, no public names involved.
  • test/backends.jl: selected_eltypes keeps ALL_ELTYPES order, collapses duplicates and blanks, rejects unknown names and a selection with no real type; SELECTED_ELTYPES is read once per process and printed in the banner. No top-level dependency on utils.jl, so the new include order (backends.jl → utils.jl → matrices.jl) is sound; nothing outside test/runtests.jl includes utils.jl or backends.jl.
  • test/utils.jl: ELTYPES/REAL_ELTYPES/COMPLEX_ELTYPES derive from the selection or the part; eltypes_among filters the running part and logs the skip only from the part that owns the shared testsets.
  • test/runtests.jl: the banner module runs before the suite is built, so a bad SDS_TEST_ELTYPES fails early; split files run over the selected types only; SHARED_ELTYPE falls back to the first selected type (always real, given the parser) when Float64 is left out; test names and SDS_TEST_ONLY/SKIP matching unchanged.
  • Audit: test/ has no ELTYPES[k]; the three testsets moved to eltypes_among are equivalent to the old filters, no assertion changed. test_helpers covers the parser and the helpers (@test_logs match_mode = :any with no pattern passes regardless of the skip note and returns the value).
  • ci.yml: workflow-level env gives pull_request/push Float64,ComplexF32, schedule the empty string (all four), workflow_dispatch its input; job ids, check names and the GPU job's SDS_TEST_CPU=0 SDS_TEST_SKIP=test_aqua unchanged. The workflow parsed and queued on this head.
  • CI: build green; Run tests CPU and CUDA jobs pending at review time. I could not run Julia in this session; the parser and @test_logs behaviour rest on reading.

Blocking findings: none.

Non-blocking: the PR body's Tests section still says "the table follows". Since the owner merges this by hand once CI is green, please fill in the local run with both selections and the CI numbers before merging so the body records what was verified.

@github-actions
github-actions Bot merged commit 29dbe09 into main Oct 8, 2026
5 checks passed
@github-actions
github-actions Bot deleted the ci/eltype-selection-91 branch October 8, 2026 00:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

claude:pr PR opened by the Claude implementer; handled by the Claude pipeline

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants