Skip to content

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() with NOVAPHY_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-latest or 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.