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.