9#include <kernel/util/memory_pool.hpp>
10#include <kernel/util/cuda_util.hpp>
11#include <kernel/solver/cudss.hpp>
27 cudssMatrix_t vec_sol;
28 cudssMatrix_t vec_rhs;
29 std::uint32_t* row_ptr;
30 std::uint32_t* col_idx;
36 _system_matrix(system_matrix),
37 _cudss_core(new Intern::CUDSSCore)
39 Intern::CUDSSCore& core = *
reinterpret_cast<Intern::CUDSSCore*
>(_cudss_core);
40 core.handle =
reinterpret_cast<cudssHandle_t
>(Runtime::get_cudss_handle());
41 if(CUDSS_STATUS_SUCCESS != cudssConfigCreate(&core.config))
42 throw InternalError(__func__, __FILE__, __LINE__,
"cudssConfigCreate failed!");
43 if(CUDSS_STATUS_SUCCESS != cudssDataCreate(core.handle, &core.data))
44 throw InternalError(__func__, __FILE__, __LINE__,
"cudssDataCreate failed!");
49 Intern::CUDSSCore* core =
reinterpret_cast<Intern::CUDSSCore*
>(_cudss_core);
52 cudssDataDestroy(core->handle, core->data);
53 cudssConfigDestroy(core->config);
58 void CUDSS::init_symbolic()
60 BaseClass::init_symbolic();
62 Intern::CUDSSCore& core = *
reinterpret_cast<Intern::CUDSSCore*
>(_cudss_core);
64 cudssStatus_t ret = CUDSS_STATUS_INTERNAL_ERROR;
67 cudssAlgType_t alg_type = CUDSS_ALG_1;
68 ret = cudssConfigSet(core.config, CUDSS_CONFIG_REORDERING_ALG, &alg_type,
sizeof(cudssAlgType_t));
69 if(ret != CUDSS_STATUS_SUCCESS)
70 throw SolverException(
"CUDSS: cudssConfigSet() for 'CUDSS_CONFIG_REORDERING_ALG' failed!");
73 const Index neq = _system_matrix.rows();
74 const Index nze = _system_matrix.used_elements();
75 const Index* a_row_ptr = _system_matrix.row_ptr();
76 const Index* a_col_idx = _system_matrix.col_ind();
77 std::uint32_t* row_ptr =
nullptr;
78 std::uint32_t* col_idx =
nullptr;
81 if constexpr (
sizeof(
Index) == 4u)
83 row_ptr =
reinterpret_cast<std::uint32_t*
>(
const_cast<Index*
>(_system_matrix.row_ptr()));
84 col_idx =
reinterpret_cast<std::uint32_t*
>(
const_cast<Index*
>(_system_matrix.col_ind()));
88 row_ptr = core.row_ptr = MemoryPool::allocate_memory<std::uint32_t>(neq+1u);
89 col_idx = core.col_idx = MemoryPool::allocate_memory<std::uint32_t>(nze);
90 for(Index i(0); i <= neq; ++i)
91 core.row_ptr[i] = std::uint32_t(a_row_ptr[i]);
92 for(Index i(0); i < nze; ++i)
93 core.col_idx[i] = std::uint32_t(a_col_idx[i]);
97 ret = cudssMatrixCreateCsr(
105 const_cast<double*
>(_system_matrix.val()),
111 if(ret != CUDSS_STATUS_SUCCESS)
112 throw SolverException(
"CUDSS: cudssMatrixCreateCsr() for system matrix failed!");
115 ret = cudssMatrixCreateDn(
122 CUDSS_LAYOUT_COL_MAJOR);
124 if(ret != CUDSS_STATUS_SUCCESS)
125 throw SolverException(
"CUDSS: cudssMatrixCreateDn() for solution vector failed!");
128 ret = cudssMatrixCreateDn(
135 CUDSS_LAYOUT_COL_MAJOR);
137 if(ret != CUDSS_STATUS_SUCCESS)
138 throw SolverException(
"CUDSS: cudssMatrixCreateDn() for rhs vector failed!");
143 CUDSS_PHASE_ANALYSIS,
149 if(ret != CUDSS_STATUS_SUCCESS)
150 throw SolverException(
"CUDSS: cudssExecute() for phase 'CUDSS_PHASE_ANALYSIS' failed!");
153 Util::cuda_synchronize();
156 void CUDSS::done_symbolic()
158 BaseClass::done_symbolic();
159 if(_cudss_core ==
nullptr)
162 Intern::CUDSSCore& core = *
reinterpret_cast<Intern::CUDSSCore*
>(_cudss_core);
164 cudssMatrixDestroy(core.vec_sol);
165 cudssMatrixDestroy(core.vec_rhs);
166 cudssMatrixDestroy(core.matrix);
170 MemoryPool::release_memory(core.col_idx);
171 core.col_idx =
nullptr;
175 MemoryPool::release_memory(core.row_ptr);
176 core.row_ptr =
nullptr;
180 Util::cuda_synchronize();
183 void CUDSS::init_numeric()
185 BaseClass::init_numeric();
187 Intern::CUDSSCore& core = *
reinterpret_cast<Intern::CUDSSCore*
>(_cudss_core);
190 cudssStatus_t ret = cudssExecute(
192 CUDSS_PHASE_FACTORIZATION,
198 if(ret != CUDSS_STATUS_SUCCESS)
199 throw SolverException(
"CUDSS: cudssExecute() for phase 'CUDSS_PHASE_FACTORIZATION' failed!");
202 Util::cuda_synchronize();
205 void CUDSS::done_numeric()
208 BaseClass::done_numeric();
211 Status CUDSS::apply(VectorType& vec_sol,
const VectorType& vec_rhs)
213 Intern::CUDSSCore& core = *
reinterpret_cast<Intern::CUDSSCore*
>(_cudss_core);
215 cudssStatus_t ret = CUDSS_STATUS_INTERNAL_ERROR;
218 ret = cudssMatrixSetValues(core.vec_sol, vec_sol.elements());
219 if(ret != CUDSS_STATUS_SUCCESS)
220 throw SolverException(
"CUDSS: cudssMatrixSetValues() failed for vec_sol!");
223 cudssMatrixSetValues(core.vec_rhs,
const_cast<double*
>(vec_rhs.elements()));
224 if(ret != CUDSS_STATUS_SUCCESS)
225 throw SolverException(
"CUDSS: cudssMatrixSetValues() failed for vec_rhs!");
238 Util::cuda_synchronize();
240 return (ret == CUDSS_STATUS_SUCCESS ? Status::success : Status::aborted);
246void dummy_function_cudss() {}
CUDSS(const MatrixType &system_matrix)
Constructor.
Status
Solver status return codes enumeration.
std::uint64_t Index
Index data type.