Replaced cusparse wrappers with simple unique_ptrs and more RAII #1342
Replaced cusparse wrappers with simple unique_ptrs and more RAII #1342Bubullzz wants to merge 8 commits into
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Enterprise Run ID: 📒 Files selected for processing (2)
💤 Files with no reviewable changes (1)
🚧 Files skipped from review as they are similar to previous changes (1)
📝 WalkthroughWalkthroughRefactors cuSPARSE descriptor lifetime: introduces owning RAII types and non-owning descriptor views with factory helpers, rebuilds constructors and factories to create RAII descriptors, and updates all cuSPARSE buffer-size/preprocess/compute call sites to pass descriptor pointers via .get(). ChangescuSPARSE Descriptor RAII Migration
Estimated code review effort🎯 4 (Complex) | ⏱️ ~75 minutes 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
cpp/src/pdlp/cusparse_view.cu (1)
240-242:⚠️ Potential issue | 🟠 Major | ⚡ Quick winMissing
has_value()check before dereferencing optional.
funcat line 242 is dereferenced without checking if the dlsym lookup succeeded.Proposed fix
void cusparse_spmvop_run(cusparseHandle_t handle, cusparseSpMVOpPlan_t plan, const void* alpha, const void* beta, cusparse_dn_vec_descr_view vecX, cusparse_dn_vec_descr_view vecY, cusparse_dn_vec_descr_view vecZ, cudaStream_t stream) { static const auto func = dynamic_load_runtime::function<cusparseSpMVOp_sig>("cusparseSpMVOp"); + cuopt_expects(func.has_value(), "cusparseSpMVOp symbol not found at runtime"); RAFT_CUSPARSE_TRY(cusparseSetStream(handle, stream)); RAFT_CUSPARSE_TRY((*func)(handle, plan, alpha, beta, vecX, vecY, vecZ)); }🤖 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/cusparse_view.cu` around lines 240 - 242, The code dereferences the optional dynamic_load_runtime::function<cusparseSpMVOp_sig> named func without checking it; before calling (*func)(handle, plan, alpha, beta, vecX, vecY, vecZ) add a check like if (!func.has_value()) and handle the failure (log or return an error/throw) with a clear message including the symbol name "cusparseSpMVOp"; keep the existing RAFT_CUSPARSE_TRY usage for actual cuSPARSE calls and ensure the early error path prevents the dereference of func and returns/propagates an appropriate error.
🧹 Nitpick comments (2)
cpp/src/pdlp/cusparse_view.hpp (1)
38-57: 💤 Low valueConsider
_tsuffix for deleter types per project naming conventions.The coding guidelines specify types/structs should use
snake_case_twith_tsuffix (e.g.,cusparse_sp_mat_deleter_t). However, the current naming follows common STL deleter patterns, so this is a stylistic choice.🤖 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/cusparse_view.hpp` around lines 38 - 57, The structs cusparse_sp_mat_deleter, cusparse_dn_vec_deleter, and cusparse_dn_mat_deleter do not follow the project naming convention requiring a snake_case_t suffix; rename them to cusparse_sp_mat_deleter_t, cusparse_dn_vec_deleter_t, and cusparse_dn_mat_deleter_t respectively, update all uses/typedefs/usings in this compilation unit and any headers that reference these types (e.g., unique_ptr deleter specializations or variable declarations), and ensure the operator() implementations remain unchanged and still call RAFT_CUSPARSE_TRY_NO_THROW on cusparseDestroySpMat/cusparseDestroyDnVec/cusparseDestroyDnMat.cpp/src/pdlp/cusparse_view.cu (1)
147-149: 💤 Low valueInconsistent error-checking macro.
Line 147 uses
CUSPARSE_CHECKwhile other cuSPARSE calls in this file useRAFT_CUSPARSE_TRY. Consider usingRAFT_CUSPARSE_TRYfor consistency.🤖 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/cusparse_view.cu` around lines 147 - 149, Replace the inconsistent CUSPARSE_CHECK call with the RAFT_CUSPARSE_TRY macro to match the rest of the file: change the call to cusparseSetStream(...) so it is wrapped with RAFT_CUSPARSE_TRY rather than CUSPARSE_CHECK, keeping the same arguments and preserving the subsequent RAFT_CUSPARSE_TRY(cusparseSpMM_preprocess(...)) call; ensure you reference and use the RAFT_CUSPARSE_TRY macro for both cusparseSetStream and cusparseSpMM_preprocess to maintain consistent error handling.
🤖 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/src/pdlp/cusparse_view.cu`:
- Around line 213-218: The code dereferences the optional dynamic loader result
fn (dynamic_load_runtime::function<cusparseSpMVOp_createDescr_sig>) without
checking presence; update the factory that creates the cusparseSpMVOp_descr (the
block that calls (*fn)(...)) to first test fn.has_value() (or if(!fn) branch)
and handle the missing symbol by returning an empty cusparse_spmvop_descr_uptr
(or otherwise propagate a clear error) instead of dereferencing; ensure the
handling is applied where cusparseSpMVOp_createDescr is invoked so callers of
is_cusparse_runtime_spmvop_supported() are not assumed sufficient.
- Around line 221-228: The dynamic loader result `fn` in make_spmvop_plan is
dereferenced without checking it exists; update make_spmvop_plan to test
dynamic_load_runtime::function<...> fn for presence (e.g., if (!fn) throw or
return an error) before calling (*fn)(...), mirroring the fix used in
make_spmvop_descr so that cusparseSpMVOp_createPlan is only invoked when the
symbol lookup succeeded and RAFT_CUSPARSE_TRY is reached with a valid function
pointer.
---
Outside diff comments:
In `@cpp/src/pdlp/cusparse_view.cu`:
- Around line 240-242: The code dereferences the optional
dynamic_load_runtime::function<cusparseSpMVOp_sig> named func without checking
it; before calling (*func)(handle, plan, alpha, beta, vecX, vecY, vecZ) add a
check like if (!func.has_value()) and handle the failure (log or return an
error/throw) with a clear message including the symbol name "cusparseSpMVOp";
keep the existing RAFT_CUSPARSE_TRY usage for actual cuSPARSE calls and ensure
the early error path prevents the dereference of func and returns/propagates an
appropriate error.
---
Nitpick comments:
In `@cpp/src/pdlp/cusparse_view.cu`:
- Around line 147-149: Replace the inconsistent CUSPARSE_CHECK call with the
RAFT_CUSPARSE_TRY macro to match the rest of the file: change the call to
cusparseSetStream(...) so it is wrapped with RAFT_CUSPARSE_TRY rather than
CUSPARSE_CHECK, keeping the same arguments and preserving the subsequent
RAFT_CUSPARSE_TRY(cusparseSpMM_preprocess(...)) call; ensure you reference and
use the RAFT_CUSPARSE_TRY macro for both cusparseSetStream and
cusparseSpMM_preprocess to maintain consistent error handling.
In `@cpp/src/pdlp/cusparse_view.hpp`:
- Around line 38-57: The structs cusparse_sp_mat_deleter,
cusparse_dn_vec_deleter, and cusparse_dn_mat_deleter do not follow the project
naming convention requiring a snake_case_t suffix; rename them to
cusparse_sp_mat_deleter_t, cusparse_dn_vec_deleter_t, and
cusparse_dn_mat_deleter_t respectively, update all uses/typedefs/usings in this
compilation unit and any headers that reference these types (e.g., unique_ptr
deleter specializations or variable declarations), and ensure the operator()
implementations remain unchanged and still call RAFT_CUSPARSE_TRY_NO_THROW on
cusparseDestroySpMat/cusparseDestroyDnVec/cusparseDestroyDnMat.
🪄 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: 43105512-0a29-4bb5-b0f5-b5cd32da0e79
📒 Files selected for processing (5)
cpp/src/barrier/barrier.cucpp/src/barrier/cusparse_info.hppcpp/src/barrier/cusparse_view.cucpp/src/pdlp/cusparse_view.cucpp/src/pdlp/cusparse_view.hpp
I love the clean up effort! Leaving the review for the experts. |
|
🔔 Hi @anandhkb, this pull request has had no activity for 7 days. Please update or let us know if it can be closed. Thank you! If this is an "epic" issue, then please add the "epic" label to this issue. |
|
/ok to test 036469d |
|
/ok to test 520218a |
The idea is to replace the big handmade wrappers for cusparse objects with more robust std::unique_ptr
Trying to clean the code a bit as a side task while waiting for other jobs to finish. This is a subset of the full PR to get feedback from the team before going forward.