44 #ifndef AMESOS2_CUSOLVER_DEF_HPP
45 #define AMESOS2_CUSOLVER_DEF_HPP
47 #include <Teuchos_Tuple.hpp>
48 #include <Teuchos_ParameterList.hpp>
49 #include <Teuchos_StandardParameterEntryValidators.hpp>
52 #include "Amesos2_cuSOLVER_decl.hpp"
56 template <
class Matrix,
class Vector>
58 Teuchos::RCP<const Matrix> A,
59 Teuchos::RCP<Vector> X,
60 Teuchos::RCP<const Vector> B )
63 auto status = cusolverSpCreate(&data_.handle);
64 TEUCHOS_TEST_FOR_EXCEPTION( status != CUSOLVER_STATUS_SUCCESS,
65 std::runtime_error,
"cusolverSpCreate failed");
67 status = cusolverSpCreateCsrcholInfo(&data_.chol_info);
68 TEUCHOS_TEST_FOR_EXCEPTION( status != CUSOLVER_STATUS_SUCCESS,
69 std::runtime_error,
"cusolverSpCreateCsrcholInfo failed");
71 auto sparse_status = cusparseCreateMatDescr(&data_.desc);
72 TEUCHOS_TEST_FOR_EXCEPTION( sparse_status != CUSPARSE_STATUS_SUCCESS,
73 std::runtime_error,
"cusparseCreateMatDescr failed");
76 template <
class Matrix,
class Vector>
79 cusparseDestroyMatDescr(data_.desc);
80 cusolverSpDestroyCsrcholInfo(data_.chol_info);
81 cusolverSpDestroy(data_.handle);
84 template<
class Matrix,
class Vector>
88 #ifdef HAVE_AMESOS2_TIMERS
89 Teuchos::TimeMonitor preOrderTimer(this->timers_.preOrderTime_);
91 if(do_optimization()) {
92 this->matrixA_->returnRowPtr_kokkos_view(device_row_ptr_view_);
93 this->matrixA_->returnColInd_kokkos_view(device_cols_view_);
97 Amesos2::Util::reorder(
98 device_row_ptr_view_, device_cols_view_,
99 device_perm_, device_peri_, sorted_nnz);
106 template <
class Matrix,
class Vector>
110 #ifdef HAVE_AMESOS2_TIMERS
111 Teuchos::TimeMonitor symFactTimer(this->timers_.symFactTime_);
116 const int size = this->globalNumRows_;
117 const int nnz = device_cols_view_.size();
118 const int * colIdx = device_cols_view_.data();
119 const int * rowPtr = device_row_ptr_view_.data();
120 auto status = cusolverSpXcsrcholAnalysis(
121 data_.handle, size, nnz, data_.desc, rowPtr, colIdx, data_.chol_info);
122 err = (status != CUSOLVER_STATUS_SUCCESS) ? 1 : 0;
125 Teuchos::broadcast(*(this->getComm()), 0, &err);
126 TEUCHOS_TEST_FOR_EXCEPTION(err != 0,
127 std::runtime_error,
"Amesos2 cuSolver symbolic failed.");
132 template <
class Matrix,
class Vector>
137 if(do_optimization()) {
138 this->matrixA_->returnValues_kokkos_view(device_nzvals_view_);
144 device_size_type_array orig_device_row_ptr_view;
145 device_ordinal_type_array orig_device_cols_view;
146 this->matrixA_->returnRowPtr_kokkos_view(orig_device_row_ptr_view);
147 this->matrixA_->returnColInd_kokkos_view(orig_device_cols_view);
148 Amesos2::Util::reorder_values(
149 device_nzvals_view_, orig_device_row_ptr_view, device_row_ptr_view_, orig_device_cols_view,
150 device_perm_, device_peri_, sorted_nnz);
153 const int size = this->globalNumRows_;
154 const int nnz = device_cols_view_.size();
155 const cusolver_type * values = device_nzvals_view_.data();
156 const int * colIdx = device_cols_view_.data();
157 const int * rowPtr = device_row_ptr_view_.data();
159 size_t internalDataInBytes, workspaceInBytes;
160 auto status = function_map::bufferInfo(data_.handle, size, nnz, data_.desc,
161 values, rowPtr, colIdx, data_.chol_info,
162 &internalDataInBytes, &workspaceInBytes);
164 if(status == CUSOLVER_STATUS_SUCCESS) {
165 const size_t buffer_size = workspaceInBytes /
sizeof(cusolver_type);
166 if(buffer_size > buffer_.extent(0)) {
167 buffer_ = device_value_type_array(
168 Kokkos::ViewAllocateWithoutInitializing(
"cusolver buf"), buffer_size);
170 status = function_map::numeric(data_.handle, size, nnz, data_.desc,
171 values, rowPtr, colIdx, data_.chol_info, buffer_.data());
173 err = (status != CUSOLVER_STATUS_SUCCESS) ? 1 : 0;
176 Teuchos::broadcast(*(this->getComm()), 0, &err);
177 TEUCHOS_TEST_FOR_EXCEPTION(err != 0,
178 std::runtime_error,
"Amesos2 cuSolver numeric failed.");
183 template <
class Matrix,
class Vector>
189 const global_size_type ld_rhs = this->root_ ? X->getGlobalLength() : 0;
190 const ordinal_type nrhs = X->getGlobalNumVectors();
193 #ifdef HAVE_AMESOS2_TIMERS
194 Teuchos::TimeMonitor mvConvTimer(this->timers_.vecConvTime_);
195 Teuchos::TimeMonitor redistTimer(this->timers_.vecRedistTime_);
198 Util::get_1d_copy_helper_kokkos_view<MultiVecAdapter<Vector>,
199 device_solve_array_t>::do_get(B, this->bValues_, Teuchos::as<size_t>(ld_rhs),
200 ROOTED, this->rowIndexBase_);
204 Util::get_1d_copy_helper_kokkos_view<MultiVecAdapter<Vector>,
205 device_solve_array_t>::do_get(X, this->xValues_, Teuchos::as<size_t>(ld_rhs),
206 ROOTED, this->rowIndexBase_);
212 #ifdef HAVE_AMESOS2_TIMER
213 Teuchos::TimeMonitor solveTimer(this->timers_.solveTime_);
216 const int size = this->globalNumRows_;
219 Amesos2::Util::apply_reorder_permutation(
220 this->bValues_, this->permute_result_, this->device_perm_);
223 this->permute_result_ = this->bValues_;
226 for(ordinal_type n = 0; n < nrhs; ++n) {
227 const cusolver_type * b = this->permute_result_.data() + n * size;
228 cusolver_type * x = this->xValues_.data() + n * size;
229 auto status = function_map::solve(
230 data_.handle, size, b, x, data_.chol_info, buffer_.data());
231 err = (status != CUSOLVER_STATUS_SUCCESS) ? 1 : 0;
237 if(data_.bReorder && err == 0) {
238 Amesos2::Util::apply_reorder_permutation(
239 this->xValues_, this->permute_result_, this->device_peri_);
240 Kokkos::deep_copy(this->xValues_, this->permute_result_);
246 #ifdef HAVE_AMESOS2_TIMERS
247 Teuchos::TimeMonitor redistTimer(this->timers_.vecRedistTime_);
250 Util::template put_1d_data_helper_kokkos_view<
252 Teuchos::as<size_t>(ld_rhs), ROOTED, this->rowIndexBase_);
255 Teuchos::broadcast(*(this->getComm()), 0, &err);
256 TEUCHOS_TEST_FOR_EXCEPTION(err != 0,
257 std::runtime_error,
"Amesos2 cuSolver solve failed.");
262 template <
class Matrix,
class Vector>
266 return( this->matrixA_->getGlobalNumRows() == this->matrixA_->getGlobalNumCols() );
269 template <
class Matrix,
class Vector>
274 using Teuchos::ParameterEntryValidator;
276 RCP<const Teuchos::ParameterList> valid_params = getValidParameters_impl();
278 if( parameterList->isParameter(
"Reorder") ){
279 RCP<const ParameterEntryValidator> reorder_validator = valid_params->getEntry(
"Reorder").validator();
280 parameterList->getEntry(
"Reorder").setValidator(reorder_validator);
283 data_.bReorder = parameterList->get<
bool>(
"Reorder",
true);
286 template <
class Matrix,
class Vector>
287 Teuchos::RCP<const Teuchos::ParameterList>
290 static Teuchos::RCP<const Teuchos::ParameterList> valid_params;
292 if( is_null(valid_params) ){
293 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
295 pl->set(
"Reorder",
true,
"Whether GIDs contiguous");
303 template <
class Matrix,
class Vector>
306 return (this->root_ && (this->matrixA_->getComm()->getSize() == 1));
309 template <
class Matrix,
class Vector>
313 if(current_phase == SOLVE) {
317 if(!do_optimization()) {
318 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::runtime_error,
319 "cuSolver is only implemented for serial.");
325 template<
class Matrix,
class Vector>
330 #endif // AMESOS2_CUSOLVER_DEF_HPP
Amesos2::SolverCore: A templated interface for interaction with third-party direct sparse solvers...
Definition: Amesos2_SolverCore_decl.hpp:105
EPhase
Used to indicate a phase in the direct solution.
Definition: Amesos2_TypeDecl.hpp:65
void setParameters_impl(const Teuchos::RCP< Teuchos::ParameterList > ¶meterList)
Definition: Amesos2_cuSOLVER_def.hpp:271
bool matrixShapeOK_impl() const
Determines whether the shape of the matrix is OK for this solver.
Definition: Amesos2_cuSOLVER_def.hpp:264
cuSOLVER(Teuchos::RCP< const Matrix > A, Teuchos::RCP< Vector > X, Teuchos::RCP< const Vector > B)
Initialize from Teuchos::RCP.
Definition: Amesos2_cuSOLVER_def.hpp:57
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters_impl() const
Definition: Amesos2_cuSOLVER_def.hpp:288
Amesos2 interface to cuSOLVER.
Definition: Amesos2_cuSOLVER_decl.hpp:59
int symbolicFactorization_impl()
Perform symbolic factorization of the matrix using cuSOLVER.
Definition: Amesos2_cuSOLVER_def.hpp:108
bool loadA_impl(EPhase current_phase)
Reads matrix data into internal structures.
Definition: Amesos2_cuSOLVER_def.hpp:311
bool do_optimization() const
can we optimize size_type and ordinal_type for straight pass through
Definition: Amesos2_cuSOLVER_def.hpp:305
int numericFactorization_impl()
cuSOLVER specific numeric factorization
Definition: Amesos2_cuSOLVER_def.hpp:134
int preOrdering_impl()
Performs pre-ordering on the matrix to increase efficiency.
Definition: Amesos2_cuSOLVER_def.hpp:86
int solve_impl(const Teuchos::Ptr< MultiVecAdapter< Vector > > X, const Teuchos::Ptr< const MultiVecAdapter< Vector > > B) const
cuSOLVER specific solve.
Definition: Amesos2_cuSOLVER_def.hpp:185
A templated MultiVector class adapter for Amesos2.
Definition: Amesos2_MultiVecAdapter_decl.hpp:176
~cuSOLVER()
Destructor.
Definition: Amesos2_cuSOLVER_def.hpp:77