Default CI build and MPM backend requirements — 2026-09-08¶
The default CI build of f7dd6a7 failed before Python tests because CUDA-only
identifiers were referenced by CPU compilation. Strict documentation generation
also rejected a section link. This change repairs those build boundaries and the
link, then makes the existing CUDA-exp requirement explicit in ten parity tests.
No solver formula, numerical tolerance, CI workflow, or strict check is changed.
Changes¶
- Guard
w3_query_ctx()withNOVAPHY_IMPLICIT_MPM_CUDA_AVAILABLE; its callers already have that guard, and CPU fallback functions remain available. - Keep three GS host-packing metadata scalars available in CPU builds. Remove two duplicate CPU definitions in favor of the later implementations, which already contain CPU behavior. CUDA values and dispatch remain unchanged.
- Correct the MkDocs anchor in the PR preparation report.
- Require MPM CUDA for ten existing parity stepping tests: two beam, four granular, one multi-material, two snow, and one viscous. Construction tests still run on the CPU, and every original physics assertion is retained.
- Add a CPU-only runtime test proving that parity Jp explicitly rejects missing
CUDA expf instead of silently substituting host
std::exp.
Why these parity tests require CUDA¶
implicit_mpm_official_exp.h explicitly requires device expf for Newton-compatible
Jp updates. apply_newton_parity_solver_pins() enables this path even when the
outer solver uses use_cuda=False. In the first complete CPU run, all ten failures
were official_exp_f32_batch requires MPM CUDA; not host std::exp; each was also
reproduced independently. All ten subsequently passed, without weakened
assertions, using the repaired CUDA wheel on an RTX 3090.
This is a backend prerequisite for the parity configuration. It does not make the ordinary CPU solver require CUDA, and it does not claim CPU/CUDA numerical parity.
Validation¶
| Check | Result |
|---|---|
| Default Release standalone CMake build | PASS |
| CTest | 42 passed, 1 CUDA-only case skipped |
Clean Python 3.11 pip install -e ".[test]" |
PASS |
| First complete CPU pytest run | 1607 passed, 10 CUDA-exp prerequisite failures, 394 skipped |
| Final complete CPU pytest run | 1608 passed, 404 skipped, 0 failed (639 s) |
| New CPU rejection contract | PASS |
| Repaired CUDA wheel build/install | PASS |
| Ten parity stepping tests on CUDA | 10 passed |
| Existing CUDA lifetime/state/MPM tests under compute-sanitizer | 30 passed; 0 memory errors |
| Changed-line clang-format | PASS |
| clang-tidy and Ruff compared with unchanged baseline | No new diagnostics |
| Documentation consistency and strict MkDocs | PASS, including this report |
The native changes were built both with default MPM CUDA/DIFF disabled and with
MPM CUDA/DIFF enabled. CUDA runtime tests used a separate installation of the new
wheel, whose SHA256 is
b8b7aabe58ce7f246b56eb3b46fe3ae7ce8f0249e24b305207a263fb58fcec39.
Scope and remaining limitations¶
- This is local Linux verification on Ubuntu 22.04 / GCC 11.4 / Python 3.11.15,
not execution of GitHub's
ubuntu-latestor Windows runner image. - Windows and the self-hosted IPC + LBM CUDA 12.8 job still require actual CI. The local CUDA compatibility check uses CUDA 12.6 and does not certify IPC.
- The previously reported full CUDA suite result (1883 passed, 16 failed, 132 skipped) remains an open record. All those sixteen nodes were skipped in the default CPU run due to existing backend gates; they were not repaired by this change. The full CUDA suite was not rerun here.
- No environment, binary library, build cache, or large measurement data is part of this source commit. Shared conda and concurrent development lines were not modified. No upstream PR or merge was created.
Reproduction and evidence¶
Use the unchanged .github/workflows/ci.yml default configure/build/CTest and
editable-install commands, then pytest python/tests/ -v. For documentation, use
.github/workflows/docs-cloudflare.yml through mkdocs build --strict; do not run
the deployment step for a preflight.
Local full logs, commands, exit codes, XML results, source backups, source hashes,
dependency versions, and static-analysis comparisons are retained under
batch01/publication/four_scene11_ci_preflight_20260908/evidence/ in the existing
independent integration area. parity_cpu_failure_probe.xml preserves the ten
original failures; parity_cuda.xml preserves their actual CUDA passes.
Subsequent GitHub CI result¶
The actual CI logs supplied after this repair confirm that Ubuntu and the self-hosted IPC + LBM job passed. Windows built successfully and passed CTest, but five Python tests failed while printing Unicode to cp1252 pipes. See the Windows CLI encoding repair for the precise failure set, minimal fix and verification limits. The earlier local results above remain a historical record.