Skip to content

Build against cuOpt 26.10: multi-GPU PDLP, new options, iteration/node reporting - #20

Merged
0x17 merged 27 commits into
mainfrom
multigpu-pdlp-nightly
Oct 15, 2026
Merged

0x17 merged 27 commits into
mainfrom
multigpu-pdlp-nightly

Conversation

@0x17

@0x17 0x17 commented Oct 2, 2026 •

Copy link
Copy Markdown
Member
  • Build both workflows against the released cuOpt 26.10 wheels from PyPI: libcuopt-mathopt-cuXX==26.10.* + libcuopt-client==26.10.*
    • 26.10 splits libcuopt into component wheels (libcuopt-mathopt-cuXX, libcuopt-client, libcuopt-routing-cuXX); the link only needs mathopt and client
    • all dependencies resolve from plain PyPI, so no RAPIDS nightly index, --prerelease=allow or pypi.nvidia.com anymore; ==26.10.* without --prerelease only matches final releases (picks up 26.10.x hotfixes)
    • during development the branch was built against 26.10 nightlies (Build against latest cuOpt nightly wheels from RAPIDS nightly index #23); the earlier a223/a224 pin and the revert 4855ada are only history now
    • CONTRIBUTING.md local build instructions updated accordingly (were still cuopt-cu13==26.8.*)
  • Adapt link and bundles to the split cuOpt libraries (both workflows and build-link.sh)
    • link -lcuopt_mathopt -lcuopt_client, add -I libcuopt_client/include (status_codes.h ships in the client wheel)
    • bundle libcuopt_mathopt.so + libcuopt_client.so and cuOpt's cuDSS threading layer libcudss_mtlayer_cuopt.so; libcudss_mtlayer_gomp.so is no longer bundled
    • libcuopt_client.so needs system libssl.so.3/libcrypto.so.3/libz.so.1 (not bundled)
  • Support multi-GPU PDLP (Add C API support for multiGPU PDLP  NVIDIA/cuopt#1958)
  • Update optcuopt.def to cuOpt 26.10, checked against the headers of the released v26.10.00 wheels
    • remove 4 options dropped upstream (mip_hyper_heuristic_presolve_time_ratio, mip_hyper_heuristic_presolve_max_time, mip_hyper_diving_min_node_depth, mip_hyper_submip_node_limit_base)
    • concurrent_nnz_cutoff renamed to large_nnz_threshold upstream without an alias (Sync cuOpt options with NVIDIA/cuopt main (8eb20bd) #25), so option files using the old name now get Unknown option
    • new method 4 (primal simplex) and barrier_dual_initial_point 2 (SeDuMi-style), fix changed default of mip_hyper_heuristic_related_vars_time_limit
    • new options, e.g. primal_simplex_pricing, mip_rens, mip_mutation, barrier regularization, Curtis-Reid scaling, postsolve_info, mip_hyper_presolve_indicator_strengthening, degenerate pivots (mip_dual_degenerate_feasibility_pump, mip_primal_degenerate_pivots, mip_dual_degenerate_pivots), pdlp_hyper_reduced_matrix, pdlp_hyper_project_initial_primal
    • left out: sequence_solve (Python re-solve cache only), log_file/log_to_console (set by the link)
  • Report iterations and nodes to GAMS via the new solution attributes (cuOptGetSolutionIntAttribute)
    • LP iterations, MIP nodes and simplex iterations; node-limit detection now uses the actual node count
    • guarded by #ifdef, still compiles against 26.08 headers
  • Pass GAMS nodlim to cuOpt node_limit (was ignored before)
  • Bug fix: drop the PDLP reduced-cost workaround in gmscuopt.c, cuOpt now returns correct reduced costs (Correctly return reduced costs for PDLP (stable3) NVIDIA/cuopt#1797)
  • Merged main (Fix example notebooks for current release zips #21, README quickstart, Colab badges, performance notes and community files #22); the only conflict (notebook links in README.md) resolved in favour of main's Colab badges
  • Verified
    • released 26.10.0 wheels (v26.10.00, e93f7dc5; mathopt and client from the same commit), CUDA 13, single RTX A1000: link builds without warnings, tests/test-fetch-cuoptlink.py 29/29
    • gamslib test against the released wheels: 73/73 match CPLEX (poutil hits its 300 s limit with the reference objective, run-to-run variance)
    • examples/models/regression_tests/run_tests.sh against the released wheels: 10/10 pass
    • earlier against nightly a285 (cuOpt 74923bbd): gamslib test 73/73 match CPLEX
    • multi-GPU code path (method 1, num_gpus -1, presolve 0, runs even on 1 GPU) with nightly a278: trnsport optimal, gamslib 73/73
    • CI builds and packages CUDA 12 and CUDA 13 on x86_64 and ARM64 from PyPI only (no solves in CI)
    • not tested on a machine with several GPUs
  • Not done
    • cuOptSetLogCallback for a live log, since it only receives lines from the calling thread (a MIP log loses ~75% of its lines)
    • example notebooks still show output of the released v0.0.8e link, re-run after the next release

@0x17 0x17 self-assigned this Oct 2, 2026
@0x17 0x17 changed the title Build against cuOpt nightly and support multi-GPU PDLP Build against cuOpt nightly, add support multi-GPU PDLP, preparations for 26.10 Oct 2, 2026
@0x17 0x17 changed the title Build against cuOpt nightly, add support multi-GPU PDLP, preparations for 26.10 Build against cuOpt 26.10 nightly: multi-GPU PDLP, new options, iteration/node reporting Oct 2, 2026
Comment thread gmscuopt.c Outdated
}

status = cuOptCreateProblem(
// Ranged form, since cuOpt's multi-GPU PDLP (without presolve) ignores the row types + RHS

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Huh? please let us know about these types of issues :)
@Bubullzz

@0x17 0x17 Oct 2, 2026 •

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Ah, you're right. Didn't have the time to properly structure this finding. The issue is now here NVIDIA/cuopt#2042.

@0x17
0x17 marked this pull request as draft October 4, 2026 07:55
@0x17
0x17 marked this pull request as ready for review October 4, 2026 07:56
@0x17 0x17 changed the title Build against cuOpt 26.10 nightly: multi-GPU PDLP, new options, iteration/node reporting Build against cuOpt 26.10: multi-GPU PDLP, new options, iteration/node reporting Oct 15, 2026
@0x17
0x17 merged commit ef9d265 into main Oct 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants