Skip to content

Commit b202137

Browse files
committed
Merge branch 'main' into moat-port
2 parents c39974c + 8599563 commit b202137

5 files changed

Lines changed: 44 additions & 26 deletions

File tree

CMakeLists.txt

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,25 @@ option(USE_HIP "Build with HIP for AMD GPUs" OFF)
1010
if(USE_HIP)
1111
project(cupdlpx LANGUAGES C CXX HIP)
1212
else()
13-
project(cupdlpx LANGUAGES C CXX CUDA)
13+
project(cupdlpx LANGUAGES C CXX)
14+
15+
# Default CUDA architectures: SASS for every current arch, PTX only for the newest one as a forward-compat fallback.
16+
find_package(CUDAToolkit REQUIRED)
17+
if(NOT DEFINED CMAKE_CUDA_ARCHITECTURES AND NOT DEFINED ENV{CUDAARCHS})
18+
if(CUDAToolkit_VERSION VERSION_GREATER_EQUAL 13)
19+
set(CMAKE_CUDA_ARCHITECTURES 75-real 80-real 86-real 89-real 90-real
20+
100-real 120-real 120-virtual)
21+
elseif(CUDAToolkit_VERSION VERSION_GREATER_EQUAL 12.8)
22+
set(CMAKE_CUDA_ARCHITECTURES 60-real 70-real 75-real 80-real 86-real
23+
89-real 90-real 100-real 120-real 120-virtual)
24+
else()
25+
set(CMAKE_CUDA_ARCHITECTURES 60-real 70-real 75-real 80-real 86-real
26+
89-real 90-real 90-virtual)
27+
endif()
28+
endif()
29+
30+
enable_language(CUDA)
31+
message(STATUS "CUDA architectures: ${CMAKE_CUDA_ARCHITECTURES}")
1432
endif()
1533

1634
set(CUPDLPX_VERSION_MAJOR 0)
@@ -45,10 +63,6 @@ if(USE_HIP)
4563
if(NOT DEFINED CMAKE_HIP_ARCHITECTURES OR CMAKE_HIP_ARCHITECTURES STREQUAL "")
4664
set(CMAKE_HIP_ARCHITECTURES "gfx90a")
4765
endif()
48-
else()
49-
if(NOT DEFINED CMAKE_CUDA_ARCHITECTURES)
50-
set(CMAKE_CUDA_ARCHITECTURES 60 70 75 80 86 89 90)
51-
endif()
5266
endif()
5367

5468
# -----------------------------------------------------------------------------
@@ -112,8 +126,6 @@ if(USE_HIP)
112126
find_package(hipsparse REQUIRED)
113127
find_package(hipcub REQUIRED)
114128
find_package(rocprim REQUIRED)
115-
else()
116-
find_package(CUDAToolkit REQUIRED)
117129
endif()
118130
include(FetchContent)
119131

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ Our work is presented in two papers:
3030
* **Build Tools:** CMake (≥ 3.20), GCC, and NVCC (CUDA) or hipcc (ROCm).
3131

3232
> **SpMV backend** is selected automatically at compile time based on cuSPARSE version:
33-
> - `cusparseSpMV` — CUDA 12.4 – 13.1 (cuSPARSE < 12.7.3)
34-
> - `cusparseSpMVOp` — CUDA 13.1 Update 1+ (cuSPARSE ≥ 12.7.3)
33+
> - `cusparseSpMV` — CUDA 12.4 – 13.2 (cuSPARSE < 12.8.1)
34+
> - `cusparseSpMVOp` — CUDA 13.3+ (cuSPARSE ≥ 12.8.1)
3535
>
3636
> On AMD GPUs the solver uses the `hipsparseSpMV` backend via hipSPARSE.
3737

internal/cusparse_compat.h

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,11 @@ typedef void *cusparseSpMVOpPlan_t;
1515
#include <cusparse.h>
1616

1717
// cusparseSpMVOp_bufferSize was introduced in cuSPARSE 12.7.3 (CUDA 13.1 Update 1).
18+
// cuSPARSE 12.8.1 (CUDA 13.3.0) introduced the SpMVOp ALG1/ALG2 algorithms and
19+
// added a cusparseSpMVOpAlg_t parameter to cusparseSpMVOp_bufferSize/createDescr.
1820
// CUSPARSE_VERSION encoding: major*1000 + minor*100 + patch.
19-
#if defined(CUSPARSE_VERSION) && CUSPARSE_VERSION >= 12703
21+
#if defined(CUSPARSE_VERSION) && CUSPARSE_VERSION >= 12801
2022
#define CUPDLPX_HAS_SPMVOP 1
2123
#else
2224
#define CUPDLPX_HAS_SPMVOP 0
2325
#endif
24-
25-
#if !CUPDLPX_HAS_SPMVOP
26-
// The SpMVOp types were added to cusparse.h before the functions
27-
// (e.g. CUDA 13.1 base has the types but not the functions).
28-
// Only provide fallback typedefs for cuSPARSE versions that lack them entirely.
29-
#if !defined(CUSPARSE_VERSION) || CUSPARSE_VERSION < 12700
30-
typedef void *cusparseSpMVOpDescr_t;
31-
typedef void *cusparseSpMVOpPlan_t;
32-
#endif
33-
#endif
34-
35-
#endif // USE_HIP

src/mps_parser.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,7 @@ lp_problem_t *read_mps_file(const char *filename)
408408
if (!reader)
409409
{
410410
fprintf(stderr, "ERROR: Could not open file %s\n", filename);
411+
return NULL;
411412
}
412413

413414
namemap_init(&state.row_map, 1024);

src/spmv_backend.cu

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,15 @@ void cupdlpx_spmv_buffer_size(cusparseHandle_t sparse_handle,
4747
size_t *buffer_size)
4848
{
4949
#if CUPDLPX_HAS_SPMVOP
50-
CUSPARSE_CHECK(cusparseSpMVOp_bufferSize(
51-
sparse_handle, CUSPARSE_OPERATION_NON_TRANSPOSE, mat, vec_x, vec_y, vec_y, CUDA_R_64F, buffer_size));
50+
CUSPARSE_CHECK(cusparseSpMVOp_bufferSize(sparse_handle,
51+
CUSPARSE_OPERATION_NON_TRANSPOSE,
52+
mat,
53+
vec_x,
54+
vec_y,
55+
vec_y,
56+
CUDA_R_64F,
57+
CUSPARSE_SPMVOP_ALG2,
58+
buffer_size));
5259
#else
5360
CUSPARSE_CHECK(cusparseSpMV_bufferSize(sparse_handle,
5461
CUSPARSE_OPERATION_NON_TRANSPOSE,
@@ -74,8 +81,16 @@ void cupdlpx_spmv_prepare(cusparseHandle_t sparse_handle,
7481
#if CUPDLPX_HAS_SPMVOP
7582
cusparseSpMVOpDescr_t local_descr = NULL;
7683
cusparseSpMVOpPlan_t local_plan = NULL;
77-
CUSPARSE_CHECK(cusparseSpMVOp_createDescr(
78-
sparse_handle, &local_descr, CUSPARSE_OPERATION_NON_TRANSPOSE, mat, vec_x, vec_y, vec_y, CUDA_R_64F, buffer));
84+
CUSPARSE_CHECK(cusparseSpMVOp_createDescr(sparse_handle,
85+
&local_descr,
86+
CUSPARSE_OPERATION_NON_TRANSPOSE,
87+
mat,
88+
vec_x,
89+
vec_y,
90+
vec_y,
91+
CUDA_R_64F,
92+
CUSPARSE_SPMVOP_ALG2,
93+
buffer));
7994
CUSPARSE_CHECK(cusparseSpMVOp_createPlan(sparse_handle, local_descr, &local_plan, NULL, 0));
8095
*descr = (void *)local_descr;
8196
*plan = (void *)local_plan;

0 commit comments

Comments
 (0)