Skip to content

Implement multi-GPU PDLP#1391

Open
Bubullzz wants to merge 358 commits into
NVIDIA:mainfrom
Bubullzz:cuD-PDLP
Open

Implement multi-GPU PDLP#1391
Bubullzz wants to merge 358 commits into
NVIDIA:mainfrom
Bubullzz:cuD-PDLP

Conversation

@Bubullzz

@Bubullzz Bubullzz commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Implemented metis-partitionned multi-GPU PDLP.

To run PDLP using multi-GPU run :
./cpp/build/cuopt_cli ../path/to/file.mps --method 1 --use-distributed-pdlp true, the exact number of GPUs used can be set with --distributed-pdlp-num-gpus n

Here is the bottom line of the results
On 8 NVLINKed B200 :

against CuOpt :

  • speedup : at least 2.5x and up to 8.8x (tsp-gaia-10m.mps)
  • max memory footprint on a single gpu : ~1/8x on most instances

closes #891

@Bubullzz
Bubullzz requested review from a team as code owners June 4, 2026 15:24
@copy-pr-bot

copy-pr-bot Bot commented Jun 4, 2026

Copy link
Copy Markdown

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@Bubullzz Bubullzz added the do not merge Do not merge if this flag is set label Jun 4, 2026
@coderabbitai

coderabbitai Bot commented Jun 4, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

This PR implements distributed multi-GPU PDLP solving: it wires NCCL and KaMinPar v3.7.3 into the build via CMake discovery and a new module, adds configuration surface across constants/settings/CLI, introduces partitioner backends (Dummy and KaMinPar), materializes per-GPU shard data structures with rank-local CSR matrices and NCCL-based collectives, refactors the PDHG/PDLP solver loop for per-shard graph capture and synchronization, and adds parity tests validating distributed vs single-GPU execution.

Changes

Distributed PDLP Execution Path

Layer / File(s) Summary
Build dependency discovery and linkage
cpp/CMakeLists.txt, cpp/cmake/thirdparty/get_kaminpar.cmake, cpp/src/pdlp/CMakeLists.txt, ci/validate_wheel.sh
NCCL headers and library are discovered via CONDA_PREFIX environment variable and imported as a global nccl_external target; KaMinPar v3.7.3 is fetched via CMake Packages Manager with a new find_and_configure_kaminpar module that forces static and position-independent builds; five new distributed PDLP source files are added unconditionally to the core LP_CORE_FILES build list; CI wheel size constraints for the python/libcuopt package are increased to accommodate the new static dependencies.
Distributed settings surface and CLI routing
cpp/include/cuopt/linear_programming/constants.h, cpp/include/cuopt/linear_programming/pdlp/pdlp_hyper_params.cuh, cpp/include/cuopt/linear_programming/pdlp/solver_settings.hpp, cpp/src/math_optimization/solver_settings.cu, cpp/cuopt_cli.cpp
Six new parameter macros are added for distributed PDLP control (CUOPT_USE_DISTRIBUTED_PDLP, CUOPT_DISTRIBUTED_PDLP_NUM_GPUS, partition file import/export, partitioner selector, graph-disable flag); pdlp_hyper_params_t and pdlp_solver_settings_t gain corresponding configuration members; solver settings parameter tables are extended to register and serialize these new parameters; CLI branches on use_distributed_pdlp to dispatch to the distributed solve path and provisions GPU RMM memory only for the required number of GPUs.
Partitioner backends and partition file IO
cpp/src/pdlp/distributed_pdlp/partitioner.hpp, cpp/src/pdlp/distributed_pdlp/partitioner.cpp, cpp/src/pdlp/distributed_pdlp/rank_data.hpp, cpp/src/pdlp/distributed_pdlp/partition_loader.hpp, cpp/src/pdlp/distributed_pdlp/partition_loader.cu
Introduces partitioner interface hierarchy (csr_host_view_t, partitioner_input_t, partitioner_kind_t, partitioner_i polymorphic base, dummy_partitioner_t with modulo assignment, kaminpar_partitioner_t with bipartite graph k-way partitioning); implements partition file parse/export with one integer per line; defines rank_data_t to store per-rank ownership metadata and communication plans; implements create_rank_data_from_parts to materialize per-rank local CSR matrices, compute halo indices, and remap column indices to contiguous local space.
Shard construction and multi-GPU engine runtime
cpp/src/pdlp/distributed_pdlp/shard.hpp, cpp/src/pdlp/distributed_pdlp/shard.cu, cpp/src/pdlp/distributed_pdlp/multi_gpu_engine.hpp, cpp/src/pdlp/distributed_pdlp/multi_gpu_engine.cu, cpp/src/pdlp/distributed_pdlp/distributed_algorithms.hpp, cpp/src/pdlp/distributed_pdlp/distributed_algorithms.cu, cpp/src/pdlp/distributed_pdlp/nccl_helpers.hpp
pdlp_shard_t owns per-device CUDA/RAFT resources, NCCL communicator, and a sub-pdlp_solver_t; multi_gpu_engine_t initializes NCCL communicators, constructs one pinned shard per GPU, and provides halo exchange (variable and constraint shaped), in-place allreduce, distributed L2 norm, and graph-capture fork/join primitives; distributed algorithms implement distributed bound/objective rescaling, iterative Ruiz/Pock–Chambolle scaling with halo broadcasts, power-iteration max-singular-value estimation, and shard-solution gathering to master; CUOPT_NCCL_TRY macro enforces NCCL error checking.
Initial scaling refactoring and descriptor updates
cpp/src/pdlp/initial_scaling_strategy/initial_scaling.cuh, cpp/src/pdlp/initial_scaling_strategy/initial_scaling.cu, cpp/src/pdlp/cusparse_view.cu
Ruiz and Pock–Chambolle scaling passes are split into reusable compute (local iteration vector) and apply (cumulative folding) stages; new public accessors expose cumulative scaling vectors, distributed rescaling setters, and a flag to skip local rescaling; distributed state reset helper provided; cuSPARSE CSR descriptor nnz parameters are bound to actual device buffer lengths instead of problem nnz for per-shard correctness and halo safety.
PDHG multi-GPU compute and graph orchestration
cpp/src/pdlp/pdhg.hpp, cpp/src/pdlp/pdhg.cu
pdhg_solver_t gains non-owning engine pointer, is_distributed_master() predicate, and per-shard SpMV/projection-transform helpers; compute_At_y()/compute_A_x() early-dispatch to engine on distributed master; reflected projection transforms are factored into per-shard helper methods; CUDA graph capture forks into shard streams for per-shard work and joins back to master stream.
Distributed PDLP constructor and internal state accessors
cpp/src/pdlp/pdlp.cuh, cpp/src/pdlp/pdlp.cu, cpp/src/pdlp/saddle_point.cu
pdlp_solver_t gains a distributed constructor that reads MPS, transposes the constraint matrix, partitions via file or selected partitioner, constructs rank data and multi-GPU engine, performs distributed Ruiz/Pock–Chambolle scaling, seeds distributed step sizes/weights, and initializes convergence norms; new public accessors expose scaled problem, scaling/restart strategies, and step-size/weight vectors for orchestrator dispatch; saddle-point size checks relaxed to allow zero-size master buffers.
Solver loop synchronization: fixed-error, rescaling, restart, and step-size broadcast
cpp/src/pdlp/pdlp.cu, cpp/src/pdlp/restart_strategy/pdlp_restart_strategy.cu, cpp/src/pdlp/step_size_strategy/adaptive_step_size_strategy.hpp, cpp/src/pdlp/step_size_strategy/adaptive_step_size_strategy.cu
Solver startup initialization is gated on !use_distributed_pdlp (distributed assumes prior execution); compute_fixed_error branches on distributed mode to perform per-shard delta computation, reflected-dual halo exchange, per-shard cuSPARSE setup, and NCCL allreduce of interaction scalars; unscale/rescale/Halpern update operate per shard via for_each_shard; restart strategy broadcasts updated step-size/weight scalars to shards and copies restart solutions into each shard; compute_interaction_and_movement accepts owned-prefix sizes for per-shard reductions.
Convergence computation and solution gathering
cpp/src/pdlp/termination_strategy/convergence_information.hpp, cpp/src/pdlp/termination_strategy/convergence_information.cu, cpp/src/pdlp/termination_strategy/termination_strategy.hpp, cpp/src/pdlp/termination_strategy/termination_strategy.cu
Convergence information gains per-shard owned-prefix primal/dual objective partial computation, distributed residual/objective helpers with halo exchanges and NCCL allreduces, mutable objective getters, L2 norm buffer accessors, and reference-norm utilities; compute_convergence_information routes through distributed helpers when on master with per-shard partials and allreduce; termination strategy adds mutable convergence accessor and gathers shard solutions to master before returning.
Distributed solve entrypoints and CUDA graph disable flag
cpp/src/pdlp/solve.cuh, cpp/src/pdlp/solve.cu, cpp/src/pdlp/utilities/ping_pong_graph.cuh
New solve_lp_distributed_from_mps API is declared and implemented with distributed-only precondition validation, GPU auto-detection (resolve -1 sentinel to visible device count), placeholder-problem construction for master, maximization sign post-processing for returned duals/reduced costs, and solution-file writing; existing MPS solve path dispatches to it when use_distributed_pdlp is enabled; ping_pong_graph_t skips CUDA-graph capture when pdlp_graph_disabled_flag is set.
Distributed partition and parity validation tests
cpp/tests/linear_programming/pdlp_test.cu
Adds KaMinPar partition export/import round-trip test for AFIRO bipartite constraint–variable graph; adds distributed-vs-base parity helper that solves the same MPS in single-GPU and distributed modes, validating equal termination status, near-equal primal/dual objectives, step-count difference within 15%, and near-equal solution vectors; runs parity tests on AFIRO (with fixed-format parsing), neos3, and a2864.

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Suggested labels

improvement

Suggested reviewers

  • chris-maes
  • Kh4ster
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 4.90% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The PR implements multi-GPU PDLP using KaMinPar partitioning, achieves distributed SpMV operations, and enables solving large-scale problems exceeding single-GPU memory [#891].
Out of Scope Changes check ✅ Passed All changes focus on implementing distributed multi-GPU PDLP, related infrastructure (partitioning, scaling, synchronization), and supporting tests; no unrelated modifications detected.
Title check ✅ Passed The title clearly summarizes the main change: implementing multi-GPU PDLP.
Description check ✅ Passed The description is directly related to the multi-GPU PDLP implementation and usage changes.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 11

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
cpp/src/pdlp/solve.cu (1)

769-784: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Reject distributed problem_t calls before any early return.

The new guard sits below the zero-constraint return and the FP32 fallback. With use_distributed_pdlp=true plus SinglePrecision, this path returns run_pdlp_solver_in_fp32(...) instead of raising the intended validation error, so an unsupported distributed configuration silently runs the single-GPU solver.

Suggested fix
 static optimization_problem_solution_t<i_t, f_t> run_pdlp_solver(
   detail::problem_t<i_t, f_t>& problem,
   pdlp_solver_settings_t<i_t, f_t> const& settings,
   const timer_t& timer,
   bool is_batch_mode)
 {
+  cuopt_expects(!settings.hyper_params.use_distributed_pdlp,
+                error_type_t::ValidationError,
+                "Distributed PDLP must be entered via solve_lp(mps_data_model, ...) "
+                "so the master GPU never materializes the full problem. Call sites "
+                "with a problem_t cannot dispatch to distributed mode.");
+
   detail::pdlp_graph_disabled_flag().store(settings.hyper_params.pdlp_disable_graph,
                                            std::memory_order_relaxed);
 
   if (problem.n_constraints == 0) {
     ...
   }
 `#if` PDLP_INSTANTIATE_FLOAT || CUOPT_INSTANTIATE_FLOAT
   if constexpr (std::is_same_v<f_t, double>) {
     if (settings.pdlp_precision == pdlp_precision_t::SinglePrecision) {
       return run_pdlp_solver_in_fp32(problem, settings, timer, is_batch_mode);
     }
   }
 `#endif`
-  cuopt_expects(!settings.hyper_params.use_distributed_pdlp, ...);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@cpp/src/pdlp/solve.cu` around lines 769 - 784, The distributed-mode
validation (cuopt_expects(!settings.hyper_params.use_distributed_pdlp, ...))
must be performed before any early returns so a distributed call cannot
accidentally take the FP32 fallback or zero-constraint path; move or duplicate
that check to occur before the SinglePrecision/FP32 branch and before the
zero-constraint return so that when settings.hyper_params.use_distributed_pdlp
is true (for problem_t inputs) the function immediately raises the
ValidationError rather than calling run_pdlp_solver_in_fp32 or returning early.
Ensure the check references the same validation message and
error_type_t::ValidationError used currently.
cpp/src/pdlp/pdlp.cu (1)

3063-3079: ⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

The distributed average path is still unsafe in release builds.

When multi_gpu_engine is present and never_restart_to_average is false, Line 3071 uses plain assert(false). In release builds that disappears, and the subsequent raft::copy writes primal_size_h_/dual_size_h_ elements into unscaled_*_avg_solution_, which were never resized for the distributed ctor. That turns this TODO into an invalid device-copy / wrong-result path instead of a clean runtime rejection.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@cpp/src/pdlp/pdlp.cu` around lines 3063 - 3079, The path that handles
multi-GPU (multi_gpu_engine) uses assert(false) which vanishes in release builds
and leads to invalid device copies into unscaled_primal_avg_solution_ /
unscaled_dual_avg_solution_; fix by replacing the assert with a deterministic
runtime guard: either resize/allocate unscaled_primal_avg_solution_ and
unscaled_dual_avg_solution_ to primal_size_h_ and dual_size_h_ (and
synchronize/validate device pointers) before calling raft::copy from
pdhg_solver_.get_primal_solution() / get_dual_solution(), or explicitly fail
early by logging and throwing a runtime_error when multi_gpu_engine is true so
the copy is never attempted; update the branch around
internal_solver_iterations_ <= 1 where multi_gpu_engine is checked to implement
one of these safe behaviors.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@cpp/cuopt_cli.cpp`:
- Around line 180-184: When lp_settings.hyper_params.use_distributed_pdlp is
true, guard the distributed PDLP call by checking that handle_ptr is non-null
before invoking cuopt::linear_programming::solve_lp(handle_ptr.get(), ...); if
handle_ptr is null, fail fast with a clear error (e.g., log and exit or throw)
rather than calling the distributed overload; update the branch that currently
chooses between solve_lp(handle_ptr.get(), mps_data_model, lp_settings) and
solve_lp(problem_interface.get(), lp_settings) to validate handle_ptr first and
only call the distributed overload when handle_ptr is valid.
- Around line 439-447: The code currently computes requested_gpus and then uses
std::min(...) to compute provisioned_gpus and
memory_resources.reserve(provisioned_gpus) without validating requested_gpus;
add explicit validation after computing requested_gpus (and after remapping -1
when use_distributed_pdlp is true) to ensure requested_gpus > 0 and that
raft::device_setter::get_device_count() > 0 before calling std::min or reserve.
If either value is non-positive, return/log an error or throw an exception
(consistent with surrounding error handling) referencing the parameters obtained
via settings.get_parameter<int>(CUOPT_NUM_GPUS) and
settings.get_parameter<int>(CUOPT_DISTRIBUTED_PDLP_NUM_GPUS) so the code never
calls memory_resources.reserve with a non-positive size.

In `@cpp/src/pdlp/cusparse_view.cu`:
- Around line 501-511: The mixed-precision branch still sizes and recreates FP32
matrices using op_problem_scaled.nnz which can differ per shard; update that
block to use the shard-local nnz values (e.g. static_cast<int64_t>(A_.size())
and static_cast<int64_t>(A_T_.size())) when allocating/sizing A_mixed_ and
A_T_mixed_ and when copying/transposing data for A_T.create / A.create so you
don't overrun A_T_ or leave stale nnz metadata; ensure any metadata fields set
during the FP32 recreate follow the shard-local sizes and that all
transforms/read ranges use those local sizes (A_, A_T_, A_mixed_, A_T_mixed_).

In `@cpp/src/pdlp/distributed_pdlp/partition_loader.cu`:
- Around line 77-87: Validate partition and CSR metadata before any
slicing/indexing: check that parts.size() >= nb_cstr + nb_vars before creating
cstr_parts/var_parts, ensure all entries in parts are within [0, nb_parts)
before using them to index rank_data_t<i_t,f_t>, and verify CSR arrays
(offsets/indices) have expected lengths (e.g., offsets.size() >= rows+1 and
indices.size() == nnz) before dereferencing in functions that build/iterate the
CSR (referencing variables parts, nb_cstr, nb_vars, rank_data_t, and the CSR
offset/index containers); use cuopt_expects (or the existing error path) to fail
early with clear messages when any check fails.

In `@cpp/src/pdlp/pdlp.cu`:
- Around line 821-825: The distributed gather of the current iterate is missing
on several return paths so master buffers can be stale; call the multi-GPU
gather before any return that serializes the current solution. Specifically,
ensure pdhg_solver_.get_mgpu_engine() and its method
gather_potential_next_solutions_to_master(pdhg_solver_,
current_termination_strategy_.get_convergence_information().get_reduced_cost())
is invoked centrally before any code that calls
fill_return_problem_solution(...), and add the same centralized gather call on
the other identified return sites (including the ConcurrentLimit and
PrimalFeasible/infeasibility exits referenced around lines ~859-863 and
~1541-1545) so the master full-size solution/reduced-cost buffers are populated
on every distributed return path.
- Around line 387-393: The distributed constructor pdlp_solver_t( problem_t<i_t,
f_t>& placeholder_problem, ... ) currently delegates to the regular ctor before
shard sizes exist, causing functions that use primal_size_h_/dual_size_h_ (e.g.,
set_initial_primal_solution, handling of initial_primal_solution and
initial_dual_solution and warm-start data) to operate on zero-length buffers;
update this constructor to either (a) validate and reject any initial-state
options (initial_primal_solution, initial_dual_solution, warm-start) up front
and return an error, or (b) defer all logic that applies initial iterates (calls
to set_initial_primal_solution / set_initial_dual_solution and warm-start
handling) until after shard construction when primal_size_h_ and dual_size_h_
are set, ensuring no modulo/divide-by-zero or zero-length copies occur.

In `@cpp/src/pdlp/solve.cu`:
- Around line 759-760: The global flag detail::pdlp_graph_disabled_flag() is
being mutated per-solve causing races; instead make the graph-disable decision
local to each solver instance and avoid writing the process-global flag from
solve entrypoints. Change callers that currently
store(settings.hyper_params.pdlp_disable_graph, ...) to pass the
pdlp_disable_graph boolean into the solver instance (or ctor) and have
ping_pong_graph_t::run() and related graph code read that instance-level flag
rather than detail::pdlp_graph_disabled_flag(); remove writes to the global flag
in solve functions so concurrent solves do not flip each other’s mode.
- Around line 2129-2134: The current overload erroneously hard-fails via
cuopt_expects when settings.hyper_params.use_distributed_pdlp is false and
always forwards to solve_lp_distributed_from_mps, removing the original
single-GPU/direct-MPS path; restore the prior behavior by replacing the
hard-fail with a branch: if settings.hyper_params.use_distributed_pdlp is true
call solve_lp_distributed_from_mps(handle_ptr, mps_data_model, settings,
problem_checking, use_pdlp_solver_mode) else call the non-distributed/MPS
entrypoint (the original direct-MPS function used previously—e.g.,
solve_lp_from_mps or the equivalent direct-MPS routine) so both paths are
supported, and keep or adjust cuopt_expects to validate only unsupported
parameter combinations if needed.
- Around line 2157-2205: solve_lp_distributed_from_mps builds
detail::pdlp_solver_t using settings_resolved but never applies settings.method
or calls set_pdlp_solver_mode, so requested PDLP modes/presets are ignored; fix
by checking settings_resolved.use_pdlp_solver_mode (and/or
settings_resolved.method) before constructing the solver and call
set_pdlp_solver_mode(settings_resolved) to map the preset/method into the solver
settings (or apply the mapping to settings_resolved) so the subsequent
detail::pdlp_solver_t(placeholder_problem, mps_data_model, settings_resolved) is
constructed with the intended PDLP mode.

In `@cpp/tests/linear_programming/pdlp_test.cu`:
- Around line 188-191: The test currently sets distributed_pdlp_num_gpus = -1
which lets a single-GPU run bypass the multi-GPU/NCCL path; change the test to
first query the available GPU count and if fewer than 2 GPUs are present skip
the test, otherwise set pdlp_solver_settings_t::distributed_pdlp_num_gpus to at
least 2 (e.g., max(2, available_gpus)) before calling solve_lp(&handle, problem,
dist_settings) so the distributed PDLP path is actually exercised (use
pdlp_solver_settings_t, dist_settings, distributed_pdlp_num_gpus and solve_lp as
the loci to modify).
- Around line 248-252: The test pdlp_class::distributed_parity_square41 is
loading the wrong dataset; change the argument to
expect_distributed_matches_base in that test so it points to
"linear_programming/square41/square41.mps" instead of
"linear_programming/neos3/neos3.mps" so the regression covers the intended
square41 case (update the call site in the distributed_parity_square41 test that
invokes expect_distributed_matches_base).

---

Outside diff comments:
In `@cpp/src/pdlp/pdlp.cu`:
- Around line 3063-3079: The path that handles multi-GPU (multi_gpu_engine) uses
assert(false) which vanishes in release builds and leads to invalid device
copies into unscaled_primal_avg_solution_ / unscaled_dual_avg_solution_; fix by
replacing the assert with a deterministic runtime guard: either resize/allocate
unscaled_primal_avg_solution_ and unscaled_dual_avg_solution_ to primal_size_h_
and dual_size_h_ (and synchronize/validate device pointers) before calling
raft::copy from pdhg_solver_.get_primal_solution() / get_dual_solution(), or
explicitly fail early by logging and throwing a runtime_error when
multi_gpu_engine is true so the copy is never attempted; update the branch
around internal_solver_iterations_ <= 1 where multi_gpu_engine is checked to
implement one of these safe behaviors.

In `@cpp/src/pdlp/solve.cu`:
- Around line 769-784: The distributed-mode validation
(cuopt_expects(!settings.hyper_params.use_distributed_pdlp, ...)) must be
performed before any early returns so a distributed call cannot accidentally
take the FP32 fallback or zero-constraint path; move or duplicate that check to
occur before the SinglePrecision/FP32 branch and before the zero-constraint
return so that when settings.hyper_params.use_distributed_pdlp is true (for
problem_t inputs) the function immediately raises the ValidationError rather
than calling run_pdlp_solver_in_fp32 or returning early. Ensure the check
references the same validation message and error_type_t::ValidationError used
currently.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 7df2a4b9-585b-4517-afcb-1aa089ecb1c1

📥 Commits

Reviewing files that changed from the base of the PR and between d6d6f9e and 91b1ae5.

📒 Files selected for processing (41)
  • cpp/CMakeLists.txt
  • cpp/cmake/thirdparty/get_kaminpar.cmake
  • cpp/cuopt_cli.cpp
  • cpp/include/cuopt/linear_programming/constants.h
  • cpp/include/cuopt/linear_programming/pdlp/pdlp_hyper_params.cuh
  • cpp/include/cuopt/linear_programming/pdlp/solver_settings.hpp
  • cpp/src/math_optimization/solver_settings.cu
  • cpp/src/pdlp/CMakeLists.txt
  • cpp/src/pdlp/cusparse_view.cu
  • cpp/src/pdlp/distributed_pdlp/kaminpar_partitioner.cpp
  • cpp/src/pdlp/distributed_pdlp/kaminpar_partitioner.hpp
  • cpp/src/pdlp/distributed_pdlp/metis_partitioner.cu
  • cpp/src/pdlp/distributed_pdlp/metis_partitioner.hpp
  • cpp/src/pdlp/distributed_pdlp/multi_gpu_engine.cu
  • cpp/src/pdlp/distributed_pdlp/multi_gpu_engine.hpp
  • cpp/src/pdlp/distributed_pdlp/partition_loader.cu
  • cpp/src/pdlp/distributed_pdlp/partition_loader.hpp
  • cpp/src/pdlp/distributed_pdlp/partitioner.cu
  • cpp/src/pdlp/distributed_pdlp/partitioner.hpp
  • cpp/src/pdlp/distributed_pdlp/rank_data.hpp
  • cpp/src/pdlp/distributed_pdlp/shard.cu
  • cpp/src/pdlp/distributed_pdlp/shard.hpp
  • cpp/src/pdlp/initial_scaling_strategy/initial_scaling.cu
  • cpp/src/pdlp/initial_scaling_strategy/initial_scaling.cuh
  • cpp/src/pdlp/pdhg.cu
  • cpp/src/pdlp/pdhg.hpp
  • cpp/src/pdlp/pdlp.cu
  • cpp/src/pdlp/pdlp.cuh
  • cpp/src/pdlp/restart_strategy/pdlp_restart_strategy.cu
  • cpp/src/pdlp/saddle_point.cu
  • cpp/src/pdlp/solve.cu
  • cpp/src/pdlp/solve.cuh
  • cpp/src/pdlp/step_size_strategy/adaptive_step_size_strategy.cu
  • cpp/src/pdlp/step_size_strategy/adaptive_step_size_strategy.hpp
  • cpp/src/pdlp/termination_strategy/convergence_information.cu
  • cpp/src/pdlp/termination_strategy/convergence_information.hpp
  • cpp/src/pdlp/termination_strategy/termination_strategy.cu
  • cpp/src/pdlp/termination_strategy/termination_strategy.hpp
  • cpp/src/pdlp/utilities/mgpu_trace.cuh
  • cpp/src/pdlp/utilities/ping_pong_graph.cuh
  • cpp/tests/linear_programming/pdlp_test.cu

Comment thread cpp/cuopt_cli.cpp Outdated
Comment thread cpp/cuopt_cli.cpp Outdated
Comment thread cpp/src/pdlp/cusparse_view.cu
Comment thread cpp/src/pdlp/distributed_pdlp/partition_loader.cu Outdated
Comment thread cpp/src/pdlp/pdlp.cu
Comment thread cpp/src/pdlp/solve.cu Outdated
Comment thread cpp/src/pdlp/solve.cu Outdated
Comment thread cpp/src/pdlp/solve.cu
Comment thread cpp/tests/linear_programming/pdlp_test.cu Outdated
Comment thread cpp/tests/linear_programming/pdlp_test.cu Outdated
@ramakrishnap-nv
ramakrishnap-nv marked this pull request as draft June 8, 2026 15:27
@Bubullzz

Copy link
Copy Markdown
Contributor Author

/ok to test 818ffcd

@Bubullzz

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 12, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@Bubullzz

Copy link
Copy Markdown
Contributor Author

/ok to test f3b6343

1 similar comment
@Bubullzz

Copy link
Copy Markdown
Contributor Author

/ok to test f3b6343

@copy-pr-bot

copy-pr-bot Bot commented Jun 12, 2026

Copy link
Copy Markdown

/ok to test f3b6343

@Bubullzz, there was an error processing your request: E2

See the following link for more information: https://docs.gha-runners.nvidia.com/cpr/e/2/

@Bubullzz

Copy link
Copy Markdown
Contributor Author

/ok to test 5c74a4d

@Bubullzz

Copy link
Copy Markdown
Contributor Author

/ok to merge e9cad7a

@Bubullzz

Copy link
Copy Markdown
Contributor Author

/ok to test e9cad7a

@Bubullzz

Copy link
Copy Markdown
Contributor Author

/ok to test 12edf2d

@Bubullzz

Copy link
Copy Markdown
Contributor Author

/ok to test f5ac616

@Bubullzz

Copy link
Copy Markdown
Contributor Author

/ok to test 12edf2d

@copy-pr-bot

copy-pr-bot Bot commented Jun 15, 2026

Copy link
Copy Markdown

/ok to test 12edf2d

@Bubullzz, there was an error processing your request: E2

See the following link for more information: https://docs.gha-runners.nvidia.com/cpr/e/2/

@Bubullzz

Copy link
Copy Markdown
Contributor Author

/ok to test 40f7cf5

@Bubullzz

Copy link
Copy Markdown
Contributor Author

/ok to test c4565d1

@Bubullzz

Copy link
Copy Markdown
Contributor Author

/ok to test cfbb27a

@Bubullzz

Copy link
Copy Markdown
Contributor Author

/ok to test 7917f66

@Bubullzz

Copy link
Copy Markdown
Contributor Author

/ok to test d65fca5

@Bubullzz

Copy link
Copy Markdown
Contributor Author

https://github.com/coderabbitai review

@Bubullzz

Copy link
Copy Markdown
Contributor Author

/ok to test 3803f4b

@ramakrishnap-nv ramakrishnap-nv left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Minor request, rest looks good.

Comment thread ci/validate_wheel.sh Outdated
if [[ "${RAPIDS_CUDA_MAJOR}" == "12" ]]; then
PYDISTCHECK_ARGS+=(
--max-allowed-size-compressed '690Mi'
--max-allowed-size-compressed '960Mi'

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

@Bubullzz you would need to reset this back to what they were since we have removed the nccl

@Bubullzz

Copy link
Copy Markdown
Contributor Author

/ok to test 92dccd2

@Bubullzz

Copy link
Copy Markdown
Contributor Author

/ok to test f6dcf4d

@Bubullzz

Copy link
Copy Markdown
Contributor Author

/ok to test bea7f05

@Bubullzz

Copy link
Copy Markdown
Contributor Author

/ok to test b7fef0a

@Bubullzz

Copy link
Copy Markdown
Contributor Author

/ok to test 3f22e81

@Bubullzz

Copy link
Copy Markdown
Contributor Author

/ok to test 45426df

@Bubullzz

Copy link
Copy Markdown
Contributor Author

/ok to test 3bf5310

@Bubullzz

Copy link
Copy Markdown
Contributor Author

/ok to test a9d8e62

@Bubullzz

Copy link
Copy Markdown
Contributor Author

/merge

@Bubullzz

Copy link
Copy Markdown
Contributor Author

/ok to test 133e7ba

@Bubullzz

Copy link
Copy Markdown
Contributor Author

/ok to test f63edcf

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature request New feature or request non-breaking Introduces a non-breaking change pdlp

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEA] Multi GPU PDLP

8 participants