diff --git a/performance.md b/PERFORMANCE.md similarity index 84% rename from performance.md rename to PERFORMANCE.md index 91388e7..389e80a 100644 --- a/performance.md +++ b/PERFORMANCE.md @@ -2,6 +2,20 @@ **Bottom line:** For MadNLP-style repeated KKT solves, SparseDirectSolver.jl (SDS) will not beat cuDSS by out-BLASing it on large fronts. Its realistic edge comes from three places. First, robust indefinite numerics that cuDSS lacks: true 2×2 Bunch–Kaufman pivots, per-row pivot signs, and correct inertia. Second, a refactorize+solve path that is device-resident, launch-minimal and graph-captured, which removes the host synchronizations and launches that dominate at OPF scale. Third, a GPU-resident or cached analysis phase. The immediate blockers are not raw FLOP rate. They are (a) the serial, reference-faithful pivot search and the one-workgroup-per-front regime-C LDLᵀ (issue #75), and (b) missing matching and scaling, without which K2 systems produce max|L| of 1e14–1e16 (issue #71). +## Tracked issues + +Performance issues carry the GitHub label `performance` ([list](https://github.com/exanauts/SparseDirectSolver.jl/issues?q=label%3Aperformance)). Keep this table in step with them: add a row when an issue is opened, and update the status when its PR merges or it closes. + +| issue | what | experiment | status | +| --- | --- | --- | --- | +| #81 (PR) | regime-A subtrees ran a whole KKT tree on one workgroup; flop limit `subtree_parallelism` | 0 | open PR | +| #82 | KKT refactorization and solve are level-bound after #81: 54–59 launches per refactorization, 62–85 per solve | 5, 6 | open | +| #75 | device LDLᵀ: serial pivot search, one workgroup per regime-B/C front, no vendor `sytrf` | 1, 2 | open, triaged | +| #60 | regime-A follow-ups: CUDA timings (partly answered by experiment 0) and per-backend local-memory caps | 7 | open, triaged | +| #25 | T25 performance pass (task) | 5, 6, 7 | open | + +Related accuracy issues that gate the K2 results: #71 (max\|L\| 1e14–1e16 on the K2 dumps, needs scaling) and #67 (pivot-pair matching), both experiment 3 / T21. + ## TL;DR - **Current state:** SDS is a KernelAbstractions multifrontal solver. Symbolic analysis runs on the host (AMD or METIS ND, amalgamation, MA57-style pivot pairs). Numeric factorization runs in three regimes: fused subtree kernels, level-batched fused front kernels, and vendor potrf/trsm/syrk. SPD Cholesky and LDLᵀ with in-front Bunch–Kaufman and static perturbation both work on CUDA. LU, batching, matching and scaling, mixed precision and the non-CUDA backends do not exist yet. The LDLᵀ is deliberately slow: it reproduces the CPU reference pivot for pivot. - **cuDSS weak spots to exploit:** analysis (reordering) always runs on the host and is synchronous. It is the documented bottleneck in MadNLP/ExaModels: Pacaud, Shin, Montoison, Schanen and Anitescu (arXiv:2405.14236) report that "the analysis phase is four times slower for cuDSS compared to CHOLMOD". QOCO-GPU reports the same bottleneck. Symmetric-indefinite pivoting is diagonal-only within a supernode plus epsilon perturbation, with no LBLᵀ. The defaults (no matching) give relres 0.26–170 on the K2 dumps. Hybrid, MG and MGMN modes force synchronous phases. @@ -59,6 +73,42 @@ - **Compile latency.** The `Val`-specialized kernels make the first factorization cost minutes, which is bad for MadNLP users. Limit the specialization set (a few width classes), use PrecompileTools workloads on the CPU backend, and consider `@device_override`-free generic paths for rare sizes. - **Type stability and allocation.** Keep integer types uniform (Int32 on device). Keep the `pivot_stats` and inertia readback to a single host transfer per factorization. MadNLP needs inertia every iteration, and that one sync is unavoidable unless inertia correction moves to the device. +## Experiment 0 results (2026-10-02, RTX 4080) + +Measured with `bench/profile_phases.jl` (CUPTI trace of one warm refactorization and solve per harness matrix; `bench/profile/phase_split.md`, the state before the fix in `bench/profile/phase_split_main_9d280d0.md`) and `bench/compare.jl` (`bench/comparison/comparison.md`). + +**The gap was not launch overhead.** GPU busy time (sum of kernel durations) equals wall time on every harness row, so the host never starves the device. The time goes into kernels that run on far too few thread blocks. + +**Root cause on every pglib KKT dump: one thread block.** The regime-A rule took a front into a fused subtree whenever its whole subtree's stack fit the local-memory budget, with no parallelism criterion. KKT trees of small fronts fit as a whole, so the entire factorization (3134 supernodes on case1354 condensed, 19.6k on case1354 K2) and the forward solve ran in one 128-thread workgroup on one of 76 SMs, at about 12 µs per front. + +**Fix (branch `perf/exp0-baseline-split`).** A new analysis tuning knob `subtree_parallelism` (default 4096): a regime-A subtree may do at most 1/4096 of the factorization flops. 4096 was best or near-best in a sweep over 128..4096 and a work floor never helped. Refactorization and solve, before and after: + +| matrix | refactorization | solve | +| --- | --- | --- | +| case118 condensed, Cholesky | 3.9 → 1.2 ms | 2.7 → 0.8 ms | +| case118 K2, LDLᵀ | 13.8 → 2.0 ms | 7.7 → 0.9 ms | +| case1354 condensed, Cholesky | 39.9 → 3.0 ms | 19.7 → 1.6 ms | +| case1354 condensed, LDLᵀ | 56.3 → 9.6 ms | 22.6 → 1.2 ms | +| case1354 K2, LDLᵀ | 146 → 7.2 ms | 78.7 → 2.6 ms | +| SuiteSparse and Laplacian matrices | unchanged within noise (lap2d_300 36 → 31 ms) | unchanged | + +SDS/cuDSS geometric means over the harness (`comparison.md`), before → after: + +| feature | factorization | refactorization | solve | +| --- | --- | --- | --- | +| Cholesky, Float64 | 5.64× → 2.47× | 9.06× → 3.89× | 8.93× → 4.36× | +| LDLᵀ, static pivoting | 20.4× → 6.37× | 29.8× → 9.90× | 13.4× → 3.96× | +| LDLᵀ + 2 IR steps, K2 dumps | 23.4× → 3.18× | 36.0× → 5.45× | 33.3× → 7.57× | + +A side effect: the default solve (`deterministic_mode = 0`) now uses its atomic regime-B forward sweep on the small KKT and test matrices too, so two solves are no longer bitwise identical there. That was always the documented contract (bitwise reproducibility needs `deterministic_mode = 1`), but before the fix these matrices never reached the atomic path. MadNLP should set `deterministic_mode = 1` if it relies on repeatable solves. + +**What is left, by measurement:** +1. **KKT refactor+solve is now level-bound.** 30–60 kernels per refactorization and 35–85 per solve, the longest kernel under 15% of busy time, regime-B fronts on one or two blocks per level. This is where the launch minimization of experiment 5 (level merging, graph capture) now pays, together with experiment 6 for the solve (issue #82). Remaining refactorization gap on case1354: 5× (Cholesky) and 9–14× (LDLᵀ). +2. **LDLᵀ regime B/C is the single largest gap on everything else** (lap2d_300 43×, bcsstk17 59×, lap3d_40 250×, apache2 186× vs cuDSS): `front_ldlt_kernel` runs one front per workgroup on 1–2 blocks (issue #75). Experiments 1–2 unchanged in priority. +3. **Large Cholesky** (lap3d_40 4.4×, apache2 2.4×, solve 11–13×): 1222/6608 kernels per refactorization, `extend_add` on 2 blocks. Level merging and wider extend-add grids. + +Revised order: experiments 1–2 (LDLᵀ kernels, #75) and 5–6 (launches and solve) now have the largest measured payoff; experiment 3 (matching and scaling) remains the accuracy blocker on K2 (relres unchanged by this fix). + ## Recommendations: Prioritized Experiment Plan | # | Experiment | Payoff | Effort | Key measurement | Success criterion | diff --git a/bench/README.md b/bench/README.md index 0b4a47d..9bc6325 100644 --- a/bench/README.md +++ b/bench/README.md @@ -15,6 +15,7 @@ Baselines every later milestone is measured against (PLAN.md §5 M0, §7). The | `dump_madnlp_kkt.jl` | dumps MadNLP K2 and condensed KKT matrices of pglib-opf cases | | `features.jl` | module `BenchFeatures`: the comparison features, one per planned capability in TASKS.md order (`cholesky_f64` … `mixed_precision`), with structure, element type, matrix selector and parameters; `task_status` reads the task's marker in TASKS.md | | `compare.jl` | cuDSS vs SparseDirectSolver.jl per feature × matrix with BenchmarkTools; one solver per run (`--solver=cudss` or `--solver=sds`), results merged into `bench/comparison/.csv` | +| `profile_phases.jl` | where SDS spends refactorization and solve time on CUDA (PERFORMANCE.md, experiment 0): schedule per matrix (regime-A subtrees, B/C fronts, launch groups) and a CUPTI trace of one warm refactorization and solve (kernels, copies, busy time, longest kernel and its grid); writes `bench/profile/phase_split.{md,csv}`: `julia --project=bench bench/profile_phases.jl [--only=m1,m2] [--structures=SPD,S]` | | `compare_report.jl` | renders `bench/comparison/comparison.md` (overview + one table per feature) and `comparison.png` (SDS/cuDSS ratio per feature and phase); environment `bench/report/` (CairoMakie) | | `pivot_pairs.jl` | 2×2 pivot pairs of the `S` analysis (issue #66): `pivot_pairs` = `none`/`default`/`all` on the K2 dumps and the KKT generators, with nnz(L), zero/perturbed/2×2 pivots, max abs L and factor error of the CPU reference LDLᵀ; package environment: `julia --project=. bench/pivot_pairs.jl [--only=case118,...] [--generators=false]` | diff --git a/bench/comparison/comparison.md b/bench/comparison/comparison.md index d4f41e0..7b90e23 100644 --- a/bench/comparison/comparison.md +++ b/bench/comparison/comparison.md @@ -10,10 +10,10 @@ Geometric mean of the SDS/cuDSS ratio over the matrices both solvers ran. | feature | task | status | matrices | analysis | factorization | refactorization | solve | | --- | --- | --- | --- | --- | --- | --- | --- | -| Cholesky, Float64 | T13 | done | 14 | 0.60× | 5.64× | 9.06× | 8.93× | -| Cholesky, 16 right-hand sides | T12 | done | 14 | 0.60× | 6.06× | 9.52× | 7.28× | -| LDLᵀ, static pivoting | T15 | done | 23 | 1.12× | 20.44× | 29.78× | 13.42× | -| LDLᵀ + 2 refinement steps, K2 dumps | T16 | done | 9 | 2.67× | 23.40× | 35.99× | 33.25× | +| Cholesky, Float64 | T13 | done | 14 | 0.62× | 2.47× | 3.89× | 4.36× | +| Cholesky, 16 right-hand sides | T12 | done | 14 | 0.64× | 2.74× | 3.89× | 3.87× | +| LDLᵀ, static pivoting | T15 | done | 23 | 1.15× | 6.37× | 9.90× | 3.96× | +| LDLᵀ + 2 refinement steps, K2 dumps | T16 | done | 9 | 2.69× | 3.18× | 5.45× | 7.57× | | Uniform batch of 8, Cholesky | T17 | pending | | | | | | | LU, unsymmetric | T19 | pending | | | | | | | Schur complement, Cholesky | T20 | pending | | | | | | @@ -29,20 +29,20 @@ Geometric mean of the SDS/cuDSS ratio over the matrices both solvers ran. | matrix | n | analysis cuDSS ms | SDS ms | ratio | factorization cuDSS ms | SDS ms | ratio | refactorization cuDSS ms | SDS ms | ratio | solve cuDSS ms | SDS ms | ratio | nnz(L) cuDSS | SDS | relres cuDSS | SDS | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Boeing/bcsstk38 | 8032 | 35.1 | 55 | 1.57× | 3.52 | 23.6 | 6.69× | 2.3 | 23.5 | 10.26× | 0.462 | 1.88 | 4.07× | 7.99e+05 | 8.05e+05 | 2.15e-10 | 1.05e-10 | -| GHS_psdef/apache2 | 715176 | 4.28e+03 | 6.08e+03 | 1.42× | 449 | 1.03e+03 | 2.30× | 421 | 1.02e+03 | 2.43× | 6.62 | 76.7 | 11.58× | 1.45e+08 | 1.29e+08 | 1.8e-10 | 1.58e-10 | -| HB/bcsstk17 | 10974 | 43.2 | 65.5 | 1.52× | 3.9 | 29.6 | 7.58× | 2.45 | 29.6 | 12.07× | 0.5 | 3.49 | 6.98× | 1.08e+06 | 1.04e+06 | 4.02e-11 | 5.05e-11 | -| kkt_pglib_opf_case118_ieee_condensed_1 | 1088 | 13 | 4.46 | 0.34× | 0.992 | 3.87 | 3.90× | 0.438 | 3.88 | 8.86× | 0.256 | 2.72 | 10.63× | 1.52e+04 | 1.16e+04 | 7.26e-05 | 0.00015 | -| kkt_pglib_opf_case118_ieee_condensed_10 | 1088 | 12.3 | 4.78 | 0.39× | 1.02 | 3.64 | 3.55× | 0.53 | 3.67 | 6.93× | 0.261 | 2.09 | 8.02× | 1.52e+04 | 1.16e+04 | 1.4e-05 | 1e-05 | -| kkt_pglib_opf_case118_ieee_condensed_20 | 1088 | 12.8 | 4.77 | 0.37× | 1.06 | 3.66 | 3.44× | 0.351 | 3.77 | 10.73× | 0.257 | 2.07 | 8.08× | 1.52e+04 | 1.16e+04 | 0.293 | 0.0977 | -| kkt_pglib_opf_case1354_pegase_condensed_1 | 11192 | 54.2 | 50 | 0.92× | 1.35 | 39.9 | 29.45× | 0.585 | 39.9 | 68.17× | 0.269 | 19.7 | 73.12× | 1.55e+05 | 1.21e+05 | 0.000316 | 0.000282 | -| kkt_pglib_opf_case1354_pegase_condensed_10 | 11192 | 55.4 | 48.7 | 0.88× | 1.4 | 38.4 | 27.50× | 0.584 | 38.3 | 65.66× | 0.375 | 19.7 | 52.44× | 1.55e+05 | 1.21e+05 | 0.000142 | 0.00014 | -| kkt_pglib_opf_case1354_pegase_condensed_20 | 11192 | 55.4 | 49 | 0.88× | 1.39 | 38.3 | 27.48× | 0.685 | 38.4 | 56.03× | 0.387 | 19.7 | 50.79× | 1.55e+05 | 1.21e+05 | 7.94e-05 | 7.41e-05 | -| kkt_pglib_opf_case14_ieee_condensed_1 | 118 | 6.82 | 0.965 | 0.14× | 0.216 | 0.526 | 2.44× | 0.225 | 0.555 | 2.47× | 0.187 | 0.402 | 2.16× | 1.27e+03 | 1.03e+03 | 4.09e-07 | 1.65e-06 | -| kkt_pglib_opf_case14_ieee_condensed_10 | 118 | 6.77 | 1.55 | 0.23× | 0.221 | 0.565 | 2.56× | 0.212 | 0.54 | 2.55× | 0.195 | 0.392 | 2.01× | 1.27e+03 | 1.03e+03 | 0.000109 | 0.000157 | -| kkt_pglib_opf_case14_ieee_condensed_11 | 118 | 6.89 | 0.937 | 0.14× | 0.242 | 0.49 | 2.03× | 0.28 | 0.539 | 1.93× | 0.214 | 0.379 | 1.78× | 1.27e+03 | 1.03e+03 | 1.2e-05 | 1.67e-05 | -| lap2d_300 | 90000 | 281 | 371 | 1.32× | 6.84 | 36.4 | 5.32× | 3.84 | 36.3 | 9.45× | 0.852 | 4.1 | 4.82× | 2.43e+06 | 2.47e+06 | 1.84e-12 | 1.78e-12 | -| lap3d_40 | 64000 | 340 | 398 | 1.17× | 55.8 | 223 | 4.00× | 50.6 | 223 | 4.42× | 1.35 | 17 | 12.59× | 1.75e+07 | 1.44e+07 | 8.29e-14 | 7.48e-14 | +| Boeing/bcsstk38 | 8032 | 35.1 | 52.9 | 1.51× | 3.52 | 22.7 | 6.44× | 2.3 | 22.6 | 9.85× | 0.462 | 1.93 | 4.18× | 7.99e+05 | 8.05e+05 | 2.15e-10 | 9.23e-11 | +| GHS_psdef/apache2 | 715176 | 4.28e+03 | 6.17e+03 | 1.44× | 449 | 1.04e+03 | 2.30× | 421 | 1.02e+03 | 2.43× | 6.62 | 74 | 11.19× | 1.45e+08 | 1.29e+08 | 1.8e-10 | 1.58e-10 | +| HB/bcsstk17 | 10974 | 43.2 | 66.5 | 1.54× | 3.9 | 27.8 | 7.12× | 2.45 | 27.8 | 11.34× | 0.5 | 4.19 | 8.38× | 1.08e+06 | 1.04e+06 | 4.02e-11 | 5.33e-11 | +| kkt_pglib_opf_case118_ieee_condensed_1 | 1088 | 13 | 5 | 0.38× | 0.992 | 1.12 | 1.13× | 0.438 | 1.18 | 2.69× | 0.256 | 0.795 | 3.11× | 1.52e+04 | 1.16e+04 | 7.26e-05 | 0.000117 | +| kkt_pglib_opf_case118_ieee_condensed_10 | 1088 | 12.3 | 4.96 | 0.40× | 1.02 | 1.01 | 0.98× | 0.53 | 0.928 | 1.75× | 0.261 | 0.894 | 3.43× | 1.52e+04 | 1.16e+04 | 1.4e-05 | 8.28e-06 | +| kkt_pglib_opf_case118_ieee_condensed_20 | 1088 | 12.8 | 4.94 | 0.39× | 1.06 | 1.25 | 1.17× | 0.351 | 1.07 | 3.05× | 0.257 | 1.02 | 3.99× | 1.52e+04 | 1.16e+04 | 0.293 | 0.0747 | +| kkt_pglib_opf_case1354_pegase_condensed_1 | 11192 | 54.2 | 51.7 | 0.95× | 1.35 | 4.57 | 3.37× | 0.585 | 2.99 | 5.12× | 0.269 | 1.56 | 5.78× | 1.55e+05 | 1.21e+05 | 0.000316 | 0.00024 | +| kkt_pglib_opf_case1354_pegase_condensed_10 | 11192 | 55.4 | 52.8 | 0.95× | 1.4 | 4.72 | 3.38× | 0.584 | 4.2 | 7.19× | 0.375 | 1.16 | 3.08× | 1.55e+05 | 1.21e+05 | 0.000142 | 0.000107 | +| kkt_pglib_opf_case1354_pegase_condensed_20 | 11192 | 55.4 | 51.4 | 0.93× | 1.39 | 2.93 | 2.10× | 0.685 | 3.95 | 5.76× | 0.387 | 1.48 | 3.81× | 1.55e+05 | 1.21e+05 | 7.94e-05 | 4.97e-05 | +| kkt_pglib_opf_case14_ieee_condensed_1 | 118 | 6.82 | 0.938 | 0.14× | 0.216 | 0.483 | 2.24× | 0.225 | 0.393 | 1.75× | 0.187 | 0.569 | 3.05× | 1.27e+03 | 1.03e+03 | 4.09e-07 | 1.3e-06 | +| kkt_pglib_opf_case14_ieee_condensed_10 | 118 | 6.77 | 0.985 | 0.15× | 0.221 | 0.351 | 1.59× | 0.212 | 0.425 | 2.00× | 0.195 | 0.474 | 2.43× | 1.27e+03 | 1.03e+03 | 0.000109 | 0.000172 | +| kkt_pglib_opf_case14_ieee_condensed_11 | 118 | 6.89 | 1.6 | 0.23× | 0.242 | 0.351 | 1.45× | 0.28 | 0.49 | 1.75× | 0.214 | 0.443 | 2.07× | 1.27e+03 | 1.03e+03 | 1.2e-05 | 1.56e-05 | +| lap2d_300 | 90000 | 281 | 364 | 1.29× | 6.84 | 31.5 | 4.61× | 3.84 | 31.4 | 8.19× | 0.852 | 3.31 | 3.89× | 2.43e+06 | 2.47e+06 | 1.84e-12 | 1.78e-12 | +| lap3d_40 | 64000 | 340 | 382 | 1.12× | 55.8 | 223 | 4.00× | 50.6 | 223 | 4.42× | 1.35 | 18.1 | 13.34× | 1.75e+07 | 1.44e+07 | 8.29e-14 | 7.48e-14 | ## Cholesky, 16 right-hand sides @@ -50,20 +50,20 @@ Geometric mean of the SDS/cuDSS ratio over the matrices both solvers ran. | matrix | n | analysis cuDSS ms | SDS ms | ratio | factorization cuDSS ms | SDS ms | ratio | refactorization cuDSS ms | SDS ms | ratio | solve cuDSS ms | SDS ms | ratio | nnz(L) cuDSS | SDS | relres cuDSS | SDS | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Boeing/bcsstk38 | 8032 | 35.3 | 54 | 1.53× | 3.55 | 23.6 | 6.64× | 2.29 | 23.6 | 10.29× | 0.706 | 3.1 | 4.39× | 7.99e+05 | 8.05e+05 | 6.7e-10 | 1.66e-10 | -| GHS_psdef/apache2 | 715176 | 4.3e+03 | 6.23e+03 | 1.45× | 447 | 1.03e+03 | 2.30× | 417 | 1.02e+03 | 2.45× | 27.6 | 256 | 9.27× | 1.45e+08 | 1.29e+08 | 1.83e-10 | 1.6e-10 | -| HB/bcsstk17 | 10974 | 40.8 | 66.2 | 1.62× | 3.8 | 29.5 | 7.76× | 2.42 | 29.6 | 12.23× | 0.758 | 6.56 | 8.66× | 1.08e+06 | 1.04e+06 | 5.13e-11 | 5.92e-11 | -| kkt_pglib_opf_case118_ieee_condensed_1 | 1088 | 11.8 | 4.7 | 0.40× | 0.911 | 3.87 | 4.25× | 0.341 | 3.88 | 11.36× | 0.375 | 2.18 | 5.82× | 1.52e+04 | 1.16e+04 | 6.7e-05 | 0.00015 | -| kkt_pglib_opf_case118_ieee_condensed_10 | 1088 | 11.9 | 4.56 | 0.38× | 0.882 | 4.45 | 5.04× | 0.406 | 3.64 | 8.96× | 0.346 | 2.13 | 6.17× | 1.52e+04 | 1.16e+04 | 1.52e-05 | 1.1e-05 | -| kkt_pglib_opf_case118_ieee_condensed_20 | 1088 | 12.2 | 4.74 | 0.39× | 0.889 | 3.7 | 4.16× | 0.359 | 4.01 | 11.17× | 0.26 | 2.05 | 7.87× | 1.52e+04 | 1.16e+04 | 0.492 | 0.318 | -| kkt_pglib_opf_case1354_pegase_condensed_1 | 11192 | 51.9 | 49.6 | 0.96× | 1.37 | 39.6 | 28.85× | 0.581 | 39.6 | 68.22× | 0.487 | 19.4 | 39.75× | 1.55e+05 | 1.21e+05 | 0.000394 | 0.000393 | -| kkt_pglib_opf_case1354_pegase_condensed_10 | 11192 | 52.9 | 49.7 | 0.94× | 1.5 | 38.4 | 25.64× | 0.614 | 38.2 | 62.24× | 0.457 | 19.3 | 42.25× | 1.55e+05 | 1.21e+05 | 0.000137 | 0.000144 | -| kkt_pglib_opf_case1354_pegase_condensed_20 | 11192 | 53.3 | 49.6 | 0.93× | 1.34 | 38.2 | 28.61× | 0.701 | 38.1 | 54.36× | 0.461 | 19.4 | 42.03× | 1.55e+05 | 1.21e+05 | 9.79e-05 | 9.67e-05 | -| kkt_pglib_opf_case14_ieee_condensed_1 | 118 | 7.25 | 0.974 | 0.13× | 0.199 | 0.555 | 2.79× | 0.24 | 0.543 | 2.26× | 0.221 | 0.449 | 2.03× | 1.27e+03 | 1.03e+03 | 6.35e-07 | 2.71e-06 | -| kkt_pglib_opf_case14_ieee_condensed_10 | 118 | 6.76 | 1.06 | 0.16× | 0.218 | 0.511 | 2.35× | 0.212 | 0.504 | 2.38× | 0.365 | 0.486 | 1.33× | 1.27e+03 | 1.03e+03 | 0.000179 | 0.000454 | -| kkt_pglib_opf_case14_ieee_condensed_11 | 118 | 6.84 | 0.941 | 0.14× | 0.24 | 0.521 | 2.17× | 0.222 | 0.543 | 2.45× | 0.261 | 0.446 | 1.71× | 1.27e+03 | 1.03e+03 | 3.34e-05 | 3.71e-05 | -| lap2d_300 | 90000 | 271 | 334 | 1.23× | 5.71 | 36.4 | 6.37× | 3.8 | 36.4 | 9.57× | 2.3 | 9.14 | 3.97× | 2.43e+06 | 2.47e+06 | 1.85e-12 | 1.8e-12 | -| lap3d_40 | 64000 | 329 | 409 | 1.24× | 50.5 | 223 | 4.41× | 45.7 | 223 | 4.88× | 5.58 | 50.5 | 9.05× | 1.75e+07 | 1.44e+07 | 8.99e-14 | 8.45e-14 | +| Boeing/bcsstk38 | 8032 | 35.3 | 53.4 | 1.51× | 3.55 | 24.4 | 6.88× | 2.29 | 22.5 | 9.84× | 0.706 | 3.09 | 4.38× | 7.99e+05 | 8.05e+05 | 6.7e-10 | 1.84e-10 | +| GHS_psdef/apache2 | 715176 | 4.3e+03 | 6.14e+03 | 1.43× | 447 | 1.03e+03 | 2.31× | 417 | 1.02e+03 | 2.45× | 27.6 | 256 | 9.28× | 1.45e+08 | 1.29e+08 | 1.83e-10 | 1.6e-10 | +| HB/bcsstk17 | 10974 | 40.8 | 66.4 | 1.63× | 3.8 | 27.8 | 7.31× | 2.42 | 27.8 | 11.51× | 0.758 | 5.85 | 7.72× | 1.08e+06 | 1.04e+06 | 5.13e-11 | 5.37e-11 | +| kkt_pglib_opf_case118_ieee_condensed_1 | 1088 | 11.8 | 4.81 | 0.41× | 0.911 | 1.43 | 1.57× | 0.341 | 1.03 | 3.02× | 0.375 | 1.03 | 2.74× | 1.52e+04 | 1.16e+04 | 6.7e-05 | 0.000104 | +| kkt_pglib_opf_case118_ieee_condensed_10 | 1088 | 11.9 | 4.73 | 0.40× | 0.882 | 1.42 | 1.61× | 0.406 | 1.06 | 2.61× | 0.346 | 0.868 | 2.51× | 1.52e+04 | 1.16e+04 | 1.52e-05 | 8.77e-06 | +| kkt_pglib_opf_case118_ieee_condensed_20 | 1088 | 12.2 | 4.89 | 0.40× | 0.889 | 1.12 | 1.26× | 0.359 | 0.949 | 2.64× | 0.26 | 0.907 | 3.48× | 1.52e+04 | 1.16e+04 | 0.492 | 0.303 | +| kkt_pglib_opf_case1354_pegase_condensed_1 | 11192 | 51.9 | 51.8 | 1.00× | 1.37 | 4.41 | 3.22× | 0.581 | 3.63 | 6.24× | 0.487 | 1.91 | 3.92× | 1.55e+05 | 1.21e+05 | 0.000394 | 0.000321 | +| kkt_pglib_opf_case1354_pegase_condensed_10 | 11192 | 52.9 | 51.4 | 0.97× | 1.5 | 2.94 | 1.96× | 0.614 | 2.95 | 4.81× | 0.457 | 1.69 | 3.69× | 1.55e+05 | 1.21e+05 | 0.000137 | 0.000106 | +| kkt_pglib_opf_case1354_pegase_condensed_20 | 11192 | 53.3 | 51.5 | 0.97× | 1.34 | 3.01 | 2.25× | 0.701 | 2.93 | 4.18× | 0.461 | 1.9 | 4.13× | 1.55e+05 | 1.21e+05 | 9.79e-05 | 6.7e-05 | +| kkt_pglib_opf_case14_ieee_condensed_1 | 118 | 7.25 | 1.06 | 0.15× | 0.199 | 0.479 | 2.41× | 0.24 | 0.394 | 1.64× | 0.221 | 1.06 | 4.80× | 1.27e+03 | 1.03e+03 | 6.35e-07 | 1.29e-06 | +| kkt_pglib_opf_case14_ieee_condensed_10 | 118 | 6.76 | 2.16 | 0.32× | 0.218 | 0.533 | 2.45× | 0.212 | 0.486 | 2.29× | 0.365 | 0.51 | 1.40× | 1.27e+03 | 1.03e+03 | 0.000179 | 0.000268 | +| kkt_pglib_opf_case14_ieee_condensed_11 | 118 | 6.84 | 1.02 | 0.15× | 0.24 | 0.426 | 1.77× | 0.222 | 0.358 | 1.61× | 0.261 | 0.45 | 1.72× | 1.27e+03 | 1.03e+03 | 3.34e-05 | 1.47e-05 | +| lap2d_300 | 90000 | 271 | 325 | 1.20× | 5.71 | 31.5 | 5.52× | 3.8 | 31.4 | 8.26× | 2.3 | 8.51 | 3.70× | 2.43e+06 | 2.47e+06 | 1.85e-12 | 1.79e-12 | +| lap3d_40 | 64000 | 329 | 387 | 1.18× | 50.5 | 223 | 4.41× | 45.7 | 223 | 4.89× | 5.58 | 49.1 | 8.79× | 1.75e+07 | 1.44e+07 | 8.99e-14 | 8.45e-14 | ## LDLᵀ, static pivoting @@ -71,29 +71,29 @@ Geometric mean of the SDS/cuDSS ratio over the matrices both solvers ran. | matrix | n | analysis cuDSS ms | SDS ms | ratio | factorization cuDSS ms | SDS ms | ratio | refactorization cuDSS ms | SDS ms | ratio | solve cuDSS ms | SDS ms | ratio | nnz(L) cuDSS | SDS | relres cuDSS | SDS | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Boeing/bcsstk38 | 8032 | 35.5 | 61.1 | 1.72× | 4.55 | 129 | 28.37× | 3.31 | 129 | 38.95× | 0.476 | 2.82 | 5.92× | 7.99e+05 | 8.05e+05 | 6.5e-11 | 1.25e-10 | -| GHS_psdef/apache2 | 715176 | 4.45e+03 | 6.97e+03 | 1.57× | 518 | 9.07e+04 | 175.14× | 489 | 9.12e+04 | 186.36× | 6.8 | 89.1 | 13.10× | 1.45e+08 | 1.29e+08 | 1.58e-10 | 1.63e-10 | -| HB/bcsstk17 | 10974 | 42.2 | 72.7 | 1.72× | 5.45 | 198 | 36.39× | 3.37 | 198 | 58.76× | 0.5 | 3.8 | 7.59× | 1.08e+06 | 1.04e+06 | 3.87e-11 | 3.71e-11 | -| kkt_pglib_opf_case118_ieee_condensed_1 | 1088 | 12.9 | 5.04 | 0.39× | 0.905 | 5.03 | 5.56× | 0.39 | 5.03 | 12.89× | 0.383 | 2.61 | 6.82× | 1.52e+04 | 1.16e+04 | 2.99e-05 | 6.97e-05 | -| kkt_pglib_opf_case118_ieee_condensed_10 | 1088 | 12 | 5.12 | 0.43× | 0.921 | 4.99 | 5.41× | 0.349 | 4.89 | 14.01× | 0.249 | 2.38 | 9.54× | 1.52e+04 | 1.16e+04 | 9.52e-06 | 9.74e-06 | -| kkt_pglib_opf_case118_ieee_condensed_20 | 1088 | 12.9 | 5.04 | 0.39× | 0.899 | 5.04 | 5.61× | 0.351 | 5.03 | 14.31× | 0.282 | 2.38 | 8.44× | 1.52e+04 | 1.16e+04 | 0.108 | 0.0779 | -| kkt_pglib_opf_case118_ieee_k2_1 | 3150 | 16.2 | 54.2 | 3.34× | 0.845 | 13.8 | 16.31× | 0.363 | 13.8 | 38.08× | 0.229 | 7.73 | 33.81× | 2.02e+04 | 2.1e+04 | 2.4 | 0.237 | -| kkt_pglib_opf_case118_ieee_k2_10 | 3150 | 16.2 | 54.1 | 3.34× | 0.868 | 15 | 17.26× | 0.354 | 13.3 | 37.67× | 0.284 | 7.69 | 27.05× | 2.02e+04 | 2.05e+04 | 10.1 | 0.0106 | -| kkt_pglib_opf_case118_ieee_k2_20 | 3150 | 16.2 | 53.1 | 3.28× | 0.83 | 13.6 | 16.32× | 0.4 | 13.6 | 34.02× | 0.272 | 7.68 | 28.25× | 2.02e+04 | 2.05e+04 | 6.03 | 0.027 | -| kkt_pglib_opf_case1354_pegase_condensed_1 | 11192 | 53.3 | 52.1 | 0.98× | 1.39 | 56.3 | 40.63× | 0.684 | 56.3 | 82.22× | 0.355 | 22.6 | 63.57× | 1.55e+05 | 1.21e+05 | 0.000296 | 0.000322 | -| kkt_pglib_opf_case1354_pegase_condensed_10 | 11192 | 52.4 | 52 | 0.99× | 1.39 | 55.7 | 40.01× | 0.643 | 55.7 | 86.68× | 0.279 | 22.6 | 80.94× | 1.55e+05 | 1.21e+05 | 0.000122 | 9.53e-05 | -| kkt_pglib_opf_case1354_pegase_condensed_20 | 11192 | 53.1 | 52.2 | 0.98× | 1.65 | 56.1 | 34.07× | 0.706 | 56.1 | 79.48× | 0.611 | 22.6 | 37.00× | 1.55e+05 | 1.21e+05 | 7.55e-05 | 4.91e-05 | -| kkt_pglib_opf_case1354_pegase_k2_1 | 33811 | 97.4 | 1.03e+03 | 10.62× | 1.53 | 146 | 95.37× | 0.816 | 146 | 178.88× | 0.421 | 78.7 | 186.80× | 2.02e+05 | 2.16e+05 | 108 | 14.2 | -| kkt_pglib_opf_case1354_pegase_k2_10 | 33811 | 96.4 | 1.09e+03 | 11.28× | 1.55 | 161 | 103.65× | 0.827 | 145 | 175.73× | 0.448 | 79 | 176.38× | 2.02e+05 | 2.2e+05 | 52.2 | 51.7 | -| kkt_pglib_opf_case1354_pegase_k2_20 | 33811 | 100 | 1.1e+03 | 11.01× | 1.6 | 168 | 105.48× | 0.806 | 148 | 183.23× | 0.412 | 79.1 | 191.92× | 2.02e+05 | 2.21e+05 | 140 | 15.3 | -| kkt_pglib_opf_case14_ieee_condensed_1 | 118 | 6.65 | 1.17 | 0.18× | 0.226 | 0.615 | 2.73× | 0.192 | 0.629 | 3.27× | 0.321 | 0.418 | 1.30× | 1.27e+03 | 1.03e+03 | 9.81e-07 | 8.09e-07 | -| kkt_pglib_opf_case14_ieee_condensed_10 | 118 | 6.69 | 1.05 | 0.16× | 0.194 | 1.03 | 5.30× | 0.229 | 0.63 | 2.75× | 0.265 | 0.458 | 1.73× | 1.27e+03 | 1.03e+03 | 0.000129 | 0.000156 | -| kkt_pglib_opf_case14_ieee_condensed_11 | 118 | 6.74 | 1.06 | 0.16× | 0.212 | 0.681 | 3.21× | 0.291 | 0.605 | 2.08× | 0.299 | 0.504 | 1.69× | 1.27e+03 | 1.03e+03 | 1.44e-05 | 5.1e-06 | -| kkt_pglib_opf_case14_ieee_k2_1 | 344 | 9.21 | 4.08 | 0.44× | 0.216 | 2.02 | 9.32× | 0.28 | 1.59 | 5.66× | 0.265 | 0.96 | 3.62× | 2.02e+03 | 2.14e+03 | 0.182 | 1.07e-08 | -| kkt_pglib_opf_case14_ieee_k2_10 | 344 | 7.53 | 4.87 | 0.65× | 0.283 | 1.82 | 6.42× | 0.238 | 1.6 | 6.75× | 0.262 | 0.948 | 3.61× | 2.02e+03 | 2.15e+03 | 0.295 | 2.75e-05 | -| kkt_pglib_opf_case14_ieee_k2_15 | 344 | 7.63 | 3.56 | 0.47× | 0.217 | 1.71 | 7.87× | 0.322 | 1.75 | 5.44× | 0.435 | 0.842 | 1.93× | 2.02e+03 | 3.27e+03 | 0.221 | 0.324 | -| lap2d_300 | 90000 | 257 | 349 | 1.36× | 7.13 | 240 | 33.69× | 5.15 | 241 | 46.74× | 0.712 | 4.7 | 6.60× | 2.43e+06 | 2.47e+06 | 1.6e-12 | 1.68e-12 | -| lap3d_40 | 64000 | 332 | 416 | 1.25× | 62.9 | 1.46e+04 | 232.33× | 58.4 | 1.46e+04 | 250.37× | 1.41 | 19.4 | 13.68× | 1.75e+07 | 1.44e+07 | 7.68e-14 | 9.06e-14 | +| Boeing/bcsstk38 | 8032 | 35.5 | 60.6 | 1.71× | 4.55 | 131 | 28.90× | 3.31 | 131 | 39.63× | 0.476 | 2.03 | 4.26× | 7.99e+05 | 8.05e+05 | 6.5e-11 | 1.42e-10 | +| GHS_psdef/apache2 | 715176 | 4.45e+03 | 7.11e+03 | 1.60× | 518 | 9.08e+04 | 175.17× | 489 | 9.12e+04 | 186.38× | 6.8 | 89.2 | 13.11× | 1.45e+08 | 1.29e+08 | 1.58e-10 | 1.63e-10 | +| HB/bcsstk17 | 10974 | 42.2 | 72 | 1.70× | 5.45 | 198 | 36.32× | 3.37 | 198 | 58.64× | 0.5 | 3.69 | 7.37× | 1.08e+06 | 1.04e+06 | 3.87e-11 | 3.69e-11 | +| kkt_pglib_opf_case118_ieee_condensed_1 | 1088 | 12.9 | 5.75 | 0.45× | 0.905 | 1.93 | 2.13× | 0.39 | 1.7 | 4.36× | 0.383 | 0.741 | 1.93× | 1.52e+04 | 1.16e+04 | 2.99e-05 | 4.3e-05 | +| kkt_pglib_opf_case118_ieee_condensed_10 | 1088 | 12 | 5.19 | 0.43× | 0.921 | 2.21 | 2.40× | 0.349 | 2.79 | 7.98× | 0.249 | 1.75 | 7.02× | 1.52e+04 | 1.16e+04 | 9.52e-06 | 1.14e-05 | +| kkt_pglib_opf_case118_ieee_condensed_20 | 1088 | 12.9 | 5.26 | 0.41× | 0.899 | 1.66 | 1.85× | 0.351 | 2.5 | 7.12× | 0.282 | 0.871 | 3.09× | 1.52e+04 | 1.16e+04 | 0.108 | 0.0833 | +| kkt_pglib_opf_case118_ieee_k2_1 | 3150 | 16.2 | 55.3 | 3.41× | 0.845 | 1.5 | 1.78× | 0.363 | 1.98 | 5.45× | 0.229 | 0.897 | 3.92× | 2.02e+04 | 2.1e+04 | 2.4 | 0.0906 | +| kkt_pglib_opf_case118_ieee_k2_10 | 3150 | 16.2 | 55.6 | 3.44× | 0.868 | 1.4 | 1.61× | 0.354 | 1.35 | 3.83× | 0.284 | 1.49 | 5.26× | 2.02e+04 | 2.05e+04 | 10.1 | 0.0192 | +| kkt_pglib_opf_case118_ieee_k2_20 | 3150 | 16.2 | 54.2 | 3.35× | 0.83 | 1.33 | 1.60× | 0.4 | 1.5 | 3.76× | 0.272 | 1.59 | 5.84× | 2.02e+04 | 2.05e+04 | 6.03 | 0.0149 | +| kkt_pglib_opf_case1354_pegase_condensed_1 | 11192 | 53.3 | 54.8 | 1.03× | 1.39 | 9.82 | 7.09× | 0.684 | 9.6 | 14.03× | 0.355 | 1.22 | 3.45× | 1.55e+05 | 1.21e+05 | 0.000296 | 0.000275 | +| kkt_pglib_opf_case1354_pegase_condensed_10 | 11192 | 52.4 | 55.4 | 1.06× | 1.39 | 9.6 | 6.89× | 0.643 | 9.62 | 14.96× | 0.279 | 2.19 | 7.87× | 1.55e+05 | 1.21e+05 | 0.000122 | 9.49e-05 | +| kkt_pglib_opf_case1354_pegase_condensed_20 | 11192 | 53.1 | 54 | 1.02× | 1.65 | 11.1 | 6.72× | 0.706 | 9.73 | 13.79× | 0.611 | 1.46 | 2.38× | 1.55e+05 | 1.21e+05 | 7.55e-05 | 5.02e-05 | +| kkt_pglib_opf_case1354_pegase_k2_1 | 33811 | 97.4 | 1e+03 | 10.31× | 1.53 | 15.6 | 10.19× | 0.816 | 7.24 | 8.87× | 0.421 | 2.64 | 6.26× | 2.02e+05 | 2.16e+05 | 108 | 13 | +| kkt_pglib_opf_case1354_pegase_k2_10 | 33811 | 96.4 | 1.07e+03 | 11.06× | 1.55 | 7.88 | 5.09× | 0.827 | 7.24 | 8.75× | 0.448 | 2.6 | 5.81× | 2.02e+05 | 2.2e+05 | 52.2 | 52.8 | +| kkt_pglib_opf_case1354_pegase_k2_20 | 33811 | 100 | 1.08e+03 | 10.74× | 1.6 | 13 | 8.16× | 0.806 | 11 | 13.65× | 0.412 | 1.69 | 4.09× | 2.02e+05 | 2.21e+05 | 140 | 48 | +| kkt_pglib_opf_case14_ieee_condensed_1 | 118 | 6.65 | 1.13 | 0.17× | 0.226 | 0.386 | 1.71× | 0.192 | 0.437 | 2.27× | 0.321 | 0.539 | 1.68× | 1.27e+03 | 1.03e+03 | 9.81e-07 | 1.17e-06 | +| kkt_pglib_opf_case14_ieee_condensed_10 | 118 | 6.69 | 1.35 | 0.20× | 0.194 | 0.463 | 2.39× | 0.229 | 0.472 | 2.06× | 0.265 | 0.466 | 1.76× | 1.27e+03 | 1.03e+03 | 0.000129 | 0.000139 | +| kkt_pglib_opf_case14_ieee_condensed_11 | 118 | 6.74 | 1.28 | 0.19× | 0.212 | 0.509 | 2.40× | 0.291 | 0.71 | 2.44× | 0.299 | 0.488 | 1.63× | 1.27e+03 | 1.03e+03 | 1.44e-05 | 1.13e-05 | +| kkt_pglib_opf_case14_ieee_k2_1 | 344 | 9.21 | 4.26 | 0.46× | 0.216 | 0.839 | 3.88× | 0.28 | 0.669 | 2.39× | 0.265 | 0.576 | 2.17× | 2.02e+03 | 2.14e+03 | 0.182 | 7.68e-09 | +| kkt_pglib_opf_case14_ieee_k2_10 | 344 | 7.53 | 5.01 | 0.67× | 0.283 | 0.561 | 1.98× | 0.238 | 0.681 | 2.86× | 0.262 | 0.743 | 2.83× | 2.02e+03 | 2.15e+03 | 0.295 | 5.88e-06 | +| kkt_pglib_opf_case14_ieee_k2_15 | 344 | 7.63 | 3.01 | 0.39× | 0.217 | 1.15 | 5.28× | 0.322 | 1.17 | 3.63× | 0.435 | 0.565 | 1.30× | 2.02e+03 | 3.27e+03 | 0.221 | 0.48 | +| lap2d_300 | 90000 | 257 | 352 | 1.37× | 7.13 | 221 | 31.01× | 5.15 | 221 | 42.94× | 0.712 | 3.75 | 5.26× | 2.43e+06 | 2.47e+06 | 1.6e-12 | 1.68e-12 | +| lap3d_40 | 64000 | 332 | 428 | 1.29× | 62.9 | 1.46e+04 | 232.32× | 58.4 | 1.46e+04 | 250.39× | 1.41 | 19 | 13.42× | 1.75e+07 | 1.44e+07 | 7.68e-14 | 9.06e-14 | Single run instead of a BenchmarkTools trial (factorization above the `--single-run-above` limit): SDS on GHS_psdef/apache2, SDS on lap3d_40. @@ -103,15 +103,15 @@ Single run instead of a BenchmarkTools trial (factorization above the `--single- | matrix | n | analysis cuDSS ms | SDS ms | ratio | factorization cuDSS ms | SDS ms | ratio | refactorization cuDSS ms | SDS ms | ratio | solve cuDSS ms | SDS ms | ratio | nnz(L) cuDSS | SDS | relres cuDSS | SDS | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| kkt_pglib_opf_case118_ieee_k2_1 | 3150 | 15.8 | 54.3 | 3.43× | 0.827 | 13.8 | 16.68× | 0.371 | 13.8 | 37.20× | 0.6 | 23.4 | 39.01× | 2.02e+04 | 2.1e+04 | 0.00442 | 3.35e-09 | -| kkt_pglib_opf_case118_ieee_k2_10 | 3150 | 16 | 54.7 | 3.43× | 0.812 | 15.1 | 18.57× | 0.503 | 13.3 | 26.39× | 0.55 | 23 | 41.78× | 2.02e+04 | 2.05e+04 | 0.0164 | 5.78e-09 | -| kkt_pglib_opf_case118_ieee_k2_20 | 3150 | 15.5 | 53.1 | 3.42× | 0.828 | 13.6 | 16.47× | 0.339 | 13.6 | 40.15× | 0.596 | 22.9 | 38.43× | 2.02e+04 | 2.05e+04 | 0.189 | 7.51e-09 | -| kkt_pglib_opf_case1354_pegase_k2_1 | 33811 | 97.7 | 992 | 10.15× | 1.56 | 146 | 94.15× | 0.931 | 146 | 156.89× | 0.814 | 244 | 299.05× | 2.02e+05 | 2.16e+05 | 5.11 | 0.0159 | -| kkt_pglib_opf_case1354_pegase_k2_10 | 33811 | 97.4 | 1.09e+03 | 11.21× | 1.53 | 150 | 97.71× | 0.813 | 145 | 178.91× | 0.978 | 240 | 245.11× | 2.02e+05 | 2.2e+05 | 1.91 | 8.63 | -| kkt_pglib_opf_case1354_pegase_k2_20 | 33811 | 97.4 | 1.12e+03 | 11.53× | 1.55 | 151 | 96.87× | 0.825 | 148 | 178.98× | 0.958 | 241 | 251.59× | 2.02e+05 | 2.21e+05 | 13.9 | 0.148 | -| kkt_pglib_opf_case14_ieee_k2_1 | 344 | 7.76 | 4.38 | 0.56× | 0.222 | 1.59 | 7.17× | 0.215 | 1.58 | 7.36× | 0.719 | 2.76 | 3.84× | 2.02e+03 | 2.14e+03 | 3.23e-07 | 6.9e-13 | -| kkt_pglib_opf_case14_ieee_k2_10 | 344 | 7.47 | 5.09 | 0.68× | 0.295 | 1.63 | 5.52× | 0.233 | 2.09 | 8.98× | 1.26 | 3.89 | 3.09× | 2.02e+03 | 2.15e+03 | 9.14e-06 | 2.33e-14 | -| kkt_pglib_opf_case14_ieee_k2_15 | 344 | 7.46 | 2.54 | 0.34× | 0.206 | 2.41 | 11.71× | 0.235 | 1.82 | 7.74× | 0.65 | 2.36 | 3.63× | 2.02e+03 | 3.27e+03 | 2.4e-08 | 7.14e-09 | +| kkt_pglib_opf_case118_ieee_k2_1 | 3150 | 15.8 | 55.2 | 3.49× | 0.827 | 1.46 | 1.77× | 0.371 | 1.67 | 4.50× | 0.6 | 3.91 | 6.52× | 2.02e+04 | 2.1e+04 | 0.00442 | 3.23e-09 | +| kkt_pglib_opf_case118_ieee_k2_10 | 3150 | 16 | 55.4 | 3.47× | 0.812 | 1.37 | 1.69× | 0.503 | 1.36 | 2.71× | 0.55 | 4.29 | 7.80× | 2.02e+04 | 2.05e+04 | 0.0164 | 5.59e-09 | +| kkt_pglib_opf_case118_ieee_k2_20 | 3150 | 15.5 | 54.4 | 3.51× | 0.828 | 1.35 | 1.63× | 0.339 | 1.67 | 4.93× | 0.596 | 4.15 | 6.97× | 2.02e+04 | 2.05e+04 | 0.189 | 1.16e-08 | +| kkt_pglib_opf_case1354_pegase_k2_1 | 33811 | 97.7 | 1.01e+03 | 10.34× | 1.56 | 7.27 | 4.67× | 0.931 | 8.99 | 9.65× | 0.814 | 22.3 | 27.41× | 2.02e+05 | 2.16e+05 | 5.11 | 0.0348 | +| kkt_pglib_opf_case1354_pegase_k2_10 | 33811 | 97.4 | 1.07e+03 | 10.96× | 1.53 | 10.3 | 6.74× | 0.813 | 9.07 | 11.16× | 0.978 | 22.8 | 23.35× | 2.02e+05 | 2.2e+05 | 1.91 | 7.94 | +| kkt_pglib_opf_case1354_pegase_k2_20 | 33811 | 97.4 | 1.07e+03 | 11.03× | 1.55 | 11.2 | 7.18× | 0.825 | 11.2 | 13.63× | 0.958 | 22.8 | 23.82× | 2.02e+05 | 2.21e+05 | 13.9 | 0.216 | +| kkt_pglib_opf_case14_ieee_k2_1 | 344 | 7.76 | 4.49 | 0.58× | 0.222 | 0.713 | 3.21× | 0.215 | 0.882 | 4.10× | 0.719 | 2.16 | 3.01× | 2.02e+03 | 2.14e+03 | 3.23e-07 | 6.15e-13 | +| kkt_pglib_opf_case14_ieee_k2_10 | 344 | 7.47 | 5.04 | 0.68× | 0.295 | 0.594 | 2.01× | 0.233 | 0.755 | 3.24× | 1.26 | 1.79 | 1.42× | 2.02e+03 | 2.15e+03 | 9.14e-06 | 2.41e-14 | +| kkt_pglib_opf_case14_ieee_k2_15 | 344 | 7.46 | 2.68 | 0.36× | 0.206 | 0.966 | 4.70× | 0.235 | 0.858 | 3.65× | 0.65 | 2.31 | 3.55× | 2.02e+03 | 3.27e+03 | 2.4e-08 | 5.69e-09 | ## Uniform batch of 8, Cholesky @@ -219,4 +219,4 @@ Not run yet. ## Runs * cuDSS 0.8.0 on NVIDIA GeForce RTX 4080, repository 57e2ea9+dirty, 2026-10-02. -* SparseDirectSolver.jl 0.1.0 on NVIDIA GeForce RTX 4080, repository 73b93aa+dirty, 2026-10-02. +* SparseDirectSolver.jl 0.1.0 on NVIDIA GeForce RTX 4080, repository 9d280d0+dirty, 2026-10-02. diff --git a/bench/comparison/comparison.png b/bench/comparison/comparison.png index 4e15294..5c35c73 100644 Binary files a/bench/comparison/comparison.png and b/bench/comparison/comparison.png differ diff --git a/bench/comparison/sds.csv b/bench/comparison/sds.csv index 7a8346e..1141b16 100644 --- a/bench/comparison/sds.csv +++ b/bench/comparison/sds.csv @@ -1,61 +1,61 @@ solver,feature,task,matrix,structure,n,nnz,T,nrhs,nbatch,analysis_s,factorization_s,refactorization_s,solve_s,analysis_min_s,factorization_min_s,refactorization_min_s,solve_min_s,lu_nnz,flops,nsuperpanels,relres,samples,status,device,version,git_sha,date -sds,cholesky_f64,T13,Boeing/bcsstk38,SPD,8032,355460,Float64,1,1,0.055041544,0.023561976,0.023540804,0.001882663,0.05477267,0.023523856,0.023517671,0.001836221,804613,1.40793119e8,604,1.050998291749151e-10,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,cholesky_f64,T13,GHS_psdef/apache2,SPD,715176,4817870,Float64,1,1,6.075783352,1.031854046,1.023644657,0.076661892,6.004857578,1.026676972,1.023323183,0.073941104,129200941,1.66491403722e11,123689,1.5829650410070863e-10,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,cholesky_f64,T13,HB/bcsstk17,SPD,10974,428650,Float64,1,1,0.065546234,0.029568025,0.029604894,0.003491196,0.064005437,0.029508741,0.029566311,0.003450174,1043601,1.6795197e8,1300,5.049962573339207e-11,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,cholesky_f64,T13,kkt_pglib_opf_case118_ieee_condensed_1,SPD,1088,12860,Float64,1,1,0.004455246,0.003872081,0.00387656,0.002723033,0.004427476,0.003861251,0.003867757,0.002229274,11634,219042.0,303,0.0001499152129335686,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,cholesky_f64,T13,kkt_pglib_opf_case118_ieee_condensed_10,SPD,1088,12860,Float64,1,1,0.004783533,0.003635679,0.003674184,0.002090379,0.004704944,0.003616853,0.003617785,0.002076268,11634,219042.0,303,1.0007128179490731e-5,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,cholesky_f64,T13,kkt_pglib_opf_case118_ieee_condensed_20,SPD,1088,12860,Float64,1,1,0.004772433,0.003662303,0.003772103,0.00207468,0.004643315,0.003626044,0.003644184,0.00205492,11634,219042.0,303,0.0977012881293089,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,cholesky_f64,T13,kkt_pglib_opf_case1354_pegase_condensed_1,SPD,11192,136724,Float64,1,1,0.049981892,0.039883353,0.039883884,0.019669037,0.04814711,0.039817768,0.039802259,0.019621681,120598,2.787739e6,3134,0.00028169146220954487,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,cholesky_f64,T13,kkt_pglib_opf_case1354_pegase_condensed_10,SPD,11192,136724,Float64,1,1,0.04873287,0.038411673,0.038348444,0.019679444,0.047928509,0.038323848,0.038317108,0.019636183,120598,2.787739e6,3134,0.00014028077734730922,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,cholesky_f64,T13,kkt_pglib_opf_case1354_pegase_condensed_20,SPD,11192,136724,Float64,1,1,0.048956172,0.038327082,0.038384388,0.019673838,0.04874153,0.038309628,0.038284989,0.019523257,120598,2.787739e6,3134,7.407112355532926e-5,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,cholesky_f64,T13,kkt_pglib_opf_case14_ieee_condensed_1,SPD,118,1282,Float64,1,1,0.00096492,0.000525965,0.000555025,0.000402396,0.000899841,0.000506245,0.00051384,0.000361576,1027,15193.0,33,1.6538473403875516e-6,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,cholesky_f64,T13,kkt_pglib_opf_case14_ieee_condensed_10,SPD,118,1282,Float64,1,1,0.001552204,0.000565479,0.000540295,0.000392166,0.0010087,0.000485235,0.000493485,0.000383046,1027,15193.0,33,0.00015711648509796294,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,cholesky_f64,T13,kkt_pglib_opf_case14_ieee_condensed_11,SPD,118,1282,Float64,1,1,0.00093695,0.000490015,0.000539125,0.000379317,0.000872541,0.000487475,0.000495235,0.000340847,1027,15193.0,33,1.670170208071547e-5,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,cholesky_f64,T13,lap2d_300,SPD,90000,448800,Float64,1,1,0.370827877,0.036380188,0.036289609,0.004104809,0.356950908,0.03629023,0.036283499,0.00404394,2465905,3.73611053e8,20495,1.7761691759148163e-12,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,cholesky_f64,T13,lap3d_40,SPD,64000,438400,Float64,1,1,0.39802196,0.222990035,0.223344848,0.017043795,0.392282098,0.222942606,0.222917496,0.015558135,14387160,1.6401480134e10,11066,7.478815931690092e-14,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,cholesky_nrhs16,T12,Boeing/bcsstk38,SPD,8032,355460,Float64,16,1,0.053985858,0.023567186,0.023582937,0.003096266,0.053127947,0.023530144,0.023524176,0.003050938,804613,1.40793119e8,604,1.6616774132045366e-10,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,cholesky_nrhs16,T12,GHS_psdef/apache2,SPD,715176,4817870,Float64,16,1,6.234490898,1.027368919,1.023103829,0.255904835,6.084311257,1.025134144,1.022538139,0.255507332,129200941,1.66491403722e11,123689,1.59519352774917e-10,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,cholesky_nrhs16,T12,HB/bcsstk17,SPD,10974,428650,Float64,16,1,0.066237912,0.029497654,0.029602047,0.006562009,0.065259415,0.02945503,0.029526828,0.005622915,1043601,1.6795197e8,1300,5.922473282639887e-11,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,cholesky_nrhs16,T12,kkt_pglib_opf_case118_ieee_condensed_1,SPD,1088,12860,Float64,16,1,0.004700083,0.003873657,0.003877566,0.002180983,0.004562895,0.003854292,0.00384882,0.00205092,11634,219042.0,303,0.0001499152129335686,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,cholesky_nrhs16,T12,kkt_pglib_opf_case118_ieee_condensed_10,SPD,1088,12860,Float64,16,1,0.004559674,0.004448016,0.003637058,0.002134644,0.004472946,0.003651353,0.003604424,0.00209515,11634,219042.0,303,1.1028908236861046e-5,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,cholesky_nrhs16,T12,kkt_pglib_opf_case118_ieee_condensed_20,SPD,1088,12860,Float64,16,1,0.004737484,0.003700274,0.004006584,0.002048999,0.004496825,0.003602254,0.003609785,0.00200596,11634,219042.0,303,0.31757187210790866,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,cholesky_nrhs16,T12,kkt_pglib_opf_case1354_pegase_condensed_1,SPD,11192,136724,Float64,16,1,0.049626492,0.039599661,0.039632746,0.019355258,0.049022436,0.039589098,0.03958507,0.019294657,120598,2.787739e6,3134,0.000392992742458017,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,cholesky_nrhs16,T12,kkt_pglib_opf_case1354_pegase_condensed_10,SPD,11192,136724,Float64,16,1,0.04966657,0.038364914,0.038218948,0.019330161,0.048206482,0.038135431,0.038175365,0.019274767,120598,2.787739e6,3134,0.00014411152068572583,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,cholesky_nrhs16,T12,kkt_pglib_opf_case1354_pegase_condensed_20,SPD,11192,136724,Float64,16,1,0.049616889,0.03822914,0.038125329,0.019383157,0.049367355,0.038117826,0.038098719,0.019352948,120598,2.787739e6,3134,9.671929703062016e-5,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,cholesky_nrhs16,T12,kkt_pglib_opf_case14_ieee_condensed_1,SPD,118,1282,Float64,16,1,0.00097384,0.000555105,0.000542974,0.000449095,0.000866742,0.000521184,0.000535355,0.000358437,1027,15193.0,33,2.709170129303515e-6,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,cholesky_nrhs16,T12,kkt_pglib_opf_case14_ieee_condensed_10,SPD,118,1282,Float64,16,1,0.001064299,0.000510703,0.000504045,0.000485675,0.000858991,0.000500455,0.000486805,0.000375226,1027,15193.0,33,0.00045426768909551265,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,cholesky_nrhs16,T12,kkt_pglib_opf_case14_ieee_condensed_11,SPD,118,1282,Float64,16,1,0.00094125,0.000521325,0.000543315,0.000446326,0.000925591,0.000490775,0.000487025,0.000401526,1027,15193.0,33,3.7141469401124885e-5,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,cholesky_nrhs16,T12,lap2d_300,SPD,90000,448800,Float64,16,1,0.334096298,0.036393987,0.036393583,0.009137589,0.333249383,0.036343764,0.036319827,0.009098138,2465905,3.73611053e8,20495,1.7988719466898246e-12,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,cholesky_nrhs16,T12,lap3d_40,SPD,64000,438400,Float64,16,1,0.409275291,0.222932391,0.223009715,0.050472229,0.404915674,0.222682934,0.22295914,0.049418747,14387160,1.6401480134e10,11066,8.447248176670233e-14,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt,T15,Boeing/bcsstk38,S,8032,355460,Float64,1,1,0.061063483,0.129022486,0.129089467,0.002818442,0.059272134,0.128936368,0.129019492,0.001903311,804613,1.40793119e8,604,1.2512823581094381e-10,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt,T15,GHS_psdef/apache2,S,715176,4817870,Float64,1,1,6.966277483,90.742153005,91.194098803,0.089128092,6.966277483,90.742153005,91.194098803,0.089128092,129200941,1.66491403722e11,123689,1.6291268746741202e-10,1,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt,T15,HB/bcsstk17,S,10974,428650,Float64,1,1,0.072706655,0.198275825,0.198263953,0.003797132,0.070868664,0.198257019,0.198193158,0.003681003,1043601,1.6795197e8,1300,3.707249888539958e-11,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt,T15,kkt_pglib_opf_case118_ieee_condensed_1,S,1088,12860,Float64,1,1,0.00503649,0.0050286,0.005032138,0.002611824,0.004889712,0.004991059,0.005015509,0.002338457,11634,219042.0,303,6.969655897665449e-5,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt,T15,kkt_pglib_opf_case118_ieee_condensed_10,S,1088,12860,Float64,1,1,0.005121053,0.004988512,0.004894846,0.002376846,0.005033365,0.004834392,0.004850692,0.002365701,11634,219042.0,303,9.740282741453158e-6,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt,T15,kkt_pglib_opf_case118_ieee_condensed_20,S,1088,12860,Float64,1,1,0.00504261,0.005042945,0.005025285,0.002379726,0.004871682,0.00499047,0.004990749,0.002369027,11634,219042.0,303,0.07793477586360127,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt,T15,kkt_pglib_opf_case118_ieee_k2_1,S,3150,17714,Float64,1,1,0.054193661,0.013793913,0.013814408,0.007732719,0.052808174,0.013779913,0.013785283,0.007706387,21032,308794.0,1917,0.23695532264533115,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt,T15,kkt_pglib_opf_case118_ieee_k2_10,S,3150,17714,Float64,1,1,0.054115257,0.014978147,0.013323078,0.007690192,0.053494918,0.013254027,0.013263097,0.007660205,20542,292847.0,1906,0.01060874507064105,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt,T15,kkt_pglib_opf_case118_ieee_k2_20,S,3150,17714,Float64,1,1,0.053061332,0.01355436,0.013593394,0.007678673,0.052354006,0.013546596,0.013568231,0.007639475,20507,291377.0,1889,0.027042646838526467,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt,T15,kkt_pglib_opf_case1354_pegase_condensed_1,S,11192,136724,Float64,1,1,0.052076252,0.056332599,0.056272926,0.022579436,0.051053828,0.056288656,0.05625831,0.022551016,120598,2.787739e6,3134,0.00032169280786670235,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt,T15,kkt_pglib_opf_case1354_pegase_condensed_10,S,11192,136724,Float64,1,1,0.052021244,0.055731125,0.055726805,0.022552461,0.051619108,0.055686641,0.05568685,0.022537766,120598,2.787739e6,3134,9.534327884384974e-5,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt,T15,kkt_pglib_opf_case1354_pegase_condensed_20,S,11192,136724,Float64,1,1,0.05224864,0.056120652,0.056074372,0.022592766,0.051581671,0.056092957,0.056045671,0.022542996,120598,2.787739e6,3134,4.9109638733395656e-5,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt,T15,kkt_pglib_opf_case1354_pegase_k2_1,S,33811,188063,Float64,1,1,1.034719937,0.146043353,0.146048612,0.078678983,1.018265641,0.146023671,0.146007897,0.078667558,215953,3.404739e6,19624,14.214742644178667,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt,T15,kkt_pglib_opf_case1354_pegase_k2_10,S,33811,188063,Float64,1,1,1.087224016,0.160531018,0.145358463,0.079023534,1.076392049,0.145818691,0.14531794,0.078921025,220146,3.494638e6,19496,51.66970951161263,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt,T15,kkt_pglib_opf_case1354_pegase_k2_20,S,33811,188063,Float64,1,1,1.104788265,0.168333076,0.147665805,0.079119723,1.09590177,0.147641951,0.147638537,0.079012984,221292,3.599399e6,19600,15.32248012620186,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt,T15,kkt_pglib_opf_case14_ieee_condensed_1,S,118,1282,Float64,1,1,0.001169209,0.000614974,0.000628584,0.000418186,0.00103519,0.000600084,0.000603454,0.000394086,1027,15193.0,33,8.086607326073917e-7,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt,T15,kkt_pglib_opf_case14_ieee_condensed_10,S,118,1282,Float64,1,1,0.001053199,0.001027139,0.000630214,0.000457705,0.00099222,0.000753818,0.000596454,0.000410996,1027,15193.0,33,0.0001562445067991457,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt,T15,kkt_pglib_opf_case14_ieee_condensed_11,S,118,1282,Float64,1,1,0.001057939,0.000681173,0.000604554,0.000504465,0.00100525,0.000588785,0.000596604,0.000393426,1027,15193.0,33,5.097826580562365e-6,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt,T15,kkt_pglib_opf_case14_ieee_k2_1,S,344,1924,Float64,1,1,0.004082119,0.00201686,0.001586234,0.000960371,0.004022189,0.001946523,0.001536285,0.000947731,2139,26663.0,186,1.0697170401067997e-8,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt,T15,kkt_pglib_opf_case14_ieee_k2_10,S,344,1924,Float64,1,1,0.004873231,0.001818783,0.001604724,0.000947545,0.004666403,0.001732722,0.001578415,0.000934141,2154,27106.0,185,2.7456609715314606e-5,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt,T15,kkt_pglib_opf_case14_ieee_k2_15,S,344,1924,Float64,1,1,0.003557984,0.001709313,0.001747463,0.000842302,0.002675153,0.001701744,0.001701943,0.000824522,3273,56950.0,85,0.3235038258289765,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt,T15,lap2d_300,S,90000,448800,Float64,1,1,0.348791021,0.240367346,0.240674043,0.004701802,0.345909569,0.240345981,0.24044258,0.004654757,2465905,3.73611053e8,20495,1.6832598767896702e-12,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt,T15,lap3d_40,S,64000,438400,Float64,1,1,0.415790411,14.612541103,14.612355501,0.019351862,0.415790411,14.612541103,14.612355501,0.019351862,14387160,1.6401480134e10,11066,9.061811084088796e-14,1,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt_ir2,T16,kkt_pglib_opf_case118_ieee_k2_1,S,3150,17714,Float64,1,1,0.054299737,0.013801582,0.013799794,0.023410607,0.053704662,0.013783426,0.013765864,0.023257204,21032,308794.0,1917,3.3512086898080463e-9,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt_ir2,T16,kkt_pglib_opf_case118_ieee_k2_10,S,3150,17714,Float64,1,1,0.054693776,0.01507601,0.013270667,0.022995126,0.053929471,0.01498966,0.013263759,0.022858374,20542,292847.0,1906,5.776933647623207e-9,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt_ir2,T16,kkt_pglib_opf_case118_ieee_k2_20,S,3150,17714,Float64,1,1,0.05306064,0.013643744,0.013607562,0.022889278,0.052331748,0.013555077,0.013550177,0.022725457,20507,291377.0,1889,7.507645151131128e-9,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt_ir2,T16,kkt_pglib_opf_case1354_pegase_k2_1,S,33811,188063,Float64,1,1,0.991926506,0.146429037,0.146120059,0.243511976,0.98327876,0.146056859,0.146034119,0.242889352,215953,3.404739e6,19624,0.01594796168284804,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt_ir2,T16,kkt_pglib_opf_case1354_pegase_k2_10,S,33811,188063,Float64,1,1,1.091847841,0.149976461,0.145415602,0.239672107,1.08411467,0.145363863,0.145329983,0.239304801,220146,3.494638e6,19496,8.630339939807564,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt_ir2,T16,kkt_pglib_opf_case1354_pegase_k2_20,S,33811,188063,Float64,1,1,1.123629585,0.150556733,0.147732345,0.240913364,1.097421125,0.147659733,0.147692785,0.239965147,221292,3.599399e6,19600,0.14771862721996226,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt_ir2,T16,kkt_pglib_opf_case14_ieee_k2_1,S,344,1924,Float64,1,1,0.004375957,0.001593206,0.001583714,0.002756917,0.0039867,0.001559215,0.001540205,0.002722203,2139,26663.0,186,6.896972747993074e-13,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt_ir2,T16,kkt_pglib_opf_case14_ieee_k2_10,S,344,1924,Float64,1,1,0.00509171,0.001626868,0.00209265,0.003889711,0.004957215,0.001564664,0.001592625,0.003410052,2154,27106.0,185,2.3271477086231642e-14,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 -sds,ldlt_ir2,T16,kkt_pglib_opf_case14_ieee_k2_15,S,344,1924,Float64,1,1,0.002540124,0.002406726,0.001815996,0.002360497,0.002492155,0.001705623,0.001719133,0.002343986,3273,56950.0,85,7.139728621879342e-9,5,ok,NVIDIA GeForce RTX 4080,0.1.0,73b93aa+dirty,2026-10-02 +sds,cholesky_f64,T13,Boeing/bcsstk38,SPD,8032,355460,Float64,1,1,0.052895817,0.022689148,0.022612044,0.001930507,0.052309103,0.0225327,0.022544785,0.001828849,804613,1.40793119e8,604,9.228321860958985e-11,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,cholesky_f64,T13,GHS_psdef/apache2,SPD,715176,4817870,Float64,1,1,6.166784823,1.035411549,1.023398631,0.0740429,6.08023181,1.027918907,1.022790193,0.07390622,129200941,1.66491403722e11,123689,1.5829609495382997e-10,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,cholesky_f64,T13,HB/bcsstk17,SPD,10974,428650,Float64,1,1,0.066521199,0.027796134,0.027816896,0.004191822,0.064239352,0.027718274,0.027724356,0.003468137,1043601,1.6795197e8,1300,5.329711250207285e-11,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,cholesky_f64,T13,kkt_pglib_opf_case118_ieee_condensed_1,SPD,1088,12860,Float64,1,1,0.005003332,0.001124552,0.001177142,0.000795485,0.004766359,0.000885744,0.000918514,0.000706246,11634,219042.0,303,0.00011749638207710804,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,cholesky_f64,T13,kkt_pglib_opf_case118_ieee_condensed_10,SPD,1088,12860,Float64,1,1,0.004961799,0.001006833,0.000928334,0.000894103,0.004755579,0.000952364,0.000879194,0.000734935,11634,219042.0,303,8.282771964454982e-6,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,cholesky_f64,T13,kkt_pglib_opf_case118_ieee_condensed_20,SPD,1088,12860,Float64,1,1,0.004937056,0.001247291,0.001070182,0.001024083,0.004745538,0.000985173,0.000883624,0.000715305,11634,219042.0,303,0.07466949011173213,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,cholesky_f64,T13,kkt_pglib_opf_case1354_pegase_condensed_1,SPD,11192,136724,Float64,1,1,0.051688195,0.004570869,0.00299375,0.001555929,0.050475293,0.002959195,0.00294383,0.001157008,120598,2.787739e6,3134,0.0002400209917323507,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,cholesky_f64,T13,kkt_pglib_opf_case1354_pegase_condensed_10,SPD,11192,136724,Float64,1,1,0.052849985,0.004720808,0.004201862,0.001157737,0.051216659,0.003400199,0.002935852,0.001148778,120598,2.787739e6,3134,0.00010652307483999695,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,cholesky_f64,T13,kkt_pglib_opf_case1354_pegase_condensed_20,SPD,11192,136724,Float64,1,1,0.051370368,0.002925531,0.003947863,0.00147781,0.051090671,0.00290696,0.00292771,0.001150873,120598,2.787739e6,3134,4.9714122630844477e-5,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,cholesky_f64,T13,kkt_pglib_opf_case14_ieee_condensed_1,SPD,118,1282,Float64,1,1,0.000938362,0.000483246,0.000393448,0.000568817,0.000915754,0.000332478,0.000322768,0.000391968,1027,15193.0,33,1.3024460439372e-6,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,cholesky_f64,T13,kkt_pglib_opf_case14_ieee_condensed_10,SPD,118,1282,Float64,1,1,0.000984983,0.000351427,0.000425207,0.000473546,0.000927644,0.000331138,0.000329927,0.000394408,1027,15193.0,33,0.00017225756315640304,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,cholesky_f64,T13,kkt_pglib_opf_case14_ieee_condensed_11,SPD,118,1282,Float64,1,1,0.001600385,0.000351278,0.000490077,0.000442517,0.000920523,0.000331408,0.000328388,0.000407448,1027,15193.0,33,1.5565096136251653e-5,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,cholesky_f64,T13,lap2d_300,SPD,90000,448800,Float64,1,1,0.363597823,0.031528722,0.03143196,0.003313087,0.359637733,0.031400434,0.03136149,0.003282588,2465905,3.73611053e8,20495,1.7771927055373497e-12,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,cholesky_f64,T13,lap3d_40,SPD,64000,438400,Float64,1,1,0.381863192,0.223146394,0.223414887,0.018067357,0.377376529,0.222864897,0.223028749,0.015779969,14387160,1.6401480134e10,11066,7.47528486407178e-14,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,cholesky_nrhs16,T12,Boeing/bcsstk38,SPD,8032,355460,Float64,16,1,0.053352371,0.024425303,0.02254784,0.00308884,0.052144044,0.022529336,0.022515445,0.003084509,804613,1.40793119e8,604,1.8361229983712143e-10,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,cholesky_nrhs16,T12,GHS_psdef/apache2,SPD,715176,4817870,Float64,16,1,6.13672171,1.030616802,1.022590665,0.256170636,6.049268182,1.022599653,1.022064699,0.255566832,129200941,1.66491403722e11,123689,1.595193195901826e-10,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,cholesky_nrhs16,T12,HB/bcsstk17,SPD,10974,428650,Float64,16,1,0.066444193,0.027809125,0.027848969,0.005850721,0.064335362,0.027718646,0.027765015,0.005628426,1043601,1.6795197e8,1300,5.369098269031941e-11,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,cholesky_nrhs16,T12,kkt_pglib_opf_case118_ieee_condensed_1,SPD,1088,12860,Float64,16,1,0.004806148,0.0014314,0.001032478,0.001026603,0.004764199,0.001067463,0.000893174,0.000776525,11634,219042.0,303,0.0001043087115585084,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,cholesky_nrhs16,T12,kkt_pglib_opf_case118_ieee_condensed_10,SPD,1088,12860,Float64,16,1,0.004732858,0.001417461,0.001059702,0.000867864,0.00470927,0.000985753,0.001009113,0.000777325,11634,219042.0,303,8.768107291420912e-6,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,cholesky_nrhs16,T12,kkt_pglib_opf_case118_ieee_condensed_20,SPD,1088,12860,Float64,16,1,0.004885028,0.001120333,0.000948878,0.000906623,0.004740848,0.000863595,0.000876999,0.000782925,11634,219042.0,303,0.3030078999673735,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,cholesky_nrhs16,T12,kkt_pglib_opf_case1354_pegase_condensed_1,SPD,11192,136724,Float64,16,1,0.051818795,0.004414241,0.003626995,0.001908587,0.050626528,0.003080339,0.003592556,0.0014711,120598,2.787739e6,3134,0.00032077686694919835,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,cholesky_nrhs16,T12,kkt_pglib_opf_case1354_pegase_condensed_10,SPD,11192,136724,Float64,16,1,0.051397951,0.002939895,0.002953939,0.001688338,0.050813628,0.002913971,0.00289104,0.001458825,120598,2.787739e6,3134,0.00010636507833791159,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,cholesky_nrhs16,T12,kkt_pglib_opf_case1354_pegase_condensed_20,SPD,11192,136724,Float64,16,1,0.051472888,0.003009023,0.002933916,0.001903077,0.051040391,0.00291829,0.00291166,0.001579804,120598,2.787739e6,3134,6.697396768149495e-5,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,cholesky_nrhs16,T12,kkt_pglib_opf_case14_ieee_condensed_1,SPD,118,1282,Float64,16,1,0.001057384,0.000479466,0.000394257,0.001058792,0.000936084,0.000331878,0.000358987,0.000476697,1027,15193.0,33,1.2908326616431468e-6,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,cholesky_nrhs16,T12,kkt_pglib_opf_case14_ieee_condensed_10,SPD,118,1282,Float64,16,1,0.002164565,0.000532786,0.000485677,0.000509646,0.000908993,0.000325478,0.000363288,0.000430257,1027,15193.0,33,0.00026816205019114704,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,cholesky_nrhs16,T12,kkt_pglib_opf_case14_ieee_condensed_11,SPD,118,1282,Float64,16,1,0.001020132,0.000425807,0.000357847,0.000449716,0.000952953,0.000349898,0.000330647,0.000428507,1027,15193.0,33,1.4705124707443054e-5,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,cholesky_nrhs16,T12,lap2d_300,SPD,90000,448800,Float64,16,1,0.325324887,0.03152837,0.031424426,0.008513792,0.314441856,0.031439825,0.031318001,0.008498163,2465905,3.73611053e8,20495,1.7851598547374033e-12,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,cholesky_nrhs16,T12,lap3d_40,SPD,64000,438400,Float64,16,1,0.386902999,0.223042271,0.22320726,0.049068244,0.385093288,0.222839828,0.222611719,0.048659465,14387160,1.6401480134e10,11066,8.448190094604811e-14,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt,T15,Boeing/bcsstk38,S,8032,355460,Float64,1,1,0.060624225,0.131407119,0.131362702,0.002029925,0.059439843,0.13137589,0.131347536,0.001910636,804613,1.40793119e8,604,1.4180843867122588e-10,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt,T15,GHS_psdef/apache2,S,715176,4817870,Float64,1,1,7.107202684,90.755114345,91.203945714,0.08917829,7.107202684,90.755114345,91.203945714,0.08917829,129200941,1.66491403722e11,123689,1.629045645261273e-10,1,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt,T15,HB/bcsstk17,S,10974,428650,Float64,1,1,0.071961975,0.197887792,0.197856718,0.003685172,0.070547262,0.197867827,0.197776184,0.003669032,1043601,1.6795197e8,1300,3.693578455267767e-11,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt,T15,kkt_pglib_opf_case118_ieee_condensed_1,S,1088,12860,Float64,1,1,0.005745238,0.001926796,0.001701419,0.000740874,0.005228572,0.001491029,0.001513493,0.000723474,11634,219042.0,303,4.302669682539129e-5,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt,T15,kkt_pglib_opf_case118_ieee_condensed_10,S,1088,12860,Float64,1,1,0.005194696,0.002214169,0.002787787,0.001750367,0.005080131,0.001637618,0.001799307,0.001066752,11634,219042.0,303,1.1399610969542334e-5,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt,T15,kkt_pglib_opf_case118_ieee_condensed_20,S,1088,12860,Float64,1,1,0.00525929,0.001663352,0.002498752,0.000871243,0.00520416,0.001584528,0.001724887,0.000754464,11634,219042.0,303,0.08325458299212221,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt,T15,kkt_pglib_opf_case118_ieee_k2_1,S,3150,17714,Float64,1,1,0.055343651,0.00150123,0.001978034,0.000896683,0.054610868,0.00139382,0.00142681,0.000823674,21032,308794.0,1917,0.09056867773597634,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt,T15,kkt_pglib_opf_case118_ieee_k2_10,S,3150,17714,Float64,1,1,0.0555984,0.00139845,0.001353419,0.001494139,0.054707287,0.001327759,0.001330961,0.000849923,20542,292847.0,1906,0.01922668190063813,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt,T15,kkt_pglib_opf_case118_ieee_k2_20,S,3150,17714,Float64,1,1,0.05421622,0.00133248,0.001501393,0.001588253,0.053774374,0.001320149,0.001313525,0.000957439,20507,291377.0,1889,0.014854294291476057,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt,T15,kkt_pglib_opf_case1354_pegase_condensed_1,S,11192,136724,Float64,1,1,0.054796466,0.009824687,0.009603797,0.001224495,0.054552087,0.009600263,0.009591012,0.001200021,120598,2.787739e6,3134,0.00027545234473510356,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt,T15,kkt_pglib_opf_case1354_pegase_condensed_10,S,11192,136724,Float64,1,1,0.055422452,0.009602167,0.009617228,0.002194214,0.05428184,0.009593329,0.009571867,0.00123898,120598,2.787739e6,3134,9.488278667035474e-5,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt,T15,kkt_pglib_opf_case1354_pegase_condensed_20,S,11192,136724,Float64,1,1,0.054016472,0.011066087,0.009729919,0.00145556,0.053790238,0.010603346,0.009716458,0.00121572,120598,2.787739e6,3134,5.0192353762337224e-5,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt,T15,kkt_pglib_opf_case1354_pegase_k2_1,S,33811,188063,Float64,1,1,1.004016075,0.015597837,0.007240037,0.002638421,0.99742274,0.007233705,0.007170497,0.001572179,215953,3.404739e6,19624,13.01856461229925,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt,T15,kkt_pglib_opf_case1354_pegase_k2_10,S,33811,188063,Float64,1,1,1.065767901,0.007882551,0.007240921,0.00260473,1.062880945,0.007190032,0.00628589,0.00135963,220146,3.494638e6,19496,52.848192429671556,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt,T15,kkt_pglib_opf_case1354_pegase_k2_20,S,33811,188063,Float64,1,1,1.077886349,0.013019252,0.011003308,0.001685644,1.073363761,0.008562279,0.007917806,0.001496138,221292,3.599399e6,19600,47.992929768911,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt,T15,kkt_pglib_opf_case14_ieee_condensed_1,S,118,1282,Float64,1,1,0.001127281,0.000385627,0.000436776,0.000539256,0.001057122,0.000364507,0.000371267,0.000429547,1027,15193.0,33,1.1657999541762487e-6,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt,T15,kkt_pglib_opf_case14_ieee_condensed_10,S,118,1282,Float64,1,1,0.001352675,0.000463447,0.000472476,0.000465566,0.001049342,0.000369728,0.000429867,0.000428587,1027,15193.0,33,0.00013880687786021974,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt,T15,kkt_pglib_opf_case14_ieee_condensed_11,S,118,1282,Float64,1,1,0.001277951,0.000508636,0.000710394,0.000487586,0.001036812,0.000442206,0.000481592,0.000427987,1027,15193.0,33,1.1319105246087817e-5,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt,T15,kkt_pglib_opf_case14_ieee_k2_1,S,344,1924,Float64,1,1,0.004259567,0.000838714,0.000668709,0.000575875,0.004160759,0.000555685,0.000589436,0.000542126,2139,26663.0,186,7.679955110816424e-9,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt,T15,kkt_pglib_opf_case14_ieee_k2_10,S,344,1924,Float64,1,1,0.005011122,0.000560776,0.000680865,0.000743114,0.004824065,0.000556056,0.000606406,0.000520316,2154,27106.0,185,5.877775182937206e-6,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt,T15,kkt_pglib_opf_case14_ieee_k2_15,S,344,1924,Float64,1,1,0.003013006,0.001146422,0.001168541,0.000565445,0.00272051,0.000994923,0.000940113,0.000559966,3273,56950.0,85,0.480402287562271,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt,T15,lap2d_300,S,90000,448800,Float64,1,1,0.352224026,0.221263451,0.221137994,0.003748761,0.347788493,0.220387852,0.221107635,0.003679562,2465905,3.73611053e8,20495,1.6779389216462592e-12,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt,T15,lap3d_40,S,64000,438400,Float64,1,1,0.427970632,14.612296974,14.613361251,0.018982602,0.427970632,14.612296974,14.613361251,0.018982602,14387160,1.6401480134e10,11066,9.063326423318782e-14,1,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt_ir2,T16,kkt_pglib_opf_case118_ieee_k2_1,S,3150,17714,Float64,1,1,0.055196048,0.001461409,0.001667507,0.003909787,0.054259484,0.00141077,0.001403119,0.003774639,21032,308794.0,1917,3.2260005214076745e-9,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt_ir2,T16,kkt_pglib_opf_case118_ieee_k2_10,S,3150,17714,Float64,1,1,0.055369095,0.00136816,0.001362058,0.004290508,0.054318588,0.00133382,0.001339428,0.003783444,20542,292847.0,1906,5.5897389139096295e-9,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt_ir2,T16,kkt_pglib_opf_case118_ieee_k2_20,S,3150,17714,Float64,1,1,0.054366693,0.001350819,0.001671586,0.004152631,0.053275971,0.001335069,0.001420728,0.0037175,20507,291377.0,1889,1.160357102037044e-8,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt_ir2,T16,kkt_pglib_opf_case1354_pegase_k2_1,S,33811,188063,Float64,1,1,1.010063189,0.007270851,0.008991956,0.022317976,1.003646642,0.007231236,0.007204166,0.021328615,215953,3.404739e6,19624,0.034762418896692626,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt_ir2,T16,kkt_pglib_opf_case1354_pegase_k2_10,S,33811,188063,Float64,1,1,1.067244555,0.01034738,0.00906991,0.022827412,1.061806312,0.006174879,0.006321956,0.021533663,220146,3.494638e6,19496,7.936310503696266,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt_ir2,T16,kkt_pglib_opf_case1354_pegase_k2_20,S,33811,188063,Float64,1,1,1.07477958,0.011161858,0.011246247,0.022811512,1.063724657,0.009126394,0.007992944,0.021728675,221292,3.599399e6,19600,0.2161981921511238,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt_ir2,T16,kkt_pglib_opf_case14_ieee_k2_1,S,344,1924,Float64,1,1,0.004491031,0.000713474,0.000881953,0.002160144,0.004418033,0.000551436,0.000564095,0.001663596,2139,26663.0,186,6.147932736718633e-13,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt_ir2,T16,kkt_pglib_opf_case14_ieee_k2_10,S,344,1924,Float64,1,1,0.005043358,0.000593745,0.000754834,0.001786805,0.004973018,0.000586476,0.000562155,0.001700796,2154,27106.0,185,2.4139806966654987e-14,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 +sds,ldlt_ir2,T16,kkt_pglib_opf_case14_ieee_k2_15,S,344,1924,Float64,1,1,0.002677508,0.000966181,0.000857869,0.002308462,0.002588568,0.000854268,0.000827763,0.00185908,3273,56950.0,85,5.6903688411491105e-9,5,ok,NVIDIA GeForce RTX 4080,0.1.0,9d280d0+dirty,2026-10-02 diff --git a/bench/profile/phase_split.csv b/bench/profile/phase_split.csv new file mode 100644 index 0000000..177ad5e --- /dev/null +++ b/bench/profile/phase_split.csv @@ -0,0 +1,36 @@ +matrix,structure,n,nnz,lnnz,nsuper,a_fronts,subtrees,largest_subtree,b_fronts,c_fronts,groups,nlevels,refac_wall_ms,refac_kernels,refac_copies,refac_busy_ms,refac_top_ms,refac_top_name,refac_top_blocks,solve_wall_ms,solve_kernels,solve_copies,solve_busy_ms,solve_top_ms,solve_top_name,relres +lap2d_300,SPD,90000,448800,2465905,20495,19955,806,262,523,17,46,27,31.44529,202,36,31.295207991206553,3.0834229983156547,subtree_cholesky_kernel,696,3.294863,163,1,2.9057469946565107,0.48890600010054186,solve_fwd_kernel,1.7774016608331202e-12 +lap2d_300,S,90000,448800,2465905,20495,19955,806,262,523,17,46,27,220.802131,47,2,220.83750395540847,35.3783639948233,front_ldlt_kernel,2,3.665859,198,1,3.1881720133242197,0.5999050044920295,solve_fwd_kernel,1.6783599803865397e-12 +lap3d_40,SPD,64000,438400,14387160,11066,9851,1498,27,1058,157,88,36,223.953453,1222,320,223.2460540253669,6.0352479995344765,_extend_add_kernel,2,16.768692,1429,1,9.254060081730131,0.35596900124801323,trsm_lt_kernel,7.475631434439173e-14 +HB/bcsstk17,SPD,10974,428650,1043601,1300,992,815,8,290,18,69,34,27.849983,243,38,27.598129978287034,1.0920340064330958,front_cholesky_kernel,1,3.491351,191,1,3.0197519954526797,0.06867199408588931,solve_fwd_kernel,5.105278871525632e-11 +HB/bcsstk17,S,10974,428650,1043601,1300,992,815,8,290,18,69,34,197.960209,70,2,198.0250450433232,31.505417995504104,front_ldlt_kernel,1,3.635751,228,1,3.1704700086265802,0.07036799797788262,solve_fwd_kernel,3.6684981140633515e-11 +Boeing/bcsstk38,SPD,8032,355460,804613,604,341,223,7,254,9,59,14,22.660463,143,20,22.270702036621515,1.0720339996623807,front_cholesky_kernel,1,1.884735,96,1,1.5357809970737435,0.07619200187036768,solve_fwd_kernel,8.26086983891215e-11 +Boeing/bcsstk38,S,8032,355460,804613,604,341,223,7,254,9,59,14,131.820426,60,2,132.24200403055875,20.83540699823061,front_ldlt_kernel,1,1.945973,115,1,1.5975740971043706,0.07766400085529312,solve_fwd_kernel,1.0597584716249112e-10 +GHS_psdef/apache2,SPD,715176,4817870,129200941,123689,112442,15048,30,10493,754,105,35,1029.878895,6608,1570,1024.3736852353322,28.693181993730832,subtree_cholesky_kernel,3287,80.469638,6631,1,55.67874774715165,0.9998429959523492,solve_bwd_kernel,1.5829650410070863e-10 +kkt_pglib_opf_case118_ieee_condensed_1,SPD,1088,12860,11634,303,40,40,1,263,0,29,23,0.914522,30,2,0.6628190167248249,0.0606399989919737,front_cholesky_kernel,1,0.726064,48,1,0.38377896999008954,0.020961000700481236,solve_fwd_kernel,0.000152235936716747 +kkt_pglib_opf_case118_ieee_condensed_1,S,1088,12860,11634,303,40,40,1,263,0,29,23,1.510877,30,2,1.3022100029047579,0.1856320013757795,front_ldlt_kernel,1,0.769993,49,1,0.41168000461766496,0.022527994588017464,solve_fwd_kernel,9.7765347095072e-5 +kkt_pglib_opf_case118_ieee_condensed_10,SPD,1088,12860,11634,303,40,40,1,263,0,29,23,0.880533,30,2,0.6480979936895892,0.060800004575867206,front_cholesky_kernel,1,0.723924,48,1,0.38406903331633657,0.02105600287904963,solve_fwd_kernel,7.797050029651081e-6 +kkt_pglib_opf_case118_ieee_condensed_10,S,1088,12860,11634,303,40,40,1,263,0,29,23,1.472488,30,2,1.660386027651839,0.4418900061864406,front_ldlt_kernel,1,0.808113,49,1,0.411361972510349,0.022303996956907213,solve_fwd_kernel,1.0320953105576168e-5 +kkt_pglib_opf_case118_ieee_condensed_20,SPD,1088,12860,11634,303,40,40,1,263,0,29,23,0.875772,30,2,0.6487719729193486,0.06060799933038652,front_cholesky_kernel,1,0.743034,48,1,0.38307700015138835,0.02105600287904963,solve_fwd_kernel,0.0801795774065569 +kkt_pglib_opf_case118_ieee_condensed_20,S,1088,12860,11634,303,40,40,1,263,0,29,23,1.569247,30,2,1.3665969818248414,0.1975370032596402,front_ldlt_kernel,1,0.763124,49,1,0.4106239939574152,0.022079999325796962,solve_fwd_kernel,0.07316220446962236 +kkt_pglib_opf_case118_ieee_k2_1,S,3150,17714,21032,1917,1312,480,8,605,0,28,31,1.453888,29,2,1.2296700006118044,0.11494399950606748,front_ldlt_kernel,1,0.882853,59,1,0.454590015579015,0.022976004402153194,solve_fwd_kernel,0.3310520998820626 +kkt_pglib_opf_case118_ieee_k2_10,S,3150,17714,20542,1906,1302,477,8,604,0,28,31,1.342209,29,2,1.1530609626788646,0.10304099851055071,front_ldlt_kernel,1,0.899903,59,1,0.45564699394162744,0.021536005078814924,solve_fwd_kernel,0.012613239140897684 +kkt_pglib_opf_case118_ieee_k2_20,S,3150,17714,20507,1889,1288,474,8,601,0,28,31,1.336359,29,2,1.148035989899654,0.10806499631144106,front_ldlt_kernel,1,0.885523,59,1,0.4536690321401693,0.0208000055863522,solve_fwd_kernel,0.0325397117574032 +kkt_pglib_opf_case1354_pegase_condensed_1,SPD,11192,136724,120598,3134,1719,544,18,1415,0,58,39,2.931405,59,2,2.687277054064907,0.3060490053030662,front_cholesky_kernel,1,1.123841,62,1,0.9010280191432685,0.04396800068207085,solve_fwd_kernel,0.0002922762851143221 +kkt_pglib_opf_case1354_pegase_condensed_1,S,11192,136724,120598,3134,1719,544,18,1415,0,58,39,9.664206,59,2,9.863708000921179,1.7467569996370003,front_ldlt_kernel,1,1.24403,63,1,0.9552019982947968,0.04595199425239116,solve_fwd_kernel,0.00028641285196672524 +kkt_pglib_opf_case1354_pegase_condensed_10,SPD,11192,136724,120598,3134,1719,544,18,1415,0,58,39,2.915935,59,2,2.6555930089671165,0.30630500259576365,front_cholesky_kernel,1,1.209319,62,1,0.899747981748078,0.04396800068207085,solve_fwd_kernel,9.90395905078389e-5 +kkt_pglib_opf_case1354_pegase_condensed_10,S,11192,136724,120598,3134,1719,544,18,1415,0,58,39,9.68094,59,2,9.450581004784908,0.9588500033714809,front_ldlt_kernel,1,1.20882,63,1,0.954018032643944,0.04604800051311031,solve_fwd_kernel,0.00010154295478790375 +kkt_pglib_opf_case1354_pegase_condensed_20,SPD,11192,136724,120598,3134,1719,544,18,1415,0,58,39,2.920785,59,2,2.6292209440725856,0.30598499870393425,front_cholesky_kernel,1,1.140891,62,1,0.9003860104712658,0.043807995098177344,solve_fwd_kernel,5.2680720800196e-5 +kkt_pglib_opf_case1354_pegase_condensed_20,S,11192,136724,120598,3134,1719,544,18,1415,0,58,39,9.799626,59,2,9.55247203091858,1.0031709971372038,front_ldlt_kernel,1,1.248419,63,1,0.9538879676256329,0.04585600254358724,solve_fwd_kernel,4.977225669383965e-5 +kkt_pglib_opf_case1354_pegase_k2_1,S,33811,188063,215953,19624,17466,4207,43,2158,0,57,45,7.18248,58,2,7.405935044516809,0.7182409972301684,front_ldlt_kernel,1,1.450433,85,1,1.0938220075331628,0.11433700274210423,solve_fwd_kernel,19.27417625783232 +kkt_pglib_opf_case1354_pegase_k2_10,S,33811,188063,220146,19496,17333,4178,35,2163,0,53,40,6.139348,54,2,5.9121530066477135,0.4744660036521964,front_ldlt_kernel,1,1.311609,73,1,0.9801010019145906,0.09952000254997984,solve_fwd_kernel,70.23442035360941 +kkt_pglib_opf_case1354_pegase_k2_20,S,33811,188063,221292,19600,17473,4143,39,2127,0,53,44,7.984944,54,2,7.733236969215795,0.8649939991300926,front_ldlt_kernel,1,1.376158,79,1,1.0511369910091162,0.10255999950459227,solve_fwd_kernel,23.69776716342436 +kkt_pglib_opf_case14_ieee_condensed_1,SPD,118,1282,1027,33,0,0,0,33,0,11,11,0.363787,12,2,0.17347301036352292,0.02476800000295043,front_cholesky_kernel,12,0.417837,24,1,0.13132902677170932,0.010367999493610114,solve_fwd_kernel,1.3024460439372e-6 +kkt_pglib_opf_case14_ieee_condensed_1,S,118,1282,1027,33,0,0,0,33,0,11,11,0.353667,12,2,0.24371498147957027,0.03344099968671799,front_ldlt_kernel,1,0.444556,25,1,0.14550499327015132,0.011488002201076597,solve_fwd_kernel,1.1657999541762487e-6 +kkt_pglib_opf_case14_ieee_condensed_10,SPD,118,1282,1027,33,0,0,0,33,0,11,11,0.339417,12,2,0.1670400088187307,0.022559994249604642,front_cholesky_kernel,2,0.422286,24,1,0.13225700240582228,0.010624004062265158,solve_fwd_kernel,0.00017225756315640304 +kkt_pglib_opf_case14_ieee_condensed_10,S,118,1282,1027,33,0,0,0,33,0,11,11,0.425696,12,2,0.25017598090926185,0.03987200034316629,front_ldlt_kernel,1,0.445507,25,1,0.14496200310532004,0.011393000022508204,solve_fwd_kernel,0.00013880687786021974 +kkt_pglib_opf_case14_ieee_condensed_11,SPD,118,1282,1027,33,0,0,0,33,0,11,11,0.327367,12,2,0.16668799798935652,0.022528001863975078,front_cholesky_kernel,2,0.392846,24,1,0.13193600898375735,0.010656003723852336,solve_fwd_kernel,1.5565096136251653e-5 +kkt_pglib_opf_case14_ieee_condensed_11,S,118,1282,1027,33,0,0,0,33,0,11,11,0.370107,12,2,0.2443189951009117,0.034431999665685,front_ldlt_kernel,1,0.445406,25,1,0.14496197400148958,0.011359996278770268,solve_fwd_kernel,1.1319105246087817e-5 +kkt_pglib_opf_case14_ieee_k2_1,S,344,1924,2139,186,39,39,1,147,0,16,16,0.541996,17,2,0.3788810208789073,0.05417600186774507,front_ldlt_kernel,1,0.563405,35,1,0.1965429910342209,0.013056000170763582,solve_fwd_kernel,7.679955110816424e-9 +kkt_pglib_opf_case14_ieee_k2_10,S,344,1924,2154,185,38,38,1,147,0,16,16,0.592724,17,2,0.37580700882244855,0.054080002882983536,front_ldlt_kernel,1,0.574685,35,1,0.1967699863598682,0.013536002370528877,solve_fwd_kernel,2.868427965445951e-6 +kkt_pglib_opf_case14_ieee_k2_15,S,344,1924,3273,85,3,3,1,82,0,17,16,0.845124,18,2,0.6576340019819327,0.12364800204522908,front_ldlt_kernel,1,0.549785,35,1,0.23103800049284473,0.018432001525070518,solve_fwd_kernel,0.3953790651029023 diff --git a/bench/profile/phase_split.md b/bench/profile/phase_split.md new file mode 100644 index 0000000..ed49b9a --- /dev/null +++ b/bench/profile/phase_split.md @@ -0,0 +1,123 @@ +# SDS phase split on CUDA (PERFORMANCE.md, experiment 0) + +Generated by `bench/profile_phases.jl` on NVIDIA GeForce RTX 4080, 2026-10-02. Wall time: best of 5 warm runs at full clock; a sixth run per phase under `CUDA.@profile` gives the kernels. *busy* is the sum of kernel durations; *top* is the longest kernel, its share of *busy* and its number of thread blocks. + +## Schedule + +| matrix | structure | n | nnz(L) | supernodes | A fronts | A subtrees | largest subtree | B fronts | C fronts | launch groups | levels | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| lap2d_300 | SPD | 90000 | 2.47e+06 | 20495 | 19955 | 806 | 262 | 523 | 17 | 46 | 27 | +| lap2d_300 | S | 90000 | 2.47e+06 | 20495 | 19955 | 806 | 262 | 523 | 17 | 46 | 27 | +| lap3d_40 | SPD | 64000 | 1.44e+07 | 11066 | 9851 | 1498 | 27 | 1058 | 157 | 88 | 36 | +| HB/bcsstk17 | SPD | 10974 | 1.04e+06 | 1300 | 992 | 815 | 8 | 290 | 18 | 69 | 34 | +| HB/bcsstk17 | S | 10974 | 1.04e+06 | 1300 | 992 | 815 | 8 | 290 | 18 | 69 | 34 | +| Boeing/bcsstk38 | SPD | 8032 | 8.05e+05 | 604 | 341 | 223 | 7 | 254 | 9 | 59 | 14 | +| Boeing/bcsstk38 | S | 8032 | 8.05e+05 | 604 | 341 | 223 | 7 | 254 | 9 | 59 | 14 | +| GHS_psdef/apache2 | SPD | 715176 | 1.29e+08 | 123689 | 112442 | 15048 | 30 | 10493 | 754 | 105 | 35 | +| kkt_pglib_opf_case118_ieee_condensed_1 | SPD | 1088 | 1.16e+04 | 303 | 40 | 40 | 1 | 263 | 0 | 29 | 23 | +| kkt_pglib_opf_case118_ieee_condensed_1 | S | 1088 | 1.16e+04 | 303 | 40 | 40 | 1 | 263 | 0 | 29 | 23 | +| kkt_pglib_opf_case118_ieee_condensed_10 | SPD | 1088 | 1.16e+04 | 303 | 40 | 40 | 1 | 263 | 0 | 29 | 23 | +| kkt_pglib_opf_case118_ieee_condensed_10 | S | 1088 | 1.16e+04 | 303 | 40 | 40 | 1 | 263 | 0 | 29 | 23 | +| kkt_pglib_opf_case118_ieee_condensed_20 | SPD | 1088 | 1.16e+04 | 303 | 40 | 40 | 1 | 263 | 0 | 29 | 23 | +| kkt_pglib_opf_case118_ieee_condensed_20 | S | 1088 | 1.16e+04 | 303 | 40 | 40 | 1 | 263 | 0 | 29 | 23 | +| kkt_pglib_opf_case118_ieee_k2_1 | S | 3150 | 2.1e+04 | 1917 | 1312 | 480 | 8 | 605 | 0 | 28 | 31 | +| kkt_pglib_opf_case118_ieee_k2_10 | S | 3150 | 2.05e+04 | 1906 | 1302 | 477 | 8 | 604 | 0 | 28 | 31 | +| kkt_pglib_opf_case118_ieee_k2_20 | S | 3150 | 2.05e+04 | 1889 | 1288 | 474 | 8 | 601 | 0 | 28 | 31 | +| kkt_pglib_opf_case1354_pegase_condensed_1 | SPD | 11192 | 1.21e+05 | 3134 | 1719 | 544 | 18 | 1415 | 0 | 58 | 39 | +| kkt_pglib_opf_case1354_pegase_condensed_1 | S | 11192 | 1.21e+05 | 3134 | 1719 | 544 | 18 | 1415 | 0 | 58 | 39 | +| kkt_pglib_opf_case1354_pegase_condensed_10 | SPD | 11192 | 1.21e+05 | 3134 | 1719 | 544 | 18 | 1415 | 0 | 58 | 39 | +| kkt_pglib_opf_case1354_pegase_condensed_10 | S | 11192 | 1.21e+05 | 3134 | 1719 | 544 | 18 | 1415 | 0 | 58 | 39 | +| kkt_pglib_opf_case1354_pegase_condensed_20 | SPD | 11192 | 1.21e+05 | 3134 | 1719 | 544 | 18 | 1415 | 0 | 58 | 39 | +| kkt_pglib_opf_case1354_pegase_condensed_20 | S | 11192 | 1.21e+05 | 3134 | 1719 | 544 | 18 | 1415 | 0 | 58 | 39 | +| kkt_pglib_opf_case1354_pegase_k2_1 | S | 33811 | 2.16e+05 | 19624 | 17466 | 4207 | 43 | 2158 | 0 | 57 | 45 | +| kkt_pglib_opf_case1354_pegase_k2_10 | S | 33811 | 2.2e+05 | 19496 | 17333 | 4178 | 35 | 2163 | 0 | 53 | 40 | +| kkt_pglib_opf_case1354_pegase_k2_20 | S | 33811 | 2.21e+05 | 19600 | 17473 | 4143 | 39 | 2127 | 0 | 53 | 44 | +| kkt_pglib_opf_case14_ieee_condensed_1 | SPD | 118 | 1.03e+03 | 33 | 0 | 0 | 0 | 33 | 0 | 11 | 11 | +| kkt_pglib_opf_case14_ieee_condensed_1 | S | 118 | 1.03e+03 | 33 | 0 | 0 | 0 | 33 | 0 | 11 | 11 | +| kkt_pglib_opf_case14_ieee_condensed_10 | SPD | 118 | 1.03e+03 | 33 | 0 | 0 | 0 | 33 | 0 | 11 | 11 | +| kkt_pglib_opf_case14_ieee_condensed_10 | S | 118 | 1.03e+03 | 33 | 0 | 0 | 0 | 33 | 0 | 11 | 11 | +| kkt_pglib_opf_case14_ieee_condensed_11 | SPD | 118 | 1.03e+03 | 33 | 0 | 0 | 0 | 33 | 0 | 11 | 11 | +| kkt_pglib_opf_case14_ieee_condensed_11 | S | 118 | 1.03e+03 | 33 | 0 | 0 | 0 | 33 | 0 | 11 | 11 | +| kkt_pglib_opf_case14_ieee_k2_1 | S | 344 | 2.14e+03 | 186 | 39 | 39 | 1 | 147 | 0 | 16 | 16 | +| kkt_pglib_opf_case14_ieee_k2_10 | S | 344 | 2.15e+03 | 185 | 38 | 38 | 1 | 147 | 0 | 16 | 16 | +| kkt_pglib_opf_case14_ieee_k2_15 | S | 344 | 3.27e+03 | 85 | 3 | 3 | 1 | 82 | 0 | 17 | 16 | + +## Refactorization + +| matrix | structure | wall ms | kernels | copies | busy ms | top kernel | top ms | top share | top blocks | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| lap2d_300 | SPD | 31.4 | 202 | 36 | 31.3 | `subtree_cholesky_kernel` | 3.08 | 10% | 696 | +| lap2d_300 | S | 221 | 47 | 2 | 221 | `front_ldlt_kernel` | 35.4 | 16% | 2 | +| lap3d_40 | SPD | 224 | 1222 | 320 | 223 | `_extend_add_kernel` | 6.04 | 3% | 2 | +| HB/bcsstk17 | SPD | 27.8 | 243 | 38 | 27.6 | `front_cholesky_kernel` | 1.09 | 4% | 1 | +| HB/bcsstk17 | S | 198 | 70 | 2 | 198 | `front_ldlt_kernel` | 31.5 | 16% | 1 | +| Boeing/bcsstk38 | SPD | 22.7 | 143 | 20 | 22.3 | `front_cholesky_kernel` | 1.07 | 5% | 1 | +| Boeing/bcsstk38 | S | 132 | 60 | 2 | 132 | `front_ldlt_kernel` | 20.8 | 16% | 1 | +| GHS_psdef/apache2 | SPD | 1.03e+03 | 6608 | 1570 | 1.02e+03 | `subtree_cholesky_kernel` | 28.7 | 3% | 3287 | +| kkt_pglib_opf_case118_ieee_condensed_1 | SPD | 0.915 | 30 | 2 | 0.663 | `front_cholesky_kernel` | 0.0606 | 9% | 1 | +| kkt_pglib_opf_case118_ieee_condensed_1 | S | 1.51 | 30 | 2 | 1.3 | `front_ldlt_kernel` | 0.186 | 14% | 1 | +| kkt_pglib_opf_case118_ieee_condensed_10 | SPD | 0.881 | 30 | 2 | 0.648 | `front_cholesky_kernel` | 0.0608 | 9% | 1 | +| kkt_pglib_opf_case118_ieee_condensed_10 | S | 1.47 | 30 | 2 | 1.66 | `front_ldlt_kernel` | 0.442 | 27% | 1 | +| kkt_pglib_opf_case118_ieee_condensed_20 | SPD | 0.876 | 30 | 2 | 0.649 | `front_cholesky_kernel` | 0.0606 | 9% | 1 | +| kkt_pglib_opf_case118_ieee_condensed_20 | S | 1.57 | 30 | 2 | 1.37 | `front_ldlt_kernel` | 0.198 | 14% | 1 | +| kkt_pglib_opf_case118_ieee_k2_1 | S | 1.45 | 29 | 2 | 1.23 | `front_ldlt_kernel` | 0.115 | 9% | 1 | +| kkt_pglib_opf_case118_ieee_k2_10 | S | 1.34 | 29 | 2 | 1.15 | `front_ldlt_kernel` | 0.103 | 9% | 1 | +| kkt_pglib_opf_case118_ieee_k2_20 | S | 1.34 | 29 | 2 | 1.15 | `front_ldlt_kernel` | 0.108 | 9% | 1 | +| kkt_pglib_opf_case1354_pegase_condensed_1 | SPD | 2.93 | 59 | 2 | 2.69 | `front_cholesky_kernel` | 0.306 | 11% | 1 | +| kkt_pglib_opf_case1354_pegase_condensed_1 | S | 9.66 | 59 | 2 | 9.86 | `front_ldlt_kernel` | 1.75 | 18% | 1 | +| kkt_pglib_opf_case1354_pegase_condensed_10 | SPD | 2.92 | 59 | 2 | 2.66 | `front_cholesky_kernel` | 0.306 | 12% | 1 | +| kkt_pglib_opf_case1354_pegase_condensed_10 | S | 9.68 | 59 | 2 | 9.45 | `front_ldlt_kernel` | 0.959 | 10% | 1 | +| kkt_pglib_opf_case1354_pegase_condensed_20 | SPD | 2.92 | 59 | 2 | 2.63 | `front_cholesky_kernel` | 0.306 | 12% | 1 | +| kkt_pglib_opf_case1354_pegase_condensed_20 | S | 9.8 | 59 | 2 | 9.55 | `front_ldlt_kernel` | 1 | 11% | 1 | +| kkt_pglib_opf_case1354_pegase_k2_1 | S | 7.18 | 58 | 2 | 7.41 | `front_ldlt_kernel` | 0.718 | 10% | 1 | +| kkt_pglib_opf_case1354_pegase_k2_10 | S | 6.14 | 54 | 2 | 5.91 | `front_ldlt_kernel` | 0.474 | 8% | 1 | +| kkt_pglib_opf_case1354_pegase_k2_20 | S | 7.98 | 54 | 2 | 7.73 | `front_ldlt_kernel` | 0.865 | 11% | 1 | +| kkt_pglib_opf_case14_ieee_condensed_1 | SPD | 0.364 | 12 | 2 | 0.173 | `front_cholesky_kernel` | 0.0248 | 14% | 12 | +| kkt_pglib_opf_case14_ieee_condensed_1 | S | 0.354 | 12 | 2 | 0.244 | `front_ldlt_kernel` | 0.0334 | 14% | 1 | +| kkt_pglib_opf_case14_ieee_condensed_10 | SPD | 0.339 | 12 | 2 | 0.167 | `front_cholesky_kernel` | 0.0226 | 14% | 2 | +| kkt_pglib_opf_case14_ieee_condensed_10 | S | 0.426 | 12 | 2 | 0.25 | `front_ldlt_kernel` | 0.0399 | 16% | 1 | +| kkt_pglib_opf_case14_ieee_condensed_11 | SPD | 0.327 | 12 | 2 | 0.167 | `front_cholesky_kernel` | 0.0225 | 14% | 2 | +| kkt_pglib_opf_case14_ieee_condensed_11 | S | 0.37 | 12 | 2 | 0.244 | `front_ldlt_kernel` | 0.0344 | 14% | 1 | +| kkt_pglib_opf_case14_ieee_k2_1 | S | 0.542 | 17 | 2 | 0.379 | `front_ldlt_kernel` | 0.0542 | 14% | 1 | +| kkt_pglib_opf_case14_ieee_k2_10 | S | 0.593 | 17 | 2 | 0.376 | `front_ldlt_kernel` | 0.0541 | 14% | 1 | +| kkt_pglib_opf_case14_ieee_k2_15 | S | 0.845 | 18 | 2 | 0.658 | `front_ldlt_kernel` | 0.124 | 19% | 1 | + +## Solve + +| matrix | structure | wall ms | kernels | copies | busy ms | top kernel | top ms | top share | top blocks | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| lap2d_300 | SPD | 3.29 | 163 | 1 | 2.91 | `solve_fwd_kernel` | 0.489 | 17% | 806 | +| lap2d_300 | S | 3.67 | 198 | 1 | 3.19 | `solve_fwd_kernel` | 0.6 | 19% | 806 | +| lap3d_40 | SPD | 16.8 | 1429 | 1 | 9.25 | `trsm_lt_kernel` | 0.356 | 4% | 50 | +| HB/bcsstk17 | SPD | 3.49 | 191 | 1 | 3.02 | `solve_fwd_kernel` | 0.0687 | 2% | 2 | +| HB/bcsstk17 | S | 3.64 | 228 | 1 | 3.17 | `solve_fwd_kernel` | 0.0704 | 2% | 2 | +| Boeing/bcsstk38 | SPD | 1.88 | 96 | 1 | 1.54 | `solve_fwd_kernel` | 0.0762 | 5% | 2 | +| Boeing/bcsstk38 | S | 1.95 | 115 | 1 | 1.6 | `solve_fwd_kernel` | 0.0777 | 5% | 2 | +| GHS_psdef/apache2 | SPD | 80.5 | 6631 | 1 | 55.7 | `solve_bwd_kernel` | 1 | 2% | 15048 | +| kkt_pglib_opf_case118_ieee_condensed_1 | SPD | 0.726 | 48 | 1 | 0.384 | `solve_fwd_kernel` | 0.021 | 5% | 1 | +| kkt_pglib_opf_case118_ieee_condensed_1 | S | 0.77 | 49 | 1 | 0.412 | `solve_fwd_kernel` | 0.0225 | 5% | 1 | +| kkt_pglib_opf_case118_ieee_condensed_10 | SPD | 0.724 | 48 | 1 | 0.384 | `solve_fwd_kernel` | 0.0211 | 5% | 1 | +| kkt_pglib_opf_case118_ieee_condensed_10 | S | 0.808 | 49 | 1 | 0.411 | `solve_fwd_kernel` | 0.0223 | 5% | 1 | +| kkt_pglib_opf_case118_ieee_condensed_20 | SPD | 0.743 | 48 | 1 | 0.383 | `solve_fwd_kernel` | 0.0211 | 5% | 1 | +| kkt_pglib_opf_case118_ieee_condensed_20 | S | 0.763 | 49 | 1 | 0.411 | `solve_fwd_kernel` | 0.0221 | 5% | 1 | +| kkt_pglib_opf_case118_ieee_k2_1 | S | 0.883 | 59 | 1 | 0.455 | `solve_fwd_kernel` | 0.023 | 5% | 1 | +| kkt_pglib_opf_case118_ieee_k2_10 | S | 0.9 | 59 | 1 | 0.456 | `solve_fwd_kernel` | 0.0215 | 5% | 1 | +| kkt_pglib_opf_case118_ieee_k2_20 | S | 0.886 | 59 | 1 | 0.454 | `solve_fwd_kernel` | 0.0208 | 5% | 1 | +| kkt_pglib_opf_case1354_pegase_condensed_1 | SPD | 1.12 | 62 | 1 | 0.901 | `solve_fwd_kernel` | 0.044 | 5% | 1 | +| kkt_pglib_opf_case1354_pegase_condensed_1 | S | 1.24 | 63 | 1 | 0.955 | `solve_fwd_kernel` | 0.046 | 5% | 1 | +| kkt_pglib_opf_case1354_pegase_condensed_10 | SPD | 1.21 | 62 | 1 | 0.9 | `solve_fwd_kernel` | 0.044 | 5% | 1 | +| kkt_pglib_opf_case1354_pegase_condensed_10 | S | 1.21 | 63 | 1 | 0.954 | `solve_fwd_kernel` | 0.046 | 5% | 1 | +| kkt_pglib_opf_case1354_pegase_condensed_20 | SPD | 1.14 | 62 | 1 | 0.9 | `solve_fwd_kernel` | 0.0438 | 5% | 1 | +| kkt_pglib_opf_case1354_pegase_condensed_20 | S | 1.25 | 63 | 1 | 0.954 | `solve_fwd_kernel` | 0.0459 | 5% | 1 | +| kkt_pglib_opf_case1354_pegase_k2_1 | S | 1.45 | 85 | 1 | 1.09 | `solve_fwd_kernel` | 0.114 | 10% | 4207 | +| kkt_pglib_opf_case1354_pegase_k2_10 | S | 1.31 | 73 | 1 | 0.98 | `solve_fwd_kernel` | 0.0995 | 10% | 4178 | +| kkt_pglib_opf_case1354_pegase_k2_20 | S | 1.38 | 79 | 1 | 1.05 | `solve_fwd_kernel` | 0.103 | 10% | 4143 | +| kkt_pglib_opf_case14_ieee_condensed_1 | SPD | 0.418 | 24 | 1 | 0.131 | `solve_fwd_kernel` | 0.0104 | 8% | 1 | +| kkt_pglib_opf_case14_ieee_condensed_1 | S | 0.445 | 25 | 1 | 0.146 | `solve_fwd_kernel` | 0.0115 | 8% | 1 | +| kkt_pglib_opf_case14_ieee_condensed_10 | SPD | 0.422 | 24 | 1 | 0.132 | `solve_fwd_kernel` | 0.0106 | 8% | 1 | +| kkt_pglib_opf_case14_ieee_condensed_10 | S | 0.446 | 25 | 1 | 0.145 | `solve_fwd_kernel` | 0.0114 | 8% | 1 | +| kkt_pglib_opf_case14_ieee_condensed_11 | SPD | 0.393 | 24 | 1 | 0.132 | `solve_fwd_kernel` | 0.0107 | 8% | 1 | +| kkt_pglib_opf_case14_ieee_condensed_11 | S | 0.445 | 25 | 1 | 0.145 | `solve_fwd_kernel` | 0.0114 | 8% | 1 | +| kkt_pglib_opf_case14_ieee_k2_1 | S | 0.563 | 35 | 1 | 0.197 | `solve_fwd_kernel` | 0.0131 | 7% | 1 | +| kkt_pglib_opf_case14_ieee_k2_10 | S | 0.575 | 35 | 1 | 0.197 | `solve_fwd_kernel` | 0.0135 | 7% | 1 | +| kkt_pglib_opf_case14_ieee_k2_15 | S | 0.55 | 35 | 1 | 0.231 | `solve_fwd_kernel` | 0.0184 | 8% | 1 | diff --git a/bench/profile/phase_split_main_9d280d0.csv b/bench/profile/phase_split_main_9d280d0.csv new file mode 100644 index 0000000..72e567e --- /dev/null +++ b/bench/profile/phase_split_main_9d280d0.csv @@ -0,0 +1,36 @@ +matrix,structure,n,nnz,lnnz,nsuper,a_fronts,subtrees,largest_subtree,b_fronts,c_fronts,groups,nlevels,refac_wall_ms,refac_kernels,refac_copies,refac_busy_ms,refac_top_ms,refac_top_name,refac_top_blocks,solve_wall_ms,solve_kernels,solve_copies,solve_busy_ms,solve_top_ms,solve_top_name,relres +lap2d_300,SPD,90000,448800,2465905,20495,20248,304,541,230,17,39,27,40.938102,197,36,40.68908906629076,5.427025003882591,subtree_cholesky_kernel,126,4.656793,161,1,3.6051619827048853,0.8780499993008561,solve_fwd_kernel,1.7764847090947624e-12 +lap2d_300,S,90000,448800,2465905,20495,20248,304,541,230,17,39,27,238.803117,40,2,239.46214899478946,35.26122299808776,front_ldlt_kernel,1,4.664464,196,1,3.650341066531837,0.9709130026749335,solve_fwd_kernel,1.6830630388247175e-12 +lap3d_40,SPD,64000,438400,14387160,11066,9851,1498,27,1058,157,88,36,223.146783,1222,320,220.79544007283403,6.022865003615152,_extend_add_kernel,2,19.458185,1429,1,8.375450895982794,0.3541449987096712,trsm_lt_kernel,7.473313198575137e-14 +HB/bcsstk17,SPD,10974,428650,1043601,1300,1113,772,10,169,18,62,34,30.264521,236,38,29.00085204601055,1.472068004659377,subtree_cholesky_kernel,50,3.083579,189,1,2.499338035704568,0.06672000017715618,trsm_lt_kernel,3.971715314690285e-11 +HB/bcsstk17,S,10974,428650,1043601,1300,1113,772,10,169,18,62,34,197.62484,63,2,196.50214802095434,30.96597500552889,front_ldlt_kernel,1,3.574976,226,1,2.604549932584632,0.06966399814700708,solve_bwd_kernel,3.685735638327279e-11 +Boeing/bcsstk38,SPD,8032,355460,804613,604,452,207,10,143,9,50,14,23.333882,134,20,22.969184043176938,1.506052001786884,subtree_cholesky_kernel,26,1.855436,94,1,1.2522610413725488,0.06448000203818083,solve_bwd_kernel,1.0509838534963984e-10 +Boeing/bcsstk38,S,8032,355460,804613,604,452,207,10,143,9,50,14,128.317469,51,2,128.1734189542476,20.884090998151805,front_ldlt_kernel,1,2.476182,113,1,1.3014489595661871,0.06873599340906367,solve_fwd_kernel,1.2669274682594579e-10 +GHS_psdef/apache2,SPD,715176,4817870,129200941,123689,112442,15048,30,10493,754,105,35,1025.153138,6608,1570,1017.8589681090671,28.93130799930077,subtree_cholesky_kernel,3287,94.037878,6631,1,55.418416050088126,0.9681320007075556,solve_bwd_kernel,1.58294025958631e-10 +kkt_pglib_opf_case118_ieee_condensed_1,SPD,1088,12860,11634,303,303,1,303,0,0,1,23,3.67788,2,2,3.5011350046261214,3.498799000226427,subtree_cholesky_kernel,1,1.733865,4,1,1.5914630057523027,0.7962600066093728,solve_fwd_kernel,0.0001499152129335686 +kkt_pglib_opf_case118_ieee_condensed_1,S,1088,12860,11634,303,303,1,303,0,0,1,23,4.844423,2,2,4.702741003711708,4.69922100455733,subtree_ldlt_kernel,1,1.965725,5,1,1.8418639883748256,0.930755995796062,solve_fwd_kernel,6.969655897665449e-5 +kkt_pglib_opf_case118_ieee_condensed_10,SPD,1088,12860,11634,303,303,1,303,0,0,1,23,3.41398,2,2,3.4857429927797057,3.4833749959943816,subtree_cholesky_kernel,1,1.855136,4,1,1.5913980096229352,0.7962910021888092,solve_fwd_kernel,1.0007128179490731e-5 +kkt_pglib_opf_case118_ieee_condensed_10,S,1088,12860,11634,303,303,1,303,0,0,1,23,4.690519,2,2,4.543540002487134,4.540148001979105,subtree_ldlt_kernel,1,1.964487,5,1,1.842023993958719,0.9307239961344749,solve_fwd_kernel,9.740282741453158e-6 +kkt_pglib_opf_case118_ieee_condensed_20,SPD,1088,12860,11634,303,303,1,303,0,0,1,23,3.41129,2,2,3.2494539918843657,3.247117994760629,subtree_cholesky_kernel,1,1.708695,4,1,1.5917830023681745,0.7964839969645254,solve_fwd_kernel,0.0977012881293089 +kkt_pglib_opf_case118_ieee_condensed_20,S,1088,12860,11634,303,303,1,303,0,0,1,23,4.834262,2,2,4.689269000664353,4.685749001509976,subtree_ldlt_kernel,1,1.961965,5,1,1.842023993958719,0.9307560030720197,solve_fwd_kernel,0.07793477586360127 +kkt_pglib_opf_case118_ieee_k2_1,S,3150,17714,21032,1917,1917,1,1917,0,0,1,31,13.11925,2,2,12.973722004971933,12.966426002094522,subtree_ldlt_kernel,1,6.958695,5,1,6.728797990945168,3.3799830052885227,solve_bwd_kernel,0.23695532264533115 +kkt_pglib_opf_case118_ieee_k2_10,S,3150,17714,20542,1906,1906,1,1906,0,0,1,31,12.581965,2,2,12.612952006747946,12.605624004208948,subtree_ldlt_kernel,1,6.981328,5,1,7.264960986503866,3.9136809937190264,solve_fwd_kernel,0.01060874507064105 +kkt_pglib_opf_case118_ieee_k2_20,S,3150,17714,20507,1889,1889,1,1889,0,0,1,31,12.939176,2,2,12.75285700103268,12.745721003739163,subtree_ldlt_kernel,1,6.805352,5,1,6.65839798602974,3.327950995299034,solve_bwd_kernel,0.027042646838526467 +kkt_pglib_opf_case1354_pegase_condensed_1,SPD,11192,136724,120598,3134,3134,1,3134,0,0,1,39,38.511127,2,2,37.79882600065321,37.78900200268254,subtree_cholesky_kernel,1,16.640785,4,1,16.256424998573493,8.1917169954977,solve_fwd_kernel,0.00028169146220954487 +kkt_pglib_opf_case1354_pegase_condensed_1,S,11192,136724,120598,3134,3134,1,3134,0,0,1,39,56.734447,2,2,55.60293800954241,55.59359400649555,subtree_ldlt_kernel,1,19.398913,5,1,19.053269999858458,9.550283000862692,solve_fwd_kernel,0.00032169280786670235 +kkt_pglib_opf_case1354_pegase_condensed_10,SPD,11192,136724,120598,3134,3134,1,3134,0,0,1,39,36.573532,2,2,36.32653100794414,36.3164830050664,subtree_cholesky_kernel,1,16.459733,4,1,16.252361005172133,8.189988999220077,solve_fwd_kernel,0.00014028077734730922 +kkt_pglib_opf_case1354_pegase_condensed_10,S,11192,136724,120598,3134,3134,1,3134,0,0,1,39,54.508839,2,2,55.786108001484536,55.77676399843767,subtree_ldlt_kernel,1,19.592323,5,1,21.014174999436364,10.93729800049914,solve_fwd_kernel,9.534327884384974e-5 +kkt_pglib_opf_case1354_pegase_condensed_20,SPD,11192,136724,120598,3134,3134,1,3134,0,0,1,39,37.785906,2,2,36.31881900219014,36.30880299897399,subtree_cholesky_kernel,1,16.41682,4,1,16.25335499556968,8.191397995688021,solve_fwd_kernel,7.407112355532926e-5 +kkt_pglib_opf_case1354_pegase_condensed_20,S,11192,136724,120598,3134,3134,1,3134,0,0,1,39,55.567023,2,2,56.2434530002065,56.234140996821225,subtree_ldlt_kernel,1,19.345324,5,1,18.799060992023442,9.550442999170627,solve_fwd_kernel,4.9109638733395656e-5 +kkt_pglib_opf_case1354_pegase_k2_1,S,33811,188063,215953,19624,19624,1,19624,0,0,1,45,146.229977,2,2,146.57016799174016,146.5252709967899,subtree_ldlt_kernel,1,77.197792,5,1,73.74653799342923,39.22814799443586,solve_fwd_kernel,14.214742644178667 +kkt_pglib_opf_case1354_pegase_k2_10,S,33811,188063,220146,19496,19496,1,19496,0,0,1,40,140.622228,2,2,141.79128799878526,141.74376799928723,subtree_ldlt_kernel,1,75.377886,5,1,70.34442399890395,35.341779999725986,solve_fwd_kernel,51.66970951161263 +kkt_pglib_opf_case1354_pegase_k2_20,S,33811,188063,221292,19600,19600,1,19600,0,0,1,44,148.964114,2,2,143.31307399697835,143.26920199528104,subtree_ldlt_kernel,1,72.436652,5,1,70.32032799907029,35.37141199922189,solve_fwd_kernel,15.32248012620186 +kkt_pglib_opf_case14_ieee_condensed_1,SPD,118,1282,1027,33,33,1,33,0,0,1,11,0.566292,2,2,0.32124800054589286,0.31974400189938024,subtree_cholesky_kernel,1,0.303951,4,1,0.1733129975036718,0.08636800339445472,solve_fwd_kernel,1.6538473403875516e-6 +kkt_pglib_opf_case14_ieee_condensed_1,S,118,1282,1027,33,33,1,33,0,0,1,11,0.576646,2,2,0.43811299838125706,0.4352329997345805,subtree_ldlt_kernel,1,0.293941,5,1,0.20172700169496238,0.10102400119649246,solve_fwd_kernel,8.086607326073917e-7 +kkt_pglib_opf_case14_ieee_condensed_10,SPD,118,1282,1027,33,33,1,33,0,0,1,11,0.462566,2,2,0.2972799993585795,0.2957760007120669,subtree_cholesky_kernel,1,0.357721,4,1,0.17337598546873778,0.08643199544167146,solve_fwd_kernel,0.00015711648509796294 +kkt_pglib_opf_case14_ieee_condensed_10,S,118,1282,1027,33,33,1,33,0,0,1,11,0.613752,2,2,0.43478400039020926,0.4319040017435327,subtree_ldlt_kernel,1,0.380851,5,1,0.20185699395369738,0.10112099698744714,solve_fwd_kernel,0.0001562445067991457 +kkt_pglib_opf_case14_ieee_condensed_11,SPD,118,1282,1027,33,33,1,33,0,0,1,11,0.482642,2,2,0.29702499887207523,0.29555200308095664,subtree_cholesky_kernel,1,0.291901,4,1,0.17337600729661062,0.08649600204080343,solve_fwd_kernel,1.670170208071547e-5 +kkt_pglib_opf_case14_ieee_condensed_11,S,118,1282,1027,33,33,1,33,0,0,1,11,0.609402,2,2,0.4289290009182878,0.42604900227161124,subtree_ldlt_kernel,1,0.31889,5,1,0.2016970029217191,0.10108800051966682,solve_fwd_kernel,5.097826580562365e-6 +kkt_pglib_opf_case14_ieee_k2_1,S,344,1924,2139,186,186,1,186,0,0,1,16,1.440204,2,2,1.3344010003493167,1.3313289964571595,subtree_ldlt_kernel,1,0.826443,5,1,0.7005440056673251,0.3494080010568723,solve_fwd_kernel,1.0697170401067997e-8 +kkt_pglib_opf_case14_ieee_k2_10,S,344,1924,2154,185,185,1,185,0,0,1,16,1.492795,2,2,1.3532800076063722,1.3501440043910407,subtree_ldlt_kernel,1,0.956303,5,1,0.6999690012889914,0.3488319998723455,solve_fwd_kernel,2.7456609715314606e-5 +kkt_pglib_opf_case14_ieee_k2_15,S,344,1924,3273,85,85,1,85,0,0,1,16,1.6414,2,2,1.518080993264448,1.5150089966482483,subtree_ldlt_kernel,1,0.715502,5,1,0.5655999921145849,0.28262399428058416,solve_fwd_kernel,0.3235038258289765 diff --git a/bench/profile/phase_split_main_9d280d0.md b/bench/profile/phase_split_main_9d280d0.md new file mode 100644 index 0000000..6ea43c0 --- /dev/null +++ b/bench/profile/phase_split_main_9d280d0.md @@ -0,0 +1,123 @@ +# SDS phase split on CUDA before the regime-A split (main at 9d280d0; PERFORMANCE.md, experiment 0) + +Generated by `bench/profile_phases.jl` on NVIDIA GeForce RTX 4080, 2026-10-02. One warm run per phase under `CUDA.@profile`, wall time from a single warm run without clock warm-up (the script then had no `spin_device`; small cases read up to ~2× high, the single-block KKT kernels of tens of ms are not affected). *busy* is the sum of kernel durations; *top* is the longest kernel, its share of *busy* and its number of thread blocks. + +## Schedule + +| matrix | structure | n | nnz(L) | supernodes | A fronts | A subtrees | largest subtree | B fronts | C fronts | launch groups | levels | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| lap2d_300 | SPD | 90000 | 2.47e+06 | 20495 | 20248 | 304 | 541 | 230 | 17 | 39 | 27 | +| lap2d_300 | S | 90000 | 2.47e+06 | 20495 | 20248 | 304 | 541 | 230 | 17 | 39 | 27 | +| lap3d_40 | SPD | 64000 | 1.44e+07 | 11066 | 9851 | 1498 | 27 | 1058 | 157 | 88 | 36 | +| HB/bcsstk17 | SPD | 10974 | 1.04e+06 | 1300 | 1113 | 772 | 10 | 169 | 18 | 62 | 34 | +| HB/bcsstk17 | S | 10974 | 1.04e+06 | 1300 | 1113 | 772 | 10 | 169 | 18 | 62 | 34 | +| Boeing/bcsstk38 | SPD | 8032 | 8.05e+05 | 604 | 452 | 207 | 10 | 143 | 9 | 50 | 14 | +| Boeing/bcsstk38 | S | 8032 | 8.05e+05 | 604 | 452 | 207 | 10 | 143 | 9 | 50 | 14 | +| GHS_psdef/apache2 | SPD | 715176 | 1.29e+08 | 123689 | 112442 | 15048 | 30 | 10493 | 754 | 105 | 35 | +| kkt_pglib_opf_case118_ieee_condensed_1 | SPD | 1088 | 1.16e+04 | 303 | 303 | 1 | 303 | 0 | 0 | 1 | 23 | +| kkt_pglib_opf_case118_ieee_condensed_1 | S | 1088 | 1.16e+04 | 303 | 303 | 1 | 303 | 0 | 0 | 1 | 23 | +| kkt_pglib_opf_case118_ieee_condensed_10 | SPD | 1088 | 1.16e+04 | 303 | 303 | 1 | 303 | 0 | 0 | 1 | 23 | +| kkt_pglib_opf_case118_ieee_condensed_10 | S | 1088 | 1.16e+04 | 303 | 303 | 1 | 303 | 0 | 0 | 1 | 23 | +| kkt_pglib_opf_case118_ieee_condensed_20 | SPD | 1088 | 1.16e+04 | 303 | 303 | 1 | 303 | 0 | 0 | 1 | 23 | +| kkt_pglib_opf_case118_ieee_condensed_20 | S | 1088 | 1.16e+04 | 303 | 303 | 1 | 303 | 0 | 0 | 1 | 23 | +| kkt_pglib_opf_case118_ieee_k2_1 | S | 3150 | 2.1e+04 | 1917 | 1917 | 1 | 1917 | 0 | 0 | 1 | 31 | +| kkt_pglib_opf_case118_ieee_k2_10 | S | 3150 | 2.05e+04 | 1906 | 1906 | 1 | 1906 | 0 | 0 | 1 | 31 | +| kkt_pglib_opf_case118_ieee_k2_20 | S | 3150 | 2.05e+04 | 1889 | 1889 | 1 | 1889 | 0 | 0 | 1 | 31 | +| kkt_pglib_opf_case1354_pegase_condensed_1 | SPD | 11192 | 1.21e+05 | 3134 | 3134 | 1 | 3134 | 0 | 0 | 1 | 39 | +| kkt_pglib_opf_case1354_pegase_condensed_1 | S | 11192 | 1.21e+05 | 3134 | 3134 | 1 | 3134 | 0 | 0 | 1 | 39 | +| kkt_pglib_opf_case1354_pegase_condensed_10 | SPD | 11192 | 1.21e+05 | 3134 | 3134 | 1 | 3134 | 0 | 0 | 1 | 39 | +| kkt_pglib_opf_case1354_pegase_condensed_10 | S | 11192 | 1.21e+05 | 3134 | 3134 | 1 | 3134 | 0 | 0 | 1 | 39 | +| kkt_pglib_opf_case1354_pegase_condensed_20 | SPD | 11192 | 1.21e+05 | 3134 | 3134 | 1 | 3134 | 0 | 0 | 1 | 39 | +| kkt_pglib_opf_case1354_pegase_condensed_20 | S | 11192 | 1.21e+05 | 3134 | 3134 | 1 | 3134 | 0 | 0 | 1 | 39 | +| kkt_pglib_opf_case1354_pegase_k2_1 | S | 33811 | 2.16e+05 | 19624 | 19624 | 1 | 19624 | 0 | 0 | 1 | 45 | +| kkt_pglib_opf_case1354_pegase_k2_10 | S | 33811 | 2.2e+05 | 19496 | 19496 | 1 | 19496 | 0 | 0 | 1 | 40 | +| kkt_pglib_opf_case1354_pegase_k2_20 | S | 33811 | 2.21e+05 | 19600 | 19600 | 1 | 19600 | 0 | 0 | 1 | 44 | +| kkt_pglib_opf_case14_ieee_condensed_1 | SPD | 118 | 1.03e+03 | 33 | 33 | 1 | 33 | 0 | 0 | 1 | 11 | +| kkt_pglib_opf_case14_ieee_condensed_1 | S | 118 | 1.03e+03 | 33 | 33 | 1 | 33 | 0 | 0 | 1 | 11 | +| kkt_pglib_opf_case14_ieee_condensed_10 | SPD | 118 | 1.03e+03 | 33 | 33 | 1 | 33 | 0 | 0 | 1 | 11 | +| kkt_pglib_opf_case14_ieee_condensed_10 | S | 118 | 1.03e+03 | 33 | 33 | 1 | 33 | 0 | 0 | 1 | 11 | +| kkt_pglib_opf_case14_ieee_condensed_11 | SPD | 118 | 1.03e+03 | 33 | 33 | 1 | 33 | 0 | 0 | 1 | 11 | +| kkt_pglib_opf_case14_ieee_condensed_11 | S | 118 | 1.03e+03 | 33 | 33 | 1 | 33 | 0 | 0 | 1 | 11 | +| kkt_pglib_opf_case14_ieee_k2_1 | S | 344 | 2.14e+03 | 186 | 186 | 1 | 186 | 0 | 0 | 1 | 16 | +| kkt_pglib_opf_case14_ieee_k2_10 | S | 344 | 2.15e+03 | 185 | 185 | 1 | 185 | 0 | 0 | 1 | 16 | +| kkt_pglib_opf_case14_ieee_k2_15 | S | 344 | 3.27e+03 | 85 | 85 | 1 | 85 | 0 | 0 | 1 | 16 | + +## Refactorization + +| matrix | structure | wall ms | kernels | copies | busy ms | top kernel | top ms | top share | top blocks | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| lap2d_300 | SPD | 40.9 | 197 | 36 | 40.7 | `subtree_cholesky_kernel` | 5.43 | 13% | 126 | +| lap2d_300 | S | 239 | 40 | 2 | 239 | `front_ldlt_kernel` | 35.3 | 15% | 1 | +| lap3d_40 | SPD | 223 | 1222 | 320 | 221 | `_extend_add_kernel` | 6.02 | 3% | 2 | +| HB/bcsstk17 | SPD | 30.3 | 236 | 38 | 29 | `subtree_cholesky_kernel` | 1.47 | 5% | 50 | +| HB/bcsstk17 | S | 198 | 63 | 2 | 197 | `front_ldlt_kernel` | 31 | 16% | 1 | +| Boeing/bcsstk38 | SPD | 23.3 | 134 | 20 | 23 | `subtree_cholesky_kernel` | 1.51 | 7% | 26 | +| Boeing/bcsstk38 | S | 128 | 51 | 2 | 128 | `front_ldlt_kernel` | 20.9 | 16% | 1 | +| GHS_psdef/apache2 | SPD | 1.03e+03 | 6608 | 1570 | 1.02e+03 | `subtree_cholesky_kernel` | 28.9 | 3% | 3287 | +| kkt_pglib_opf_case118_ieee_condensed_1 | SPD | 3.68 | 2 | 2 | 3.5 | `subtree_cholesky_kernel` | 3.5 | 100% | 1 | +| kkt_pglib_opf_case118_ieee_condensed_1 | S | 4.84 | 2 | 2 | 4.7 | `subtree_ldlt_kernel` | 4.7 | 100% | 1 | +| kkt_pglib_opf_case118_ieee_condensed_10 | SPD | 3.41 | 2 | 2 | 3.49 | `subtree_cholesky_kernel` | 3.48 | 100% | 1 | +| kkt_pglib_opf_case118_ieee_condensed_10 | S | 4.69 | 2 | 2 | 4.54 | `subtree_ldlt_kernel` | 4.54 | 100% | 1 | +| kkt_pglib_opf_case118_ieee_condensed_20 | SPD | 3.41 | 2 | 2 | 3.25 | `subtree_cholesky_kernel` | 3.25 | 100% | 1 | +| kkt_pglib_opf_case118_ieee_condensed_20 | S | 4.83 | 2 | 2 | 4.69 | `subtree_ldlt_kernel` | 4.69 | 100% | 1 | +| kkt_pglib_opf_case118_ieee_k2_1 | S | 13.1 | 2 | 2 | 13 | `subtree_ldlt_kernel` | 13 | 100% | 1 | +| kkt_pglib_opf_case118_ieee_k2_10 | S | 12.6 | 2 | 2 | 12.6 | `subtree_ldlt_kernel` | 12.6 | 100% | 1 | +| kkt_pglib_opf_case118_ieee_k2_20 | S | 12.9 | 2 | 2 | 12.8 | `subtree_ldlt_kernel` | 12.7 | 100% | 1 | +| kkt_pglib_opf_case1354_pegase_condensed_1 | SPD | 38.5 | 2 | 2 | 37.8 | `subtree_cholesky_kernel` | 37.8 | 100% | 1 | +| kkt_pglib_opf_case1354_pegase_condensed_1 | S | 56.7 | 2 | 2 | 55.6 | `subtree_ldlt_kernel` | 55.6 | 100% | 1 | +| kkt_pglib_opf_case1354_pegase_condensed_10 | SPD | 36.6 | 2 | 2 | 36.3 | `subtree_cholesky_kernel` | 36.3 | 100% | 1 | +| kkt_pglib_opf_case1354_pegase_condensed_10 | S | 54.5 | 2 | 2 | 55.8 | `subtree_ldlt_kernel` | 55.8 | 100% | 1 | +| kkt_pglib_opf_case1354_pegase_condensed_20 | SPD | 37.8 | 2 | 2 | 36.3 | `subtree_cholesky_kernel` | 36.3 | 100% | 1 | +| kkt_pglib_opf_case1354_pegase_condensed_20 | S | 55.6 | 2 | 2 | 56.2 | `subtree_ldlt_kernel` | 56.2 | 100% | 1 | +| kkt_pglib_opf_case1354_pegase_k2_1 | S | 146 | 2 | 2 | 147 | `subtree_ldlt_kernel` | 147 | 100% | 1 | +| kkt_pglib_opf_case1354_pegase_k2_10 | S | 141 | 2 | 2 | 142 | `subtree_ldlt_kernel` | 142 | 100% | 1 | +| kkt_pglib_opf_case1354_pegase_k2_20 | S | 149 | 2 | 2 | 143 | `subtree_ldlt_kernel` | 143 | 100% | 1 | +| kkt_pglib_opf_case14_ieee_condensed_1 | SPD | 0.566 | 2 | 2 | 0.321 | `subtree_cholesky_kernel` | 0.32 | 100% | 1 | +| kkt_pglib_opf_case14_ieee_condensed_1 | S | 0.577 | 2 | 2 | 0.438 | `subtree_ldlt_kernel` | 0.435 | 99% | 1 | +| kkt_pglib_opf_case14_ieee_condensed_10 | SPD | 0.463 | 2 | 2 | 0.297 | `subtree_cholesky_kernel` | 0.296 | 99% | 1 | +| kkt_pglib_opf_case14_ieee_condensed_10 | S | 0.614 | 2 | 2 | 0.435 | `subtree_ldlt_kernel` | 0.432 | 99% | 1 | +| kkt_pglib_opf_case14_ieee_condensed_11 | SPD | 0.483 | 2 | 2 | 0.297 | `subtree_cholesky_kernel` | 0.296 | 100% | 1 | +| kkt_pglib_opf_case14_ieee_condensed_11 | S | 0.609 | 2 | 2 | 0.429 | `subtree_ldlt_kernel` | 0.426 | 99% | 1 | +| kkt_pglib_opf_case14_ieee_k2_1 | S | 1.44 | 2 | 2 | 1.33 | `subtree_ldlt_kernel` | 1.33 | 100% | 1 | +| kkt_pglib_opf_case14_ieee_k2_10 | S | 1.49 | 2 | 2 | 1.35 | `subtree_ldlt_kernel` | 1.35 | 100% | 1 | +| kkt_pglib_opf_case14_ieee_k2_15 | S | 1.64 | 2 | 2 | 1.52 | `subtree_ldlt_kernel` | 1.52 | 100% | 1 | + +## Solve + +| matrix | structure | wall ms | kernels | copies | busy ms | top kernel | top ms | top share | top blocks | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| lap2d_300 | SPD | 4.66 | 161 | 1 | 3.61 | `solve_fwd_kernel` | 0.878 | 24% | 304 | +| lap2d_300 | S | 4.66 | 196 | 1 | 3.65 | `solve_fwd_kernel` | 0.971 | 27% | 304 | +| lap3d_40 | SPD | 19.5 | 1429 | 1 | 8.38 | `trsm_lt_kernel` | 0.354 | 4% | 50 | +| HB/bcsstk17 | SPD | 3.08 | 189 | 1 | 2.5 | `trsm_lt_kernel` | 0.0667 | 3% | 10 | +| HB/bcsstk17 | S | 3.57 | 226 | 1 | 2.6 | `solve_bwd_kernel` | 0.0697 | 3% | 772 | +| Boeing/bcsstk38 | SPD | 1.86 | 94 | 1 | 1.25 | `solve_bwd_kernel` | 0.0645 | 5% | 207 | +| Boeing/bcsstk38 | S | 2.48 | 113 | 1 | 1.3 | `solve_fwd_kernel` | 0.0687 | 5% | 207 | +| GHS_psdef/apache2 | SPD | 94 | 6631 | 1 | 55.4 | `solve_bwd_kernel` | 0.968 | 2% | 15048 | +| kkt_pglib_opf_case118_ieee_condensed_1 | SPD | 1.73 | 4 | 1 | 1.59 | `solve_fwd_kernel` | 0.796 | 50% | 1 | +| kkt_pglib_opf_case118_ieee_condensed_1 | S | 1.97 | 5 | 1 | 1.84 | `solve_fwd_kernel` | 0.931 | 51% | 1 | +| kkt_pglib_opf_case118_ieee_condensed_10 | SPD | 1.86 | 4 | 1 | 1.59 | `solve_fwd_kernel` | 0.796 | 50% | 1 | +| kkt_pglib_opf_case118_ieee_condensed_10 | S | 1.96 | 5 | 1 | 1.84 | `solve_fwd_kernel` | 0.931 | 51% | 1 | +| kkt_pglib_opf_case118_ieee_condensed_20 | SPD | 1.71 | 4 | 1 | 1.59 | `solve_fwd_kernel` | 0.796 | 50% | 1 | +| kkt_pglib_opf_case118_ieee_condensed_20 | S | 1.96 | 5 | 1 | 1.84 | `solve_fwd_kernel` | 0.931 | 51% | 1 | +| kkt_pglib_opf_case118_ieee_k2_1 | S | 6.96 | 5 | 1 | 6.73 | `solve_bwd_kernel` | 3.38 | 50% | 1 | +| kkt_pglib_opf_case118_ieee_k2_10 | S | 6.98 | 5 | 1 | 7.26 | `solve_fwd_kernel` | 3.91 | 54% | 1 | +| kkt_pglib_opf_case118_ieee_k2_20 | S | 6.81 | 5 | 1 | 6.66 | `solve_bwd_kernel` | 3.33 | 50% | 1 | +| kkt_pglib_opf_case1354_pegase_condensed_1 | SPD | 16.6 | 4 | 1 | 16.3 | `solve_fwd_kernel` | 8.19 | 50% | 1 | +| kkt_pglib_opf_case1354_pegase_condensed_1 | S | 19.4 | 5 | 1 | 19.1 | `solve_fwd_kernel` | 9.55 | 50% | 1 | +| kkt_pglib_opf_case1354_pegase_condensed_10 | SPD | 16.5 | 4 | 1 | 16.3 | `solve_fwd_kernel` | 8.19 | 50% | 1 | +| kkt_pglib_opf_case1354_pegase_condensed_10 | S | 19.6 | 5 | 1 | 21 | `solve_fwd_kernel` | 10.9 | 52% | 1 | +| kkt_pglib_opf_case1354_pegase_condensed_20 | SPD | 16.4 | 4 | 1 | 16.3 | `solve_fwd_kernel` | 8.19 | 50% | 1 | +| kkt_pglib_opf_case1354_pegase_condensed_20 | S | 19.3 | 5 | 1 | 18.8 | `solve_fwd_kernel` | 9.55 | 51% | 1 | +| kkt_pglib_opf_case1354_pegase_k2_1 | S | 77.2 | 5 | 1 | 73.7 | `solve_fwd_kernel` | 39.2 | 53% | 1 | +| kkt_pglib_opf_case1354_pegase_k2_10 | S | 75.4 | 5 | 1 | 70.3 | `solve_fwd_kernel` | 35.3 | 50% | 1 | +| kkt_pglib_opf_case1354_pegase_k2_20 | S | 72.4 | 5 | 1 | 70.3 | `solve_fwd_kernel` | 35.4 | 50% | 1 | +| kkt_pglib_opf_case14_ieee_condensed_1 | SPD | 0.304 | 4 | 1 | 0.173 | `solve_fwd_kernel` | 0.0864 | 50% | 1 | +| kkt_pglib_opf_case14_ieee_condensed_1 | S | 0.294 | 5 | 1 | 0.202 | `solve_fwd_kernel` | 0.101 | 50% | 1 | +| kkt_pglib_opf_case14_ieee_condensed_10 | SPD | 0.358 | 4 | 1 | 0.173 | `solve_fwd_kernel` | 0.0864 | 50% | 1 | +| kkt_pglib_opf_case14_ieee_condensed_10 | S | 0.381 | 5 | 1 | 0.202 | `solve_fwd_kernel` | 0.101 | 50% | 1 | +| kkt_pglib_opf_case14_ieee_condensed_11 | SPD | 0.292 | 4 | 1 | 0.173 | `solve_fwd_kernel` | 0.0865 | 50% | 1 | +| kkt_pglib_opf_case14_ieee_condensed_11 | S | 0.319 | 5 | 1 | 0.202 | `solve_fwd_kernel` | 0.101 | 50% | 1 | +| kkt_pglib_opf_case14_ieee_k2_1 | S | 0.826 | 5 | 1 | 0.701 | `solve_fwd_kernel` | 0.349 | 50% | 1 | +| kkt_pglib_opf_case14_ieee_k2_10 | S | 0.956 | 5 | 1 | 0.7 | `solve_fwd_kernel` | 0.349 | 50% | 1 | +| kkt_pglib_opf_case14_ieee_k2_15 | S | 0.716 | 5 | 1 | 0.566 | `solve_fwd_kernel` | 0.283 | 50% | 1 | diff --git a/bench/profile_phases.jl b/bench/profile_phases.jl new file mode 100644 index 0000000..8350299 --- /dev/null +++ b/bench/profile_phases.jl @@ -0,0 +1,212 @@ +# Experiment 0 of PERFORMANCE.md: where SDS spends refactorization and solve +# time on CUDA. For every harness matrix and structure, one warm +# refactorization and one warm solve run under `CUDA.@profile` (CUPTI); the +# script reports the launch plan of the schedule (regime-A subtrees, regime-B +# and regime-C fronts, launch groups), the wall time, the number of kernels and +# copies, the GPU busy time (sum of kernel durations), the share of the longest +# kernel and its grid, and writes `bench/profile/phase_split.{md,csv}`. +# +# julia --project=bench bench/profile_phases.jl [--only=m1,m2] [--structures=SPD,S] +# [--no-suitesparse] [--no-dumps] +# +# The SDS phases are run with `asynchronous = false`, as in bench/compare.jl. The +# wall time is the best of 5 warm runs, each after 0.2 s of device load so that +# the GPU is at full clock; the profiled run is a sixth one. +# LDLᵀ is skipped on matrices whose LDLᵀ factorization took more than 10 s in +# bench/comparison/sds.csv (GHS_psdef/apache2, lap3d_40): issue #75. + +using LinearAlgebra +using SparseArrays +using Random +using Printf +using Dates +using SparseDirectSolver, Metis +using CUDA, CUDA.cuSPARSE + +include(joinpath(@__DIR__, "matrices.jl")) +using .BenchMatrices + +function parse_args(args) + o = Dict("only" => "", "structures" => "SPD,S", "suitesparse" => "true", "dumps" => "true") + for a in args + if a in ("--no-suitesparse", "--no-dumps") + o[a[6:end]] = "false" + elseif (m = match(r"^--(only|structures)=(.*)$", a)) !== nothing + o[m[1]] = m[2] + else + error("unknown argument \"$a\"; see the header of bench/profile_phases.jl") + end + end + return o +end + +const OPTS = parse_args(ARGS) +const SLOW_LDLT = ("GHS_psdef/apache2", "lap3d_40") +const OUTDIR = joinpath(@__DIR__, "profile") + +# kernel name without the KernelAbstractions/CUDA template arguments +function short_name(name::AbstractString) + m = match(r"^(?:void\s+)?(?:gpu_)?([A-Za-z0-9_]+?)_?(?:\(|<|$)", name) + return m === nothing ? first(name, 40) : m[1] +end + +# keep the GPU at full clock before each timed phase (see `spin_device` in bench/compare.jl) +const SPIN_BUFFER = Ref{Any}(nothing) +function spin_device(seconds = 0.2) + SPIN_BUFFER[] === nothing && (SPIN_BUFFER[] = CUDA.zeros(Float32, 2^24)) + buf, t0 = SPIN_BUFFER[], time() + while time() - t0 < seconds + buf .= sin.(buf) .+ 1f0 + CUDA.synchronize() + end +end + +""" + profile_phase(f) -> NamedTuple + +Run `f()` (one phase, ending in a device synchronization) under `CUDA.@profile` +and summarize the device trace: wall time, kernels, copies, GPU busy time and +the longest kernel. +""" +function profile_phase(f) + wall = Inf + for _ in 1:5 # wall time: best of 5 warm runs at full clock + spin_device() + t0 = time_ns() + f() + wall = min(wall, (time_ns() - t0) / 1e6) + end + spin_device() + r = CUDA.@profile trace = true f() + d = r.device + iskernel = [d.grid[i] !== missing for i in eachindex(d.id)] + dur = [(d.stop[i] - d.start[i]) * 1e3 for i in eachindex(d.id)] + kidx = findall(iskernel) + busy = sum(dur[kidx]; init = 0.0) + span = isempty(d.id) ? 0.0 : (maximum(d.stop) - minimum(d.start)) * 1e3 + top = isempty(kidx) ? 0 : kidx[argmax(dur[kidx])] + byname = Dict{String, Tuple{Int, Float64}}() + for i in kidx + k = short_name(d.name[i]) + c, t = get(byname, k, (0, 0.0)) + byname[k] = (c + 1, t + dur[i]) + end + return (; wall, kernels = length(kidx), copies = count(!, iskernel), busy, span, + top_ms = top == 0 ? 0.0 : dur[top], top_name = top == 0 ? "" : short_name(d.name[top]), + top_blocks = top == 0 ? 0 : Int(d.grid[top].x * d.grid[top].y * d.grid[top].z), + top_threads = top == 0 ? 0 : Int(d.block[top].x * d.block[top].y * d.block[top].z), + byname) +end + +function plan_summary(s) + sc = s.symbolic.schedule + P = s.numeric.plan + reg = Array(sc.regime) + A, B, C = SparseDirectSolver.REGIME_A, SparseDirectSolver.REGIME_B, SparseDirectSolver.REGIME_C + nsub = length(sc.subtree_root) + sizes = nsub == 0 ? Int[] : diff(Array(sc.subtree_ptr)) + return (; nsuper = length(reg), a_fronts = count(==(A), reg), subtrees = nsub, + largest_subtree = isempty(sizes) ? 0 : maximum(sizes), + b_fronts = count(==(B), reg), c_fronts = count(==(C), reg), + groups = length(P.sub_first) + length(P.group_first), nlevels = maximum(Array(sc.level); init = 0)) +end + +function run_case(M::BenchMatrix, structure::String) + A = M.A + n = size(A, 1) + Random.seed!(666) + Ad = CuSparseMatrixCSR(tril(A)) + b = CuArray(rand(n)) + x = similar(b) + s = SparseDirectSolver.DirectSolver(Ad, structure, 'L') + ex(p) = SparseDirectSolver.execute!(p, s, x, b; asynchronous = false) + ta = @elapsed ex("analysis") + ex("factorization") + info = SparseDirectSolver.getparam(s, "info") + for _ in 1:2 + ex("refactorization") + ex("solve") + end + CUDA.synchronize() + refac = profile_phase(() -> (ex("refactorization"); CUDA.synchronize())) + solve = profile_phase(() -> (ex("solve"); CUDA.synchronize())) + relres = norm(Array(b) - A * Array(x)) / norm(Array(b)) + return (; matrix = M.name, structure, n, nnz = nnz(A), info, analysis_ms = ta * 1e3, + lnnz = SparseDirectSolver.getparam(s, "lu_nnz"), relres, plan_summary(s)..., refac, solve) +end + +function main() + only = isempty(OPTS["only"]) ? nothing : Set(split(OPTS["only"], ',')) + structures = split(OPTS["structures"], ',') + mats = bench_matrices(; suitesparse = OPTS["suitesparse"] == "true", dumps = OPTS["dumps"] == "true") + only === nothing || filter!(M -> M.name in only, mats) + rows = [] + for M in mats, st in structures + st in M.structures || continue + st == "S" && M.name in SLOW_LDLT && continue + print(rpad("$(M.name) $st", 52)) + r = try + run_case(M, String(st)) + catch err + println("ERROR ", sprint(showerror, err)[1:min(end, 200)]) + continue + end + @printf("refac %8.2f ms (%4d kernels, top %5.1f%% %s on %d blocks) solve %8.2f ms (%4d kernels)\n", + r.refac.wall, r.refac.kernels, 100 * r.refac.top_ms / max(r.refac.busy, eps()), + r.refac.top_name, r.refac.top_blocks, r.solve.wall, r.solve.kernels) + push!(rows, r) + end + mkpath(OUTDIR) + write_csv(joinpath(OUTDIR, "phase_split.csv"), rows) + write_md(joinpath(OUTDIR, "phase_split.md"), rows) + println("wrote ", joinpath(OUTDIR, "phase_split.{md,csv}")) +end + +f1(x) = @sprintf("%.3g", x) + +function write_csv(path, rows) + cols = ["matrix", "structure", "n", "nnz", "lnnz", "nsuper", "a_fronts", "subtrees", "largest_subtree", + "b_fronts", "c_fronts", "groups", "nlevels", "refac_wall_ms", "refac_kernels", "refac_copies", + "refac_busy_ms", "refac_top_ms", "refac_top_name", "refac_top_blocks", "solve_wall_ms", + "solve_kernels", "solve_copies", "solve_busy_ms", "solve_top_ms", "solve_top_name", "relres"] + open(path, "w") do io + println(io, join(cols, ',')) + for r in rows + v = [r.matrix, r.structure, r.n, r.nnz, r.lnnz, r.nsuper, r.a_fronts, r.subtrees, r.largest_subtree, + r.b_fronts, r.c_fronts, r.groups, r.nlevels, r.refac.wall, r.refac.kernels, r.refac.copies, + r.refac.busy, r.refac.top_ms, r.refac.top_name, r.refac.top_blocks, r.solve.wall, + r.solve.kernels, r.solve.copies, r.solve.busy, r.solve.top_ms, r.solve.top_name, r.relres] + println(io, join(string.(v), ',')) + end + end +end + +function write_md(path, rows) + open(path, "w") do io + println(io, "# SDS phase split on CUDA (PERFORMANCE.md, experiment 0)\n") + println(io, "Generated by `bench/profile_phases.jl` on ", CUDA.name(CUDA.device()), ", ", Dates.today(), + ". Wall time: best of 5 warm runs at full clock; a sixth run per phase under `CUDA.@profile` gives the kernels. *busy* is the sum of kernel durations; ", + "*top* is the longest kernel, its share of *busy* and its number of thread blocks.\n") + println(io, "## Schedule\n") + println(io, "| matrix | structure | n | nnz(L) | supernodes | A fronts | A subtrees | largest subtree | B fronts | C fronts | launch groups | levels |") + println(io, "| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |") + for r in rows + println(io, "| ", join([r.matrix, r.structure, r.n, f1(r.lnnz), r.nsuper, r.a_fronts, r.subtrees, + r.largest_subtree, r.b_fronts, r.c_fronts, r.groups, r.nlevels], " | "), " |") + end + for (title, key) in (("Refactorization", :refac), ("Solve", :solve)) + println(io, "\n## ", title, "\n") + println(io, "| matrix | structure | wall ms | kernels | copies | busy ms | top kernel | top ms | top share | top blocks |") + println(io, "| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |") + for r in rows + p = getfield(r, key) + println(io, "| ", join([r.matrix, r.structure, f1(p.wall), p.kernels, p.copies, f1(p.busy), + "`" * p.top_name * "`", f1(p.top_ms), + @sprintf("%.0f%%", 100 * p.top_ms / max(p.busy, eps())), + p.top_blocks], " | "), " |") + end + end + end +end + +main() diff --git a/src/options.jl b/src/options.jl index 5441ef4..14691a1 100644 --- a/src/options.jl +++ b/src/options.jl @@ -75,8 +75,19 @@ const DEFAULT_AMALGAMATION = AmalgamationParams((32, 0.25, 8)) # regime A local-memory budgets (bytes): 16, 32 and 48 KiB (PLAN §2.3 step 5) const DEFAULT_SUBTREE_BUDGETS = [16 * 1024, 32 * 1024, 48 * 1024] +# Regime A runs a subtree on one workgroup. A tree of small fronts fits the +# local-memory budgets as a whole and then ran on one workgroup of one SM: the +# pglib KKT dumps were factored 10-20x slower than with regime A off +# (PERFORMANCE.md, experiment 0; bench/profile/phase_split.md). A subtree may do +# at most `1/SUBTREE_PARALLELISM` of the factorization flops. 4096 was the best +# or near-best value of a sweep over 128..4096 on the harness (RTX 4080); it +# leaves the SuiteSparse and Laplacian subtrees as they were. +"Default `subtree_parallelism`: a regime-A subtree does at most this fraction (inverse) of the factorization flops." +const SUBTREE_PARALLELISM = 4096 + # `Options` fields that are analysis tuning knobs, not parameter strings (T07) -const TUNING_OPTIONS = (:regime_c_width, :regime_c_rows, :subtree_budgets, :memory_budget) +const TUNING_OPTIONS = (:regime_c_width, :regime_c_rows, :subtree_budgets, :subtree_parallelism, + :memory_budget) """ Options(; kwargs...) @@ -121,6 +132,7 @@ defaults below. Keyword arguments are applied through [`setparam!`](@ref), so | `regime_c_width` | `64` | fronts wider than this go to regime C (vendor dense calls) | | `regime_c_rows` | `512` | fronts with more rows than this go to regime C | | `subtree_budgets` | `[16384, 32768, 49152]` | regime A local-memory budgets in bytes; empty disables regime A | +| `subtree_parallelism` | `4096` | a regime-A subtree does at most `1/subtree_parallelism` of the factorization flops (`0`: no limit) | | `memory_budget` | `-1` | update-stack bytes per level chunk (negative: no limit, no chunking) | | `user_perm`, `user_schur_indices`, `user_nd_partition_tree`, `ubatch_mask`, `pivot_sign` | `nothing` | not provided | | `user_host_interrupt` | `nothing` | not provided | @@ -128,7 +140,7 @@ defaults below. Keyword arguments are applied through [`setparam!`](@ref), so Vectors are stored as host copies; `user_host_interrupt` is stored by reference because it is polled while a phase runs. -The last four rows are analysis tuning knobs of the schedule (PLAN §2.3 step 5, +The last five rows are analysis tuning knobs of the schedule (PLAN §2.3 step 5, TASKS T07). They are not cuDSS parameter strings, so [`setparam!`](@ref) does not know them; set them with `Options(; regime_c_width = 128)` (validated) or by assigning the field. @@ -169,6 +181,7 @@ mutable struct Options regime_c_width::Int regime_c_rows::Int subtree_budgets::Vector{Int} + subtree_parallelism::Int memory_budget::Int64 # user-provided data parameters (inputs of the phases) user_perm::Union{Nothing, Vector{Int}} @@ -184,7 +197,7 @@ mutable struct Options 0, 0, 0.0, PIVOT_AUTO, 0.01, nothing, PIVOT_EPSILON_DEFAULT, -1, 0, 0, 1, 0, 0, 10, 0, -1, 1, 0, 0, -1, IR_PLAIN, nothing, DEFAULT_AMALGAMATION, SCHEDULE_AUTO, PIVOT_PAIRS_DEFAULT, - 64, 512, copy(DEFAULT_SUBTREE_BUDGETS), -1, + 64, 512, copy(DEFAULT_SUBTREE_BUDGETS), SUBTREE_PARALLELISM, -1, nothing, nothing, nothing, nothing, nothing, nothing, ) for (name, value) in kwargs @@ -465,6 +478,9 @@ for field in (:regime_c_width, :regime_c_rows) _parse_int($(String(field)), value, 1, typemax(Int), "an integer ≥ 1") end +_parse_tuning(::Val{:subtree_parallelism}, value) = + _parse_int("subtree_parallelism", value, 0, typemax(Int), "an integer ≥ 0 (0: no limit)") + _parse_tuning(::Val{:memory_budget}, value) = Int64(_parse_int("memory_budget", value, typemin(Int64), typemax(Int64), "an integer (negative: no limit)")) diff --git a/src/symbolic/schedule.jl b/src/symbolic/schedule.jl index 1c7c353..5f35560 100644 --- a/src/symbolic/schedule.jl +++ b/src/symbolic/schedule.jl @@ -231,6 +231,18 @@ function nlaunches(sc::Schedule) return total end +""" + front_flops(f, w) -> Int64 + +Multiply-add count of the partial dense factorization of an `f×f` front with +`w` pivot columns: `Σ_{j=f-w+1}^{f} j²` (the elimination of column `k` updates +the trailing `(f-k)×(f-k)` block). The work measure of the regime-A split. +""" +function front_flops(f::Integer, w::Integer) + sq(n) = Int64(n) * (n + 1) * (2n + 1) ÷ 6 + return sq(f) - sq(f - w) +end + """ build_schedule(sp::SupernodePartition, opts::Options = Options(), ::Type{T} = Float64) -> Schedule @@ -243,7 +255,11 @@ the supernodes of `sp`, with byte budgets for the element type `T`: and its subtree's serial stack peak (packed lower-triangular `f×f` fronts plus the packed `m×m` contribution blocks waiting for their parent, `m = f - w`) fits the [`subtree_capacity`](@ref) of the largest of - `opts.subtree_budgets`; the maximal eligible subtrees are the regime-A + `opts.subtree_budgets`, and its subtree's flops ([`front_flops`](@ref)) + are at most `total ÷ opts.subtree_parallelism` (`0`: no flop limit), so + that a large tree of small fronts is split into enough subtrees to fill + the device instead of running on one workgroup; the maximal + eligible subtrees are the regime-A subtrees, each with the smallest budget class that holds it (empty `subtree_budgets` disables regime A); 3. regime B: the rest, binned by the smallest width class in `8, 16, 32, 64, …` @@ -269,6 +285,15 @@ function build_schedule(sp::SupernodePartition, opts::Options = Options(), ::Typ sp.snparent[s] != 0 && push!(children[sp.snparent[s]], s) end level = tree_height(sp.snparent) + # flops of every subtree; children precede parents in the supernode numbering + work = [front_flops(rows[s], width[s]) for s in 1:ns] + total = sum(work; init = Int64(0)) + for s in 1:ns + p = sp.snparent[s] + p != 0 && (work[p] += work[s]) + end + par = opts.subtree_parallelism + maxwork = par <= 0 ? typemax(Int64) : total ÷ par big = [width[s] > cw || rows[s] > cr for s in 1:ns] # 2. regime A: serial stack peak (entries) with children ordered by decreasing peak - cb (Liu) peak = zeros(Int, ns) @@ -283,7 +308,7 @@ function build_schedule(sp::SupernodePartition, opts::Options = Options(), ::Typ acc += cb[c] end peak[s] = max(pk, acc + packed_length(rows[s])) - eligible[s] = !big[s] && all(c -> eligible[c], kids) && peak[s] <= maxcap + eligible[s] = !big[s] && all(c -> eligible[c], kids) && peak[s] <= maxcap && work[s] <= maxwork end regime = fill(REGIME_B, ns) subtree = zeros(Int, ns) diff --git a/test/test_api.jl b/test/test_api.jl index 05671e7..897be39 100644 --- a/test/test_api.jl +++ b/test/test_api.jl @@ -62,6 +62,9 @@ end n = size(A, 1) for view in ('L', 'U', 'F') solver = DirectSolver(api_matrix(backend, triangle_view(A, view), INT), spd_structure(T), view) + # deterministic_mode = 1: the bitwise comparisons below need the atomic-free forward sweep (the default atomic + # sweep sums regime-B updates in a run-dependent order on a GPU) + setparam!(solver, "deterministic_mode", 1) b = rand(T, n, 3) bd = to_device(backend, b) xd = similar(bd) @@ -88,6 +91,7 @@ end @test to_host(cd) == x # the named wrappers solver2 = DirectSolver(api_matrix(backend, triangle_view(A, view), INT), spd_structure(T), view) + setparam!(solver2, "deterministic_mode", 1) @test analyze!(solver2) === solver2 @test factorize!(solver2) === solver2 @test refactorize!(solver2; asynchronous = false) === solver2 @@ -281,6 +285,8 @@ end A = laplacian3d(T, 6, 6, 5) n = size(A, 1) solver = api_solver(backend, A) + # deterministic_mode = 1 for the bitwise comparisons of the layouts (atomic sweep: run-dependent sums on a GPU) + setparam!(solver, "deterministic_mode", 1) for nrhs in (1, 2, 5, 3) # the workspace grows to 5 right-hand sides and stays b = api_rhs(T, n, nrhs) x = api_solve(backend, solver, b) @@ -350,6 +356,8 @@ end F = cholesky(api_matrix(backend, triangle_view(A, view), INT); view) @test F isa DirectSolver{T, INT} @test !F.fresh_factorization && getparam(F, "info") == 0 + # deterministic_mode = 1 for the bitwise comparisons below (atomic sweep: run-dependent sums on a GPU) + setparam!(F, "deterministic_mode", 1) @test relres(A, to_host(F \ bd), b) <= tol(T) @test relres(A, to_host(F \ bd[:, 1]), b[:, 1]) <= tol(T) xd = similar(bd) diff --git a/test/test_numeric_cholesky_a.jl b/test/test_numeric_cholesky_a.jl index 5f8e2fd..4838365 100644 --- a/test/test_numeric_cholesky_a.jl +++ b/test/test_numeric_cholesky_a.jl @@ -2,10 +2,13 @@ # workgroup per leaf subtree, fronts and contribution blocks in local memory), # together with regimes B and C, checked against the T08 reference panels. -# default budgets (16, 32, 48 KiB): regimes A, B and C on the 3-D Laplacian and the random SPD matrix -const NUMERIC_A_OPTS = Options() +# default budgets (16, 32, 48 KiB): regimes A, B and C on the 3-D Laplacian and the random SPD matrix; regime-A +# subtrees as large as the budgets allow (`subtree_parallelism = 0`; the default split leaves these small +# matrices few or no subtrees, see "subtree_parallelism" in test_symbolic_schedule.jl) +const NUMERIC_A_OPTS = Options(subtree_parallelism = 0) # small budgets and regime-C thresholds: all three regimes on a 2-D Laplacian -const NUMERIC_ABC_OPTS = Options(subtree_budgets = [8192, 16384], regime_c_width = 16, regime_c_rows = 128) +const NUMERIC_ABC_OPTS = Options(subtree_budgets = [8192, 16384], regime_c_width = 16, regime_c_rows = 128, + subtree_parallelism = 0) numeric_a_matrices(::Type{T}) where {T} = (("laplacian2d(40,40) A+B+C", laplacian2d(T, 40, 40), NUMERIC_ABC_OPTS), @@ -57,11 +60,11 @@ end @test SDS.nsubtrees(S.schedule) == 0 # the local capacity depends on the element size: wider numeric elements than the analysis's are rejected C = SDS.CSR(tril(laplacian2d(Float32, 10, 10))) - S32 = SDS.symbolic_analysis(C, "SPD", 'L') + S32 = SDS.symbolic_analysis(C, "SPD", 'L'; opts = NUMERIC_A_OPTS) @test S32.elsize == sizeof(Float32) && SDS.nsubtrees(S32.schedule) > 0 @test thrown(() -> SDS.factorize!(SDS.allocate_numeric(S32, Float64), S32, Float64.(C.nzval))) isa InvalidValueError - S64 = SDS.symbolic_analysis(SDS.CSR(tril(laplacian2d(Float64, 10, 10))), "SPD", 'L') + S64 = SDS.symbolic_analysis(SDS.CSR(tril(laplacian2d(Float64, 10, 10))), "SPD", 'L'; opts = NUMERIC_A_OPTS) @test SDS.factorize!(SDS.allocate_numeric(S64, Float32), S64, Float32.(C.nzval)) == 0 end @@ -94,9 +97,10 @@ end @testset "budget classes and kernel sizes ($(backend_name(backend)), $T)" for backend in BACKENDS, T in ELTYPES # the same matrix under different budgets: other subtrees, other local sizes, same factor A = laplacian3d(T, 8, 8, 8) - for opts in (Options(subtree_budgets = [8192]), Options(subtree_budgets = [65536]), - Options(subtree_budgets = [8192, 20000, 1 << 20], regime_c_width = 32), - Options(subtree_budgets = [32768], factorization_alg = "algo2")) + for opts in (Options(subtree_budgets = [8192], subtree_parallelism = 0), + Options(subtree_budgets = [65536], subtree_parallelism = 0), + Options(subtree_budgets = [8192, 20000, 1 << 20], regime_c_width = 32, subtree_parallelism = 0), + Options(subtree_budgets = [32768], factorization_alg = "algo2", subtree_parallelism = 0)) S, Nr, _, Sd, Nd, nz = numeric_setup(backend, A; opts) @test SDS.nsubtrees(S.schedule) > 0 @test SDS.factorize!(Nd, Sd, nz) == 0 @@ -112,7 +116,8 @@ end T in ELTYPES A = laplacian2d(T, 100, 100) b = rand(T, size(A, 1), 2) - x = map((Options(reordering_alg = "algo3"), Options(reordering_alg = "algo3", subtree_budgets = Int[]))) do opts + x = map((Options(reordering_alg = "algo3", subtree_parallelism = 0), + Options(reordering_alg = "algo3", subtree_budgets = Int[]))) do opts S, Nr, _, Sd, Nd, nz = numeric_setup(backend, A; opts) @test SDS.factorize!(Nd, Sd, nz) == 0 Nh = SDS.host_numeric(Nd) @@ -168,7 +173,8 @@ end @testset "info: first non-positive pivot ($(backend_name(backend)), $T)" for backend in BACKENDS, T in ELTYPES n, j = 60, 23 - for opts in (NUMERIC_A_OPTS, Options(reordering_alg = "algo5"), Options(use_superpanels = 0), NUMERIC_ABC_OPTS) + for opts in (NUMERIC_A_OPTS, Options(reordering_alg = "algo5", subtree_parallelism = 0), + Options(use_superpanels = 0, subtree_parallelism = 0), NUMERIC_ABC_OPTS) A = singular_block_matrix(T, n, j; stored_zero = true) A[j, j] = 3 _, Nr, info_ref, Sd, Nd, nz = numeric_setup(backend, A; opts) @@ -190,7 +196,7 @@ end end # a non-positive pivot that only appears after elimination: [1 2; 2 1] block at columns 3, 4 A = sparse(T[4 0 0 0; 0 4 0 0; 0 0 1 2; 0 0 2 1]) - _, _, info_ref, Sd, Nd, nz = numeric_setup(backend, A; opts = Options(reordering_alg = "algo5")) + _, _, info_ref, Sd, Nd, nz = numeric_setup(backend, A; opts = Options(reordering_alg = "algo5", subtree_parallelism = 0)) @test SDS.nsubtrees(Sd.schedule) > 0 @test info_ref == 4 @test SDS.factorize!(Nd, Sd, nz) == 4 diff --git a/test/test_symbolic_schedule.jl b/test/test_symbolic_schedule.jl index f03ae32..400d97d 100644 --- a/test/test_symbolic_schedule.jl +++ b/test/test_symbolic_schedule.jl @@ -205,10 +205,52 @@ triangle(A, view) = view == 'L' ? tril(A) : view == 'U' ? triu(A) : A @test thrown(() -> setparam!(Options(), "memory_budget", 1)) isa ArgumentError end +@testset "subtree_parallelism: flop limit of the regime-A subtrees" begin + @test Options().subtree_parallelism == SDS.SUBTREE_PARALLELISM == 4096 + @test Options(subtree_parallelism = 0).subtree_parallelism == 0 + @test copy(Options(subtree_parallelism = 7)).subtree_parallelism == 7 + @test thrown(() -> Options(subtree_parallelism = -1)) isa InvalidValueError + @test thrown(() -> Options(subtree_parallelism = 1.5)) isa InvalidValueError + # multiply-adds of a partial front factorization: Σ_{j=f-w+1}^{f} j² + @test SDS.front_flops(3, 1) == 9 && SDS.front_flops(3, 3) == 14 && SDS.front_flops(5, 2) == 41 + @test SDS.front_flops(1000, 64) == sum(Int64(j)^2 for j in 937:1000) + A = laplacian2d(Float64, 60, 60) + schedules = map((0, 64, 4096)) do par + S = SDS.symbolic_analysis(SDS.CSR(tril(A)), "SPD", 'L'; opts = Options(subtree_parallelism = par)) + check_schedule(S) + S + end + S0 = schedules[1] + sp = S0.partition + ns = SDS.nsupernodes(S0) + work = [SDS.front_flops(S0.schedule.rows[s], S0.schedule.width[s]) for s in 1:ns] + total = sum(work) + for s in 1:ns # subtree flops (children numbered before parents) + sp.snparent[s] != 0 && (work[sp.snparent[s]] += work[s]) + end + for (par, S) in zip((64, 4096), schedules[2:end]) + sc = S.schedule + @test S.partition.snparent == sp.snparent # the limit changes the schedule only + maxwork = total ÷ par + # every subtree within the limit, regime A shrinks, and the subtrees are maximal: the parent of a + # subtree root is over the limit or was already outside regime A without it + @test all(t -> work[sc.subtree_root[t]] <= maxwork, 1:SDS.nsubtrees(sc)) + @test all(s -> sc.regime[s] != SDS.REGIME_A || S0.schedule.regime[s] == SDS.REGIME_A, 1:ns) + @test all(sc.subtree_root) do r + q = sp.snparent[r] + q == 0 || work[q] > maxwork || S0.schedule.regime[q] != SDS.REGIME_A + end + end + # a large tree of small fronts is split over many workgroups (measured 7, 56, 240 subtrees) + @test SDS.nsubtrees(schedules[1].schedule) < SDS.nsubtrees(schedules[2].schedule) < + SDS.nsubtrees(schedules[3].schedule) + @test SDS.nsubtrees(schedules[3].schedule) >= 100 +end + @testset "small example" begin # arrow matrix: four leaves 1..4 coupled to the 2×2 root block 5..6 A = sparse(Float64[4 0 0 0 1 1; 0 4 0 0 1 1; 0 0 4 0 1 1; 0 0 0 4 1 1; 1 1 1 1 4 1; 1 1 1 1 1 4]) - opts = Options(reordering_alg = "algo5", use_superpanels = 0) + opts = Options(reordering_alg = "algo5", use_superpanels = 0, subtree_parallelism = 0) S = SDS.symbolic_analysis(SDS.CSR(A), "SPD", 'L'; opts) sc = S.schedule @test SDS.nsupernodes(S) == 5 @@ -219,6 +261,9 @@ end @test SDS.nlaunches(sc) == 1 @test S.layout.stack_len == 0 check_schedule(S) + # the default flop limit (1/4096 of 31 multiply-adds) leaves no front of this tiny tree in regime A + @test SDS.nsubtrees(SDS.symbolic_analysis(SDS.CSR(A), "SPD", 'L'; + opts = Options(reordering_alg = "algo5", use_superpanels = 0)).schedule) == 0 # without regime A: one level of four B fronts (same bin), then the root S0 = SDS.symbolic_analysis(SDS.CSR(A), "SPD", 'L'; opts = Options(reordering_alg = "algo5", use_superpanels = 0, subtree_budgets = Int[]))