Files
TheRock/rocm-libraries/projects/rocalution/clients/benchmarks/rocalution_driver_itsolver.hpp
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

457 lines
15 KiB
C++

/* ************************************************************************
* Copyright (C) 2022-2023 Advanced Micro Devices, Inc. All rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* ************************************************************************ */
#pragma once
#include "rocalution_driver_itsolver_template.hpp"
//
// @brief This structure is responsible of providing a base implementation
// of \ref rocalution_driver_itsolver_template.
//
template <rocalution_enum_itsolver::value_type ITSOLVER, typename T>
struct rocalution_driver_itsolver_base : rocalution_driver_itsolver_template<ITSOLVER, T>
{
protected:
using traits_t = rocalution_driver_itsolver_traits<ITSOLVER, T>;
using solver_t = typename traits_t::solver_t;
using preconditioner_t = typename traits_t::preconditioner_t;
using params_t = rocalution_bench_solver_parameters;
protected:
T* cache_csr_val{};
preconditioner_t* m_preconditioner{};
//
// Option for caching.
//
void Cache(int m,
int n,
int nnz,
const int* csr_ptr,
const int* csr_ind,
const T* csr_val,
const params_t& parameters)
{
this->cache_csr_val = new T[nnz];
for(int i = 0; i < nnz; i++)
{
this->cache_csr_val[i] = csr_val[i];
}
}
public:
//
// @brief Destructor.
//
~rocalution_driver_itsolver_base()
{
if(this->cache_csr_val != nullptr)
{
delete[] this->cache_csr_val;
this->cache_csr_val = nullptr;
}
if(this->m_preconditioner != nullptr)
{
delete m_preconditioner;
m_preconditioner = nullptr;
}
}
virtual const preconditioner_t* GetPreconditioner() const override
{
return this->m_preconditioner;
};
virtual preconditioner_t* GetPreconditioner() override
{
return this->m_preconditioner;
};
virtual void SetPreconditioner(preconditioner_t* preconditioner) override
{
this->m_preconditioner = preconditioner;
};
// @brief Import matrix.
// @param[in]
// A local matrix.
// @param[in]
// parameters parameters to configure the operation.
// @return true if successful, false otherwise.
virtual bool ImportMatrix(LocalMatrix<T>& A, const params_t& parameters)
{
auto matrix_init = parameters.GetEnumMatrixInit();
if(matrix_init.is_invalid())
{
rocalution_bench_errmsg << "matrix initialization is invalid" << std::endl;
return false;
}
const auto rebuild_numeric = parameters.Get(params_t::rebuild_numeric);
switch(matrix_init.value)
{
case rocalution_enum_matrix_init::laplacian:
{
int* csr_ptr = NULL;
int* csr_col = NULL;
T* csr_val = NULL;
const int ndim = parameters.Get(params_t::ndim);
auto nrow = gen_2d_laplacian(ndim, &csr_ptr, &csr_col, &csr_val);
if(rebuild_numeric)
{
this->Cache(nrow, nrow, csr_ptr[nrow], csr_ptr, csr_col, csr_val, parameters);
}
A.SetDataPtrCSR(&csr_ptr, &csr_col, &csr_val, "A", csr_ptr[nrow], nrow, nrow);
return true;
}
case rocalution_enum_matrix_init::permuted_identity:
{
int* csr_ptr = NULL;
int* csr_col = NULL;
T* csr_val = NULL;
const int ndim = parameters.Get(params_t::ndim);
auto nrow = gen_permuted_identity(ndim, &csr_ptr, &csr_col, &csr_val);
if(rebuild_numeric)
{
this->Cache(nrow, nrow, csr_ptr[nrow], csr_ptr, csr_col, csr_val, parameters);
}
A.SetDataPtrCSR(&csr_ptr, &csr_col, &csr_val, "A", csr_ptr[nrow], nrow, nrow);
return true;
}
case rocalution_enum_matrix_init::file:
{
const std::string matrix_filename = parameters.Get(params_t::matrix_filename);
if(matrix_filename == "")
{
rocalution_bench_errmsg << "no filename for matrix file initialization."
<< std::endl;
return false;
}
else
{
A.ReadFileMTX(matrix_filename);
// Apply reordering ?
// LocalVector<int> rcmk;
// A.RCMK(&rcmk);
// A.Permute(rcmk);
if(rebuild_numeric)
{
//
// Since we want to cache
//
// Convert to csr format.
//
A.ConvertTo(1);
//
// Grab csr data.
//
int* csr_ptr = NULL;
int* csr_col = NULL;
T* csr_val = NULL;
auto nrow = A.GetM();
auto ncol = A.GetN();
auto nnz = A.GetNnz();
//
// Leave pointers, A is not usable after this until we re-set the pointers.
//
A.LeaveDataPtrCSR(&csr_ptr, &csr_col, &csr_val);
//
// Cache.
//
this->Cache(nrow, ncol, nnz, csr_ptr, csr_col, csr_val, parameters);
//
// Re-set the pointers.
//
A.SetDataPtrCSR(&csr_ptr, &csr_col, &csr_val, "A", nnz, nrow, nrow);
}
return true;
}
}
}
return true;
}
virtual bool ImportLinearSystem(LocalMatrix<T>& A,
LocalVector<T>& B,
LocalVector<T>& X,
const params_t& parameters) override
{
//
// Import matrix.
//
this->ImportMatrix(A, parameters);
return true;
}
};
//
// @Brief Default implementation.
//
template <rocalution_enum_itsolver::value_type ITSOLVER, typename T>
struct rocalution_driver_itsolver_default : rocalution_driver_itsolver_base<ITSOLVER, T>
{
using params_t = rocalution_bench_solver_parameters;
virtual bool CreatePreconditioner(LocalMatrix<T>& A,
LocalVector<T>& B,
LocalVector<T>& X,
const params_t& parameters) override
{
auto enum_preconditioner = parameters.GetEnumPreconditioner();
if(enum_preconditioner.is_invalid())
{
rocalution_bench_errmsg << "enum preconditioner is invalid." << std::endl;
return false;
}
this->m_preconditioner = nullptr;
switch(enum_preconditioner.value)
{
case rocalution_enum_preconditioner::none:
{
return true;
}
case rocalution_enum_preconditioner::chebyshev:
{
// Chebyshev preconditioner
// Determine min and max eigenvalues
T lambda_min;
T lambda_max;
A.Gershgorin(lambda_min, lambda_max);
auto* p = new rocalution::
AIChebyshev<rocalution::LocalMatrix<T>, rocalution::LocalVector<T>, T>;
p->Set(3, lambda_max / 7.0, lambda_max);
this->m_preconditioner = p;
break;
}
case rocalution_enum_preconditioner::FSAI:
{
auto* p
= new rocalution::FSAI<rocalution::LocalMatrix<T>, rocalution::LocalVector<T>, T>;
this->m_preconditioner = p;
break;
}
case rocalution_enum_preconditioner::SPAI:
{
auto* p
= new rocalution::SPAI<rocalution::LocalMatrix<T>, rocalution::LocalVector<T>, T>;
this->m_preconditioner = p;
break;
}
case rocalution_enum_preconditioner::TNS:
{
auto* p
= new rocalution::TNS<rocalution::LocalMatrix<T>, rocalution::LocalVector<T>, T>;
this->m_preconditioner = p;
break;
}
case rocalution_enum_preconditioner::Jacobi:
{
auto* p
= new rocalution::Jacobi<rocalution::LocalMatrix<T>, rocalution::LocalVector<T>, T>;
//
// no specific parameters
//
this->m_preconditioner = p;
break;
}
case rocalution_enum_preconditioner::GS:
{
auto* p = new rocalution::GS<rocalution::LocalMatrix<T>, rocalution::LocalVector<T>, T>;
//
// no specific parameters
//
this->m_preconditioner = p;
break;
}
case rocalution_enum_preconditioner::SGS:
{
auto* p
= new rocalution::SGS<rocalution::LocalMatrix<T>, rocalution::LocalVector<T>, T>;
//
// no specific parameters
//
this->m_preconditioner = p;
break;
}
case rocalution_enum_preconditioner::ILU:
{
auto* p
= new rocalution::ILU<rocalution::LocalMatrix<T>, rocalution::LocalVector<T>, T>;
//
// no specific parameters
//
this->m_preconditioner = p;
break;
}
case rocalution_enum_preconditioner::ItILU0:
{
auto enum_itilu0_alg = parameters.GetEnumItILU0Algorithm();
if(enum_itilu0_alg.is_invalid())
{
rocalution_bench_errmsg << "enum_itilu0_alg is invalid." << std::endl;
return false;
}
auto* p
= new rocalution::ItILU0<rocalution::LocalMatrix<T>, rocalution::LocalVector<T>, T>;
p->SetMaxIter(parameters.Get(params_t::itilu0_max_iter));
p->SetTolerance(parameters.Get(params_t::itilu0_tol));
p->SetOptions(parameters.Get(params_t::itilu0_options));
switch(enum_itilu0_alg.value)
{
case rocalution_enum_itilu0_alg::Default:
{
p->SetAlgorithm(ItILU0Algorithm::Default);
break;
}
case rocalution_enum_itilu0_alg::AsyncInPlace:
{
p->SetAlgorithm(ItILU0Algorithm::AsyncInPlace);
break;
}
case rocalution_enum_itilu0_alg::AsyncSplit:
{
p->SetAlgorithm(ItILU0Algorithm::AsyncSplit);
break;
}
case rocalution_enum_itilu0_alg::SyncSplit:
{
p->SetAlgorithm(ItILU0Algorithm::SyncSplit);
break;
}
case rocalution_enum_itilu0_alg::SyncSplitFusion:
{
p->SetAlgorithm(ItILU0Algorithm::SyncSplitFusion);
break;
}
}
this->m_preconditioner = p;
return true;
}
case rocalution_enum_preconditioner::ILUT:
{
auto* p
= new rocalution::ILUT<rocalution::LocalMatrix<T>, rocalution::LocalVector<T>, T>;
p->Set(parameters.Get(params_t::ilut_tol), parameters.Get(params_t::ilut_n));
this->m_preconditioner = p;
break;
}
case rocalution_enum_preconditioner::IC:
{
auto* p = new rocalution::IC<rocalution::LocalMatrix<T>, rocalution::LocalVector<T>, T>;
//
// no specific parameters
//
this->m_preconditioner = p;
break;
}
case rocalution_enum_preconditioner::MCGS:
{
auto* p = new rocalution::
MultiColoredGS<rocalution::LocalMatrix<T>, rocalution::LocalVector<T>, T>;
p->SetRelaxation(parameters.Get(params_t::mcgs_relax));
this->m_preconditioner = p;
break;
}
case rocalution_enum_preconditioner::MCSGS:
{
auto* p = new rocalution::
MultiColoredSGS<rocalution::LocalMatrix<T>, rocalution::LocalVector<T>, T>;
//
// no specific parameters
//
this->m_preconditioner = p;
break;
}
case rocalution_enum_preconditioner::MCILU:
{
auto* p = new rocalution::
MultiColoredILU<rocalution::LocalMatrix<T>, rocalution::LocalVector<T>, T>;
p->Set(parameters.Get(params_t::mcilu_p),
parameters.Get(params_t::mcilu_q),
parameters.Get(params_t::mcilu_use_level));
this->m_preconditioner = p;
break;
}
}
if(this->m_preconditioner != nullptr)
{
const auto itsolve = parameters.Get(params_t::iterative_solve);
rocalution::SolverDescr descr;
if(itsolve)
{
descr.SetTriSolverAlg(TriSolverAlg_Iterative);
descr.SetIterativeSolverMaxIteration(parameters.Get(params_t::itsolve_max_iter));
descr.SetIterativeSolverTolerance(parameters.Get(params_t::itsolve_tol));
}
else
{
descr.SetTriSolverAlg(TriSolverAlg_Default);
}
this->m_preconditioner->SetSolverDescriptor(descr);
return true;
}
return false;
}
};
//
// @Brief Default definition.
//
template <rocalution_enum_itsolver::value_type ITSOLVER, typename T>
struct rocalution_driver_itsolver : rocalution_driver_itsolver_default<ITSOLVER, T>
{
};