Benchmarks¶
Benchmarks measure completed time to an independently verified solution.
The latest complete mode baseline
measures compiled revision 445275a across 134 configurations, 268 fresh
processes and 3,096 eligible candidate/case outcomes. Its 1,548 table rows
retain both forward/reverse process observations over 13 input fixtures.
The later same-code calibration uses
eight fresh process blocks per side at compiled revision 84c88c9. Its
88 comparisons retain 33 rows within the original 5% budget, 55 inconclusive
and zero confirmed regressions. This checks the measurement procedure;
it does not establish an optimization speedup or replace the complete baseline.
The subsequent CUDA completion evaluation
compares compiled baseline 84c88c9 with terminal-fence candidate 32fd10a
over all 32 original CUDA configurations and 512 fresh process artifacts.
Its 336 primary rows retain 117 results within the unchanged 5% budget,
219 inconclusive and zero confirmed regressions. The complete candidate is
inconclusive: production retains its final synchronization, while the expanded
nondefault-stream completion tests are retained. Fresh API, Session and prepared
results stay separate; no selected mode or framework-control correction rescues
the adoption decision. The same-call traces confirm the removed fence and
unchanged physical GPU work, but do not establish a completed-solve speedup.
Results and remaining limitations¶
Comparison |
Higher native medians / matched pairs |
Scope and limit |
|---|---|---|
CPU dense: serial, OpenMP and BLAS |
93 / 384 |
Native and native-BLAS versus NumPy/Torch; all algorithm, fusion and scope rows retained |
CPU CSR: serial and OpenMP |
1 / 192 |
The higher point is OpenMP explicit/unfused prepared Poisson-128 versus Torch; its ratio is 1.014 |
CUDA native dense and CSR |
0 / 288 |
All measured native medians are lower than matched Torch; some explicit dense pairs perform different work |
CUDA cuBLAS dense |
16 / 144 |
All higher points are standard Jacobi fresh API: four sizes, both fusion flags and both execution modes; ratios 1.05–1.42 |
Sparse CG/PCG/direct strategies |
25 / 80 |
Different solver strategies and unknown external restart counts; descriptive time-to-solution comparisons |
These totals contain 1,088 matched native/reference pairs: 953 lower native medians and 135 higher. A pair identifies a fixture and configuration, not a unique matrix. The estimator is the median of two process medians; their range is descriptive, without confidence intervals, statistical-significance claims or an A/B adoption verdict. Every higher point remains in the full report. CUDA Session/prepared results cannot replace the fresh API contract.
Recorded iterations, matvecs, restarts and their knownness repeat across both processes for each candidate/configuration. No cross-scope/mode/preset work changes were observed within the same candidate, algorithm and preconditioner group. Across frameworks, 980 matched pairs have equal known I/M/R, 28 explicit dense pairs have different known work, and 80 strategy pairs have unknown restart parity. Official SciPy CG/PCG and SuperLU retain unknown restart counts rather than fabricated zeros. Work differences are not normalized into pure-kernel ratios. Torch executes this project’s eager recurrence, not an official Torch CG solver; SuperLU is a general sparse direct solver.
The earlier optimization evaluation retains the ownership variants, rejected four-row CPU experiment, launch studies, control regressions and exploratory intervals at their measured sources. Those historical results are separate from this complete baseline; Detailed benchmark reports preserves every earlier report URL.
The subsequent fixed A/B evaluation records the CUDA device-restoration and CPU dense scheduling candidates against the same compiled baseline, retaining every native and framework control and each adoption decision. Read its source pins before applying a candidate result to production. The CUDA phase diagnostics keep fresh API, Session, prepared and workspace-only probes distinct; CPU GEMV diagnostics retain independent numerical checks and compiler evidence. Diagnostic durations are separate from the completed-solve A/B gate.
The CPU follow-up rejects an eight-accumulator candidate before timing because numerical work changed, despite passing true-residual checks. It retains all engine and same-buffer provider/storage diagnostics. CPU 2048 prepared optimization remains open; the page-residency observations do not establish a THP cause or justify an allocator change.
Measurement context¶
Hardware: Intel Core i7-13700K under WSL2/Linux 6.6.87.2; NVIDIA GeForce RTX 2060 (sm75) for CUDA. OpenMP uses two threads with logical affinity [0,2]; other runs use one thread with affinity [0]. Affinity does not isolate the Windows host. GPU clocks, display activity and thermals were not controlled.
CPU builds use GNU 16.0.1; CUDA builds use GNU 13.3.0 and CUDA 12.8.93.
Release flags are portable -O3 -DNDEBUG without architecture-specific
optimization or fast math. NumPy is 2.2.6; separate environments use Torch
2.8.0+cpu and 2.8.0+cu128. The recorded CUDA driver is 610.88, driver API
13030 and runtime 12080. Earlier reports retain their own environments.
The public tag benchmarks/main-complete-20261017 identifies actual compiled
source 445275a3994e342b06de4093889f3f814c8706c6. The full report preserves
compiled tree, staged binaries, Python harness, compiler controls and original
raw/import/log identities. The reference numerical-range fix is included in
this measured source. A later checkout or optimization is not covered merely
because it shares the same package version.
Scope and reproduction¶
The matrix contains 90 standard configurations and 44 explicit-none configurations. Both algorithms cover fused/separate execution, supported CPU native/BLAS and CUDA native/cuBLAS backends, and their declared scopes. Standard CG includes none/Jacobi; explicit recomputes the residual every iteration and supports no preconditioner. CPU covers API/prepared, CUDA covers API/Session/prepared with explicit host/device execution. CSR rejects BLAS and cuBLAS. The five sparse-strategy fixtures retain all six CG/PCG/LU aliases in API/prepared scopes with the standard algorithm.
FP64 inputs use rtol=1e-8, atol=1e-12, maxiter=2000 and seed 20261017. Standard residual refresh is every 50 updates. Each artifact contains three warmups and 36 complete balanced Williams rounds, one solve per round, with all declared candidates. Configurations run forward and then in exact reverse.
Fresh api charges per-call output, workspace and requested Jacobi setup.
CUDA session reuses execution resources with fresh output and requested
per-call Jacobi. prepared reuses output, workspace and setup. These scopes
remain distinct; native host/device selection does not change Torch’s control
engine. Backend, algorithm, fusion and execution mode are explicit choices.
CUDA inputs are resident. Completed wall timing includes dispatch, output reset, scalar/status synchronization and completion fences; uploads and independent correctness downloads are excluded. This is not host-to-host latency or pure-kernel time. Resource probes and profiler captures have their own documented boundaries.
Use the full report’s make pyprof commands and Methodology and reproduction
for fresh reproduction, including sparse CG/PCG versus direct methods.
Dependencies, environments and build products stay project-local. Scripts
and summary tables are versioned; raw samples, binary/input hashes and
profiler captures remain under build/. Reproduction generates new evidence
without previous JSON, and documentation builds do not run benchmarks.
Read further¶
Diagnostic profiling¶
See Diagnostic profiling for resource and Nsight Systems capture commands.