Skip to content

Commit 828db06

Browse files
wperkinsAbhyankar, Shrirang G
and
Abhyankar, Shrirang G
authored
OPFLOW with RAJA/HIOP sparse GPU solvers (#8)
* OPFLOW: initial implementation of RAJA/HiOp sparse GPU-based solver WIP - HIOP Sparse solver with GPU model OPFLOW: Started work on support for HIOP sparse solver interface for GPUs. Added a copy of hiop sparse solver interface. OPFLOW: Added model skeleton for GPU sparse version (copying from pbpolrajahiop) Fixed build Did some copy paste to add a test for HIOPSPARSE. This test is not actually functional yet. Started updating the hiopsparse model and solver code. More work on updating the solver and model Added scalar and vector unit tests for model to be used with HIOP sparse solver on GPU Apply cmake lint Fix unit tests. Set the size of array when using Umpire memset. Code formatting Some minor changes to get PBPOLRAJAHIOPSPARSE model code to compile Separate BUS/LINE/GEN/.../Param structs into reusable module Minor edit Rename files Fix typo Use BUS/LINE/GEN/.../Param structs in Raja HiOp Sparse model (compiles) Updating HIOP sparse solver GPU API Completed bounds kernels Completed scalar and vector functions WIP - HIOP Sparse solver with GPU model OPFLOW: Started work on support for HIOP sparse solver interface for GPUs. Added a copy of hiop sparse solver interface. OPFLOW: Added model skeleton for GPU sparse version (copying from pbpolrajahiop) Fixed build Did some copy paste to add a test for HIOPSPARSE. This test is not actually functional yet. Started updating the hiopsparse model and solver code. More work on updating the solver and model Added scalar and vector unit tests for model to be used with HIOP sparse solver on GPU Apply cmake lint Fix unit tests. Set the size of array when using Umpire memset. Code formatting Rename files Use BUS/LINE/GEN/.../Param structs in Raja HiOp Sparse model (compiles) Updating HIOP sparse solver GPU API Completed bounds kernels Jacobian and Hessian for sparse model (CPU --> GPU copy) Use correct array lengths in Eq. Jacobian Fix bug in Jacobian. Fix unused variable/parameter errors OPFLOW: rework solution callback for RAJA/HIOP GPU-based solver Formatting changes * Add unit test for RAJA/HiOp Sparse GPU model (9-bus only) * Apply pre-commmit fixes * Add test for 200-bus case * Apply pre-commmit fixes --------- Co-authored-by: Abhyankar, Shrirang G <[email protected]>
1 parent 13ef94e commit 828db06

21 files changed

+3166
-1027
lines changed

include/common.h

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#define COMMON_H
88

99
#include <petsc.h>
10+
#include <exago_config.h>
1011

1112
typedef enum { MATPOWER, CSV, JSON, MINIMAL } OutputFormat;
1213

include/opflow.h

+2
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@
1616
#define OPFLOWMODEL_PBPOLHIOP "POWER_BALANCE_HIOP"
1717
#define OPFLOWMODEL_PBPOLRAJAHIOP "PBPOLRAJAHIOP"
1818
#define OPFLOWMODEL_DCOPF "DCOPF"
19+
#define OPFLOWMODEL_PBPOLRAJAHIOPSPARSE "PBPOLRAJAHIOPSPARSE"
1920

2021
/* Solvers */
2122
#define OPFLOWSOLVER_IPOPT "IPOPT"
2223
#define OPFLOWSOLVER_HIOP "HIOP"
2324
#define OPFLOWSOLVER_HIOPSPARSE "HIOPSPARSE"
25+
#define OPFLOWSOLVER_HIOPSPARSEGPU "HIOPSPARSEGPU"
2426

2527
typedef struct _p_OPFLOW *OPFLOW;
2628

src/opflow/CMakeLists.txt

+16-5
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,22 @@ set(OPFLOW_FORM_SRC
1111

1212
# Build RAJA/Umpire modules if RAJA and Umpire are enabled
1313
if(EXAGO_ENABLE_RAJA)
14-
set(OPFLOW_FORM_SRC ${OPFLOW_FORM_SRC} model/power_bal_hiop/pbpolrajahiop.cpp
15-
model/power_bal_hiop/pbpolrajahiopkernels.cpp
14+
set(OPFLOW_FORM_SRC
15+
${OPFLOW_FORM_SRC} model/power_bal_hiop/pbpolrajahiop.cpp
16+
model/power_bal_hiop/pbpolrajahiopkernels.cpp
17+
model/power_bal_hiop/paramsrajahiop.cpp
1618
)
19+
if(EXAGO_ENABLE_HIOP_SPARSE)
20+
set(OPFLOW_FORM_SRC
21+
${OPFLOW_FORM_SRC} model/power_bal_hiop/pbpolrajahiopsparse.cpp
22+
model/power_bal_hiop/pbpolrajahiopsparsekernels.cpp
23+
)
24+
endif()
1725
endif()
1826

19-
set(OPFLOW_SOLVER_SRC solver/ipopt/opflow_ipopt.cpp solver/hiop/opflow_hiop.cpp
20-
solver/hiop/opflow_hiopsparse.cpp
27+
set(OPFLOW_SOLVER_SRC
28+
solver/ipopt/opflow_ipopt.cpp solver/hiop/opflow_hiop.cpp
29+
solver/hiop/opflow_hiopsparse.cpp solver/hiop/opflow_hiopsparsegpu.cpp
2130
)
2231

2332
set(OPFLOW_SRC
@@ -29,7 +38,9 @@ set_source_files_properties(${OPFLOW_SRC} PROPERTIES LANGUAGE CXX)
2938

3039
if(EXAGO_ENABLE_RAJA AND EXAGO_ENABLE_CUDA)
3140
set_source_files_properties(
32-
model/power_bal_hiop/pbpolrajahiopkernels.cpp PROPERTIES LANGUAGE CUDA
41+
model/power_bal_hiop/pbpolrajahiopkernels.cpp
42+
model/power_bal_hiop/pbpolrajahiopsparsekernels.cpp PROPERTIES LANGUAGE
43+
CUDA
3344
)
3445
endif()
3546

src/opflow/interface/opflow.cpp

+18-5
Original file line numberDiff line numberDiff line change
@@ -3008,6 +3008,11 @@ PetscErrorCode OPFLOWCheckModelSolverCompatibility(OPFLOW opflow) {
30083008
#else
30093009
PetscBool rajahiop_pbpol = PETSC_FALSE;
30103010
#endif // RAJA
3011+
if (hiop && !(hiop_pbpol || rajahiop_pbpol)) {
3012+
SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP,
3013+
"OPFLOW solver HIOP incompatible with model %s",
3014+
(opflow->modelname).c_str());
3015+
}
30113016
#if defined(EXAGO_ENABLE_HIOP_SPARSE)
30123017
PetscBool hiop_sparse;
30133018
PetscBool hiop_sparse_pbpol;
@@ -3022,14 +3027,22 @@ PetscErrorCode OPFLOWCheckModelSolverCompatibility(OPFLOW opflow) {
30223027
"OPFLOW solver HIOPSPARSE incompatible with model %s",
30233028
(opflow->modelname).c_str());
30243029
}
3025-
#else
3026-
PetscBool hiop_sparse = PETSC_FALSE;
3027-
#endif // HIOP_SPARSE
3028-
if ((hiop && !hiop_sparse) && !(hiop_pbpol || rajahiop_pbpol)) {
3030+
#if defined(EXAGO_ENABLE_RAJA)
3031+
PetscBool hiop_sparsegpu;
3032+
PetscBool pbpolrajahiopsparse;
3033+
3034+
hiop_sparsegpu =
3035+
static_cast<PetscBool>(opflow->solvername == OPFLOWSOLVER_HIOPSPARSEGPU);
3036+
pbpolrajahiopsparse = static_cast<PetscBool>(opflow->modelname ==
3037+
OPFLOWMODEL_PBPOLRAJAHIOPSPARSE);
3038+
3039+
if (hiop_sparsegpu && !pbpolrajahiopsparse) {
30293040
SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP,
3030-
"OPFLOW solver HIOP incompatible with model %s",
3041+
"OPFLOW solver HIOPSPARSE incompatible with model %s",
30313042
(opflow->modelname).c_str());
30323043
}
3044+
#endif // EXAGO_ENABLE_RAJA
3045+
#endif // HIOP_SPARSE
30333046
/* FIXME: The PBPOLRAJAHIOP has trouble with individual load
30343047
shedding, so avoid using when load shedding is enabled */
30353048
if (opflow->include_loadloss_variables) {

src/opflow/interface/opflowregi.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ extern PetscErrorCode OPFLOWModelCreate_PBPOLHIOP(OPFLOW);
7676

7777
#if defined(EXAGO_ENABLE_RAJA)
7878
extern PetscErrorCode OPFLOWModelCreate_PBPOLRAJAHIOP(OPFLOW);
79+
extern PetscErrorCode OPFLOWModelCreate_PBPOLRAJAHIOPSPARSE(OPFLOW);
7980
#endif
8081

8182
/*
@@ -114,6 +115,9 @@ PetscErrorCode OPFLOWModelRegisterAll(OPFLOW opflow) {
114115
ierr = OPFLOWModelRegister(opflow, OPFLOWMODEL_PBPOLRAJAHIOP,
115116
OPFLOWModelCreate_PBPOLRAJAHIOP);
116117
CHKERRQ(ierr);
118+
ierr = OPFLOWModelRegister(opflow, OPFLOWMODEL_PBPOLRAJAHIOPSPARSE,
119+
OPFLOWModelCreate_PBPOLRAJAHIOPSPARSE);
120+
CHKERRQ(ierr);
117121
#endif
118122

119123
opflow->OPFLOWModelRegisterAllCalled = PETSC_TRUE;
@@ -128,6 +132,9 @@ extern PetscErrorCode OPFLOWSolverCreate_IPOPT(OPFLOW);
128132
extern PetscErrorCode OPFLOWSolverCreate_HIOP(OPFLOW);
129133
#if defined(EXAGO_ENABLE_HIOP_SPARSE)
130134
extern PetscErrorCode OPFLOWSolverCreate_HIOPSPARSE(OPFLOW);
135+
#if defined(EXAGO_ENABLE_RAJA)
136+
extern PetscErrorCode OPFLOWSolverCreate_HIOPSPARSEGPU(OPFLOW);
137+
#endif
131138
#endif
132139
#endif
133140

@@ -153,6 +160,11 @@ PetscErrorCode OPFLOWSolverRegisterAll(OPFLOW opflow) {
153160
ierr = OPFLOWSolverRegister(opflow, OPFLOWSOLVER_HIOPSPARSE,
154161
OPFLOWSolverCreate_HIOPSPARSE);
155162
CHKERRQ(ierr);
163+
#if defined(EXAGO_ENABLE_RAJA)
164+
ierr = OPFLOWSolverRegister(opflow, OPFLOWSOLVER_HIOPSPARSEGPU,
165+
OPFLOWSolverCreate_HIOPSPARSEGPU);
166+
CHKERRQ(ierr);
167+
#endif
156168
#endif
157169
#endif
158170
opflow->OPFLOWSolverRegisterAllCalled = PETSC_TRUE;

0 commit comments

Comments
 (0)