29 template <
typename Number>
31 cusparseXcsrilu02(cusparseHandle_t handle,
34 const cusparseMatDescr_t descrA,
35 Number * csrValA_valM,
36 const int * csrRowPtrA,
37 const int * csrColIndA,
39 cusparseSolvePolicy_t policy,
43 return CUSPARSE_STATUS_INVALID_VALUE;
48 cusparseXcsrilu02<float>(cusparseHandle_t handle,
51 const cusparseMatDescr_t descrA,
53 const int * csrRowPtrA,
54 const int * csrColIndA,
56 cusparseSolvePolicy_t policy,
59 return cusparseScsrilu02(handle,
73 cusparseXcsrilu02<double>(cusparseHandle_t handle,
76 const cusparseMatDescr_t descrA,
77 double * csrValA_valM,
78 const int * csrRowPtrA,
79 const int * csrColIndA,
81 cusparseSolvePolicy_t policy,
84 return cusparseDcsrilu02(handle,
156 template <
typename Number>
158 cusparseXcsrilu02_analysis(cusparseHandle_t ,
161 const cusparseMatDescr_t ,
166 cusparseSolvePolicy_t ,
170 return CUSPARSE_STATUS_INVALID_VALUE;
175 cusparseXcsrilu02_analysis<float>(cusparseHandle_t handle,
178 const cusparseMatDescr_t descrA,
179 const float * csrValA,
180 const int * csrRowPtrA,
181 const int * csrColIndA,
183 cusparseSolvePolicy_t policy,
186 return cusparseScsrilu02_analysis(handle,
200 cusparseXcsrilu02_analysis<double>(cusparseHandle_t handle,
203 const cusparseMatDescr_t descrA,
204 const double * csrValA,
205 const int * csrRowPtrA,
206 const int * csrColIndA,
208 cusparseSolvePolicy_t policy,
211 return cusparseDcsrilu02_analysis(handle,
283 template <
typename Number>
285 cusparseXcsrilu02_bufferSize(cusparseHandle_t ,
288 const cusparseMatDescr_t ,
296 return CUSPARSE_STATUS_INVALID_VALUE;
301 cusparseXcsrilu02_bufferSize<float>(cusparseHandle_t handle,
304 const cusparseMatDescr_t descrA,
306 const int * csrRowPtrA,
307 const int * csrColIndA,
309 int *pBufferSizeInBytes)
311 return cusparseScsrilu02_bufferSize(handle,
324 cusparseXcsrilu02_bufferSize<double>(cusparseHandle_t handle,
327 const cusparseMatDescr_t descrA,
329 const int * csrRowPtrA,
330 const int * csrColIndA,
332 int *pBufferSizeInBytes)
334 return cusparseDcsrilu02_bufferSize(handle,
399 template <
typename Number>
401 cusparseXcsric02(cusparseHandle_t ,
404 const cusparseMatDescr_t ,
409 cusparseSolvePolicy_t ,
413 return CUSPARSE_STATUS_INVALID_VALUE;
418 cusparseXcsric02<float>(cusparseHandle_t handle,
421 const cusparseMatDescr_t descrA,
422 float * csrValA_valM,
423 const int * csrRowPtrA,
424 const int * csrColIndA,
426 cusparseSolvePolicy_t policy,
429 return cusparseScsric02(handle,
443 cusparseXcsric02<double>(cusparseHandle_t handle,
446 const cusparseMatDescr_t descrA,
447 double * csrValA_valM,
448 const int * csrRowPtrA,
449 const int * csrColIndA,
451 cusparseSolvePolicy_t policy,
454 return cusparseDcsric02(handle,
526 template <
typename Number>
528 cusparseXcsrsv2_solve(cusparseHandle_t ,
529 cusparseOperation_t ,
533 const cusparseMatDescr_t ,
540 cusparseSolvePolicy_t ,
544 return CUSPARSE_STATUS_INVALID_VALUE;
549 cusparseXcsrsv2_solve<float>(cusparseHandle_t handle,
550 cusparseOperation_t transA,
554 const cusparseMatDescr_t descra,
555 const float * csrValA,
556 const int * csrRowPtrA,
557 const int * csrColIndA,
561 cusparseSolvePolicy_t policy,
564 return cusparseScsrsv2_solve(handle,
582 cusparseXcsrsv2_solve<double>(cusparseHandle_t handle,
583 cusparseOperation_t transA,
586 const double * alpha,
587 const cusparseMatDescr_t descra,
588 const double * csrValA,
589 const int * csrRowPtrA,
590 const int * csrColIndA,
594 cusparseSolvePolicy_t policy,
597 return cusparseDcsrsv2_solve(handle,
689 template <
typename Number>
691 cusparseXcsrsv2_analysis(cusparseHandle_t ,
692 cusparseOperation_t ,
695 const cusparseMatDescr_t ,
700 cusparseSolvePolicy_t ,
704 return CUSPARSE_STATUS_INVALID_VALUE;
709 cusparseXcsrsv2_analysis<float>(cusparseHandle_t handle,
710 cusparseOperation_t transA,
713 const cusparseMatDescr_t descrA,
714 const float * csrValA,
715 const int * csrRowPtrA,
716 const int * csrColIndA,
718 cusparseSolvePolicy_t policy,
721 return cusparseScsrsv2_analysis(handle,
736 cusparseXcsrsv2_analysis<double>(cusparseHandle_t handle,
737 cusparseOperation_t transA,
740 const cusparseMatDescr_t descrA,
741 const double * csrValA,
742 const int * csrRowPtrA,
743 const int * csrColIndA,
745 cusparseSolvePolicy_t policy,
748 return cusparseDcsrsv2_analysis(handle,
824 template <
typename Number>
826 cusparseXcsric02_analysis(cusparseHandle_t ,
829 const cusparseMatDescr_t ,
834 cusparseSolvePolicy_t ,
838 return CUSPARSE_STATUS_INVALID_VALUE;
843 cusparseXcsric02_analysis<float>(cusparseHandle_t handle,
846 const cusparseMatDescr_t descrA,
847 const float * csrValA,
848 const int * csrRowPtrA,
849 const int * csrColIndA,
851 cusparseSolvePolicy_t policy,
854 return cusparseScsric02_analysis(handle,
868 cusparseXcsric02_analysis<double>(cusparseHandle_t handle,
871 const cusparseMatDescr_t descrA,
872 const double * csrValA,
873 const int * csrRowPtrA,
874 const int * csrColIndA,
876 cusparseSolvePolicy_t policy,
879 return cusparseDcsric02_analysis(handle,
951 template <
typename Number>
953 cusparseXcsrsv2_bufferSize(cusparseHandle_t ,
954 cusparseOperation_t ,
957 const cusparseMatDescr_t ,
965 return CUSPARSE_STATUS_INVALID_VALUE;
970 cusparseXcsrsv2_bufferSize<float>(cusparseHandle_t handle,
971 cusparseOperation_t transA,
974 const cusparseMatDescr_t descrA,
976 const int * csrRowPtrA,
977 const int * csrColIndA,
979 int * pBufferSizeInBytes)
981 return cusparseScsrsv2_bufferSize(handle,
995 cusparseXcsrsv2_bufferSize<double>(cusparseHandle_t handle,
996 cusparseOperation_t transA,
999 const cusparseMatDescr_t descrA,
1001 const int * csrRowPtrA,
1002 const int * csrColIndA,
1004 int *pBufferSizeInBytes)
1006 return cusparseDcsrsv2_bufferSize(handle,
1015 pBufferSizeInBytes);
1078 template <
typename Number>
1080 cusparseXcsric02_bufferSize(cusparseHandle_t ,
1083 const cusparseMatDescr_t ,
1091 return CUSPARSE_STATUS_INVALID_VALUE;
1096 cusparseXcsric02_bufferSize<float>(cusparseHandle_t handle,
1099 const cusparseMatDescr_t descrA,
1101 const int * csrRowPtrA,
1102 const int * csrColIndA,
1104 int *pBufferSizeInBytes)
1106 return cusparseScsric02_bufferSize(handle,
1114 pBufferSizeInBytes);
1119 cusparseXcsric02_bufferSize<double>(cusparseHandle_t handle,
1122 const cusparseMatDescr_t descrA,
1124 const int * csrRowPtrA,
1125 const int * csrColIndA,
1127 int *pBufferSizeInBytes)
1129 return cusparseDcsric02_bufferSize(handle,
1137 pBufferSizeInBytes);
1191 template <
typename Number>
1193 bool use_level_analysis_)
1194 : use_level_analysis(use_level_analysis_)
1199 template <
typename Number>
1207 ,
policy_L(CUSPARSE_SOLVE_POLICY_USE_LEVEL)
1208 ,
policy_Lt(CUSPARSE_SOLVE_POLICY_USE_LEVEL)
1209 ,
policy_M(CUSPARSE_SOLVE_POLICY_USE_LEVEL)
1218 cusparseStatus_t status = cusparseCreateMatDescr(&
descr_M);
1220 status = cusparseSetMatIndexBase(
descr_M, CUSPARSE_INDEX_BASE_ZERO);
1222 status = cusparseSetMatType(
descr_M, CUSPARSE_MATRIX_TYPE_GENERAL);
1225 status = cusparseCreateMatDescr(&
descr_L);
1227 status = cusparseSetMatIndexBase(
descr_L, CUSPARSE_INDEX_BASE_ZERO);
1229 status = cusparseSetMatType(
descr_L, CUSPARSE_MATRIX_TYPE_GENERAL);
1231 status = cusparseSetMatFillMode(
descr_L, CUSPARSE_FILL_MODE_LOWER);
1233 status = cusparseSetMatDiagType(
descr_L, CUSPARSE_DIAG_TYPE_NON_UNIT);
1238 status = cusparseCreateCsric02Info(&
info_M);
1240 status = cusparseCreateCsrsv2Info(&
info_L);
1242 status = cusparseCreateCsrsv2Info(&
info_Lt);
1248 template <
typename Number>
1252 cusparseStatus_t status = cusparseDestroyMatDescr(descr_M);
1255 status = cusparseDestroyMatDescr(descr_L);
1258 status = cusparseDestroyCsric02Info(info_M);
1261 status = cusparseDestroyCsrsv2Info(info_L);
1264 status = cusparseDestroyCsrsv2Info(info_Lt);
1270 template <
typename Number>
1277 policy_L = CUSPARSE_SOLVE_POLICY_USE_LEVEL;
1278 policy_Lt = CUSPARSE_SOLVE_POLICY_USE_LEVEL;
1279 policy_M = CUSPARSE_SOLVE_POLICY_USE_LEVEL;
1283 policy_L = CUSPARSE_SOLVE_POLICY_NO_LEVEL;
1284 policy_Lt = CUSPARSE_SOLVE_POLICY_NO_LEVEL;
1285 policy_M = CUSPARSE_SOLVE_POLICY_NO_LEVEL;
1289 n_nonzero_elements =
A.n_nonzero_elements();
1292 matrix_pointer = &
A;
1293 const auto cusparse_matrix =
A.get_cusparse_matrix();
1294 const Number *
const A_val_dev = std::get<0>(cusparse_matrix);
1298 Utilities::CUDA::allocate_device_data<Number>(n_nonzero_elements));
1299 cudaError_t cuda_status = cudaMemcpy(P_val_dev.get(),
1301 n_nonzero_elements *
sizeof(Number),
1302 cudaMemcpyDeviceToDevice);
1304 P_column_index_dev = std::get<1>(cusparse_matrix);
1305 P_row_ptr_dev = std::get<2>(cusparse_matrix);
1306 const cusparseMatDescr_t mat_descr = std::get<3>(cusparse_matrix);
1309 tmp_dev.reset(Utilities::CUDA::allocate_device_data<Number>(n_rows));
1314 cusparseStatus_t status = cusparseXcsric02_bufferSize(cusparse_handle,
1326 status = cusparseXcsrsv2_bufferSize(cusparse_handle,
1327 CUSPARSE_OPERATION_NON_TRANSPOSE,
1339 status = cusparseXcsrsv2_bufferSize(cusparse_handle,
1340 CUSPARSE_OPERATION_TRANSPOSE,
1351 const int BufferSize =
1355 buffer_dev.reset(
static_cast<void *
>(
1356 Utilities::CUDA::allocate_device_data<char>(BufferSize /
sizeof(
char))));
1364 status = cusparseXcsric02_analysis(cusparse_handle,
1376 int structural_zero;
1378 cusparseXcsric02_zeroPivot(cusparse_handle, info_M, &structural_zero);
1381 status = cusparseXcsrsv2_analysis(cusparse_handle,
1382 CUSPARSE_OPERATION_TRANSPOSE,
1394 status = cusparseXcsrsv2_analysis(cusparse_handle,
1395 CUSPARSE_OPERATION_NON_TRANSPOSE,
1408 status = cusparseXcsric02(cusparse_handle,
1422 cusparseXcsric02_zeroPivot(cusparse_handle, info_M, &numerical_zero);
1428 template <
typename Number>
1441 const Number *
const src_dev = src.
get_values();
1445 cusparseStatus_t status =
1446 cusparseXcsrsv2_solve(cusparse_handle,
1447 CUSPARSE_OPERATION_NON_TRANSPOSE,
1463 status = cusparseXcsrsv2_solve(cusparse_handle,
1464 CUSPARSE_OPERATION_TRANSPOSE,
1482 template <
typename Number>
1494 template <
typename Number>
1496 bool use_level_analysis_)
1497 : use_level_analysis(use_level_analysis_)
1502 template <
typename Number>
1511 ,
policy_L(CUSPARSE_SOLVE_POLICY_USE_LEVEL)
1512 ,
policy_U(CUSPARSE_SOLVE_POLICY_USE_LEVEL)
1513 ,
policy_M(CUSPARSE_SOLVE_POLICY_USE_LEVEL)
1525 cusparseStatus_t status = cusparseCreateMatDescr(&
descr_M);
1527 status = cusparseSetMatIndexBase(
descr_M, CUSPARSE_INDEX_BASE_ZERO);
1529 status = cusparseSetMatType(
descr_M, CUSPARSE_MATRIX_TYPE_GENERAL);
1532 status = cusparseCreateMatDescr(&
descr_L);
1534 status = cusparseSetMatIndexBase(
descr_L, CUSPARSE_INDEX_BASE_ZERO);
1536 status = cusparseSetMatType(
descr_L, CUSPARSE_MATRIX_TYPE_GENERAL);
1538 status = cusparseSetMatFillMode(
descr_L, CUSPARSE_FILL_MODE_LOWER);
1540 status = cusparseSetMatDiagType(
descr_L, CUSPARSE_DIAG_TYPE_UNIT);
1543 status = cusparseCreateMatDescr(&
descr_U);
1545 status = cusparseSetMatIndexBase(
descr_U, CUSPARSE_INDEX_BASE_ZERO);
1547 status = cusparseSetMatType(
descr_U, CUSPARSE_MATRIX_TYPE_GENERAL);
1549 status = cusparseSetMatFillMode(
descr_U, CUSPARSE_FILL_MODE_UPPER);
1551 status = cusparseSetMatDiagType(
descr_U, CUSPARSE_DIAG_TYPE_NON_UNIT);
1556 status = cusparseCreateCsrilu02Info(&
info_M);
1558 status = cusparseCreateCsrsv2Info(&
info_L);
1560 status = cusparseCreateCsrsv2Info(&
info_U);
1566 template <
typename Number>
1570 cusparseStatus_t status = cusparseDestroyMatDescr(descr_M);
1573 status = cusparseDestroyMatDescr(descr_L);
1576 status = cusparseDestroyMatDescr(descr_U);
1579 status = cusparseDestroyCsrilu02Info(info_M);
1582 status = cusparseDestroyCsrsv2Info(info_L);
1585 status = cusparseDestroyCsrsv2Info(info_U);
1591 template <
typename Number>
1598 policy_L = CUSPARSE_SOLVE_POLICY_USE_LEVEL;
1599 policy_U = CUSPARSE_SOLVE_POLICY_USE_LEVEL;
1600 policy_M = CUSPARSE_SOLVE_POLICY_USE_LEVEL;
1604 policy_L = CUSPARSE_SOLVE_POLICY_NO_LEVEL;
1605 policy_U = CUSPARSE_SOLVE_POLICY_NO_LEVEL;
1606 policy_M = CUSPARSE_SOLVE_POLICY_NO_LEVEL;
1609 matrix_pointer = &
A;
1611 n_nonzero_elements =
A.n_nonzero_elements();
1614 const auto cusparse_matrix =
A.get_cusparse_matrix();
1615 const Number *
const A_val_dev = std::get<0>(cusparse_matrix);
1619 Utilities::CUDA::allocate_device_data<Number>(n_nonzero_elements));
1620 cudaError_t cuda_status = cudaMemcpy(P_val_dev.get(),
1622 n_nonzero_elements *
sizeof(Number),
1623 cudaMemcpyDeviceToDevice);
1625 P_column_index_dev = std::get<1>(cusparse_matrix);
1626 P_row_ptr_dev = std::get<2>(cusparse_matrix);
1627 const cusparseMatDescr_t mat_descr = std::get<3>(cusparse_matrix);
1630 tmp_dev.reset(Utilities::CUDA::allocate_device_data<Number>(n_rows));
1635 cusparseStatus_t status = cusparseXcsrilu02_bufferSize(cusparse_handle,
1647 status = cusparseXcsrsv2_bufferSize(cusparse_handle,
1648 CUSPARSE_OPERATION_NON_TRANSPOSE,
1660 status = cusparseXcsrsv2_bufferSize(cusparse_handle,
1661 CUSPARSE_OPERATION_NON_TRANSPOSE,
1672 const int BufferSize =
1676 buffer_dev.reset(
static_cast<void *
>(
1677 Utilities::CUDA::allocate_device_data<char>(BufferSize /
sizeof(
char))));
1685 status = cusparseXcsrilu02_analysis(cusparse_handle,
1697 int structural_zero;
1699 cusparseXcsrilu02_zeroPivot(cusparse_handle, info_M, &structural_zero);
1702 status = cusparseXcsrsv2_analysis(cusparse_handle,
1703 CUSPARSE_OPERATION_NON_TRANSPOSE,
1715 status = cusparseXcsrsv2_analysis(cusparse_handle,
1716 CUSPARSE_OPERATION_NON_TRANSPOSE,
1728 status = cusparseXcsrilu02(cusparse_handle,
1742 cusparseXcsrilu02_zeroPivot(cusparse_handle, info_M, &numerical_zero);
1748 template <
typename Number>
1761 const Number *
const src_dev = src.
get_values();
1766 cusparseStatus_t status =
1767 cusparseXcsrsv2_solve(cusparse_handle,
1768 CUSPARSE_OPERATION_NON_TRANSPOSE,
1784 status = cusparseXcsrsv2_solve(cusparse_handle,
1785 CUSPARSE_OPERATION_NON_TRANSPOSE,
1803 template <
typename Number>
cusparseSolvePolicy_t policy_M
std::unique_ptr< Number[], void(*)(Number *)> P_val_dev
void Tvmult(LinearAlgebra::CUDAWrappers::Vector< Number > &dst, const LinearAlgebra::CUDAWrappers::Vector< Number > &src) const
std::unique_ptr< Number[], void(*)(Number *)> tmp_dev
const int * P_row_ptr_dev
void initialize(const SparseMatrix< Number > &matrix, const AdditionalData &additional_data=AdditionalData())
cusparseSolvePolicy_t policy_Lt
const int * P_column_index_dev
cusparseSolvePolicy_t policy_L
void vmult(LinearAlgebra::CUDAWrappers::Vector< Number > &dst, const LinearAlgebra::CUDAWrappers::Vector< Number > &src) const
PreconditionIC(const Utilities::CUDA::Handle &handle)
std::unique_ptr< void, void(*)(void *)> buffer_dev
cusparseHandle_t cusparse_handle
cusparseMatDescr_t descr_L
cusparseMatDescr_t descr_M
cusparseMatDescr_t descr_U
const int * P_row_ptr_dev
cusparseSolvePolicy_t policy_M
void vmult(LinearAlgebra::CUDAWrappers::Vector< Number > &dst, const LinearAlgebra::CUDAWrappers::Vector< Number > &src) const
std::unique_ptr< void, void(*)(void *)> buffer_dev
void initialize(const SparseMatrix< Number > &matrix, const AdditionalData &additional_data=AdditionalData())
cusparseMatDescr_t descr_M
cusparseHandle_t cusparse_handle
cusparseSolvePolicy_t policy_U
PreconditionILU(const Utilities::CUDA::Handle &handle)
std::unique_ptr< Number[], void(*)(Number *)> P_val_dev
std::unique_ptr< Number[], void(*)(Number *)> tmp_dev
const int * P_column_index_dev
void Tvmult(LinearAlgebra::CUDAWrappers::Vector< Number > &dst, const LinearAlgebra::CUDAWrappers::Vector< Number > &src) const
cusparseMatDescr_t descr_L
cusparseSolvePolicy_t policy_L
Number * get_values() const
virtual size_type size() const override
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define AssertCusparse(error_code)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcNotInitialized()
#define Assert(cond, exc)
static ::ExceptionBase & ExcNotImplemented()
#define AssertDimension(dim1, dim2)
#define AssertNothrowCusparse(error_code)
#define AssertThrow(cond, exc)
void delete_device_data(Number *device_ptr) noexcept
AdditionalData(bool use_level_analysis=true)
AdditionalData(bool use_level_analysis=true)
static constexpr DEAL_II_HOST_DEVICE_ALWAYS_INLINE const T & value(const T &t)