Skip to content

Commit 03b47e7

Browse files
authored
[SYCLomatic] Support migration of cusparse<T>csrsm2_bufferSizeExt, cusparse<T>csrsm2_analysis and cusparse<T>csrsm2_solve (#2629)
Signed-off-by: Jiang, Zhiwei <zhiwei.jiang@intel.com>
1 parent 251a7e5 commit 03b47e7

File tree

7 files changed

+288
-17
lines changed

7 files changed

+288
-17
lines changed

clang/lib/DPCT/RuleInfra/APINamesTemplateType.inc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,10 @@ TYPE_REWRITE_ENTRY("csrsv2Info_t",
437437
TYPE_FACTORY(STR("std::shared_ptr<" +
438438
MapNames::getLibraryHelperNamespace() +
439439
"sparse::optimize_info>")))
440+
TYPE_REWRITE_ENTRY("csrsm2Info_t",
441+
TYPE_FACTORY(STR("std::shared_ptr<" +
442+
MapNames::getLibraryHelperNamespace() +
443+
"sparse::optimize_info>")))
440444
TYPE_REWRITE_ENTRY("cusparseSolvePolicy_t", TYPE_FACTORY(STR("int")))
441445
TYPE_REWRITE_ENTRY("cusparseAction_t",
442446
TYPE_FACTORY(STR(MapNames::getLibraryHelperNamespace() +

clang/lib/DPCT/RulesMathLib/APINamesCUSPARSE.inc

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,63 @@ ASSIGNABLE_FACTORY(ASSIGN_FACTORY_ENTRY("cusparseCreateCsrsv2Info", DEREF(0),
518518
ASSIGNABLE_FACTORY(MEMBER_CALL_FACTORY_ENTRY("cusparseDestroyCsrsv2Info",
519519
ARG(0), false, "reset"))
520520

521+
ASSIGNABLE_FACTORY(ASSIGN_FACTORY_ENTRY(
522+
"cusparseCreateCsrsm2Info", DEREF(0),
523+
CALL("std::make_shared<" + MapNames::getLibraryHelperNamespace() +
524+
"sparse::optimize_info>")))
525+
ASSIGNABLE_FACTORY(MEMBER_CALL_FACTORY_ENTRY("cusparseDestroyCsrsm2Info",
526+
ARG(0), false, "reset"))
527+
528+
ASSIGNABLE_FACTORY(ASSIGN_FACTORY_ENTRY("cusparseScsrsm2_bufferSizeExt",
529+
DEREF(16), LITERAL("0")))
530+
ASSIGNABLE_FACTORY(ASSIGN_FACTORY_ENTRY("cusparseDcsrsm2_bufferSizeExt",
531+
DEREF(16), LITERAL("0")))
532+
ASSIGNABLE_FACTORY(ASSIGN_FACTORY_ENTRY("cusparseCcsrsm2_bufferSizeExt",
533+
DEREF(16), LITERAL("0")))
534+
ASSIGNABLE_FACTORY(ASSIGN_FACTORY_ENTRY("cusparseZcsrsm2_bufferSizeExt",
535+
DEREF(16), LITERAL("0")))
536+
ASSIGNABLE_FACTORY(CALL_FACTORY_ENTRY(
537+
"cusparseScsrsm2_analysis",
538+
CALL(MapNames::getLibraryHelperNamespace() + "sparse::optimize_csrsm",
539+
MEMBER_CALL(ARG(0), true, "get_queue"), ARG(2), ARG(3), ARG(4), ARG(5),
540+
ARG(8), ARG(9), ARG(10), ARG(11), ARG(14))))
541+
ASSIGNABLE_FACTORY(CALL_FACTORY_ENTRY(
542+
"cusparseDcsrsm2_analysis",
543+
CALL(MapNames::getLibraryHelperNamespace() + "sparse::optimize_csrsm",
544+
MEMBER_CALL(ARG(0), true, "get_queue"), ARG(2), ARG(3), ARG(4), ARG(5),
545+
ARG(8), ARG(9), ARG(10), ARG(11), ARG(14))))
546+
ASSIGNABLE_FACTORY(CALL_FACTORY_ENTRY(
547+
"cusparseCcsrsm2_analysis",
548+
CALL(MapNames::getLibraryHelperNamespace() + "sparse::optimize_csrsm",
549+
MEMBER_CALL(ARG(0), true, "get_queue"), ARG(2), ARG(3), ARG(4), ARG(5),
550+
ARG(8), ARG(9), ARG(10), ARG(11), ARG(14))))
551+
ASSIGNABLE_FACTORY(CALL_FACTORY_ENTRY(
552+
"cusparseZcsrsm2_analysis",
553+
CALL(MapNames::getLibraryHelperNamespace() + "sparse::optimize_csrsm",
554+
MEMBER_CALL(ARG(0), true, "get_queue"), ARG(2), ARG(3), ARG(4), ARG(5),
555+
ARG(8), ARG(9), ARG(10), ARG(11), ARG(14))))
556+
557+
ASSIGNABLE_FACTORY(CALL_FACTORY_ENTRY(
558+
"cusparseScsrsm2_solve",
559+
CALL(MapNames::getLibraryHelperNamespace() + "sparse::csrsm",
560+
MEMBER_CALL(ARG(0), true, "get_queue"), ARG(2), ARG(3), ARG(4), ARG(5),
561+
ARG(7), ARG(8), ARG(9), ARG(10), ARG(11), ARG(12), ARG(13), ARG(14))))
562+
ASSIGNABLE_FACTORY(CALL_FACTORY_ENTRY(
563+
"cusparseDcsrsm2_solve",
564+
CALL(MapNames::getLibraryHelperNamespace() + "sparse::csrsm",
565+
MEMBER_CALL(ARG(0), true, "get_queue"), ARG(2), ARG(3), ARG(4), ARG(5),
566+
ARG(7), ARG(8), ARG(9), ARG(10), ARG(11), ARG(12), ARG(13), ARG(14))))
567+
ASSIGNABLE_FACTORY(CALL_FACTORY_ENTRY(
568+
"cusparseCcsrsm2_solve",
569+
CALL(MapNames::getLibraryHelperNamespace() + "sparse::csrsm",
570+
MEMBER_CALL(ARG(0), true, "get_queue"), ARG(2), ARG(3), ARG(4), ARG(5),
571+
ARG(7), ARG(8), ARG(9), ARG(10), ARG(11), ARG(12), ARG(13), ARG(14))))
572+
ASSIGNABLE_FACTORY(CALL_FACTORY_ENTRY(
573+
"cusparseZcsrsm2_solve",
574+
CALL(MapNames::getLibraryHelperNamespace() + "sparse::csrsm",
575+
MEMBER_CALL(ARG(0), true, "get_queue"), ARG(2), ARG(3), ARG(4), ARG(5),
576+
ARG(7), ARG(8), ARG(9), ARG(10), ARG(11), ARG(12), ARG(13), ARG(14))))
577+
521578
ASSIGNABLE_FACTORY(ASSIGN_FACTORY_ENTRY("cusparseSpSM_bufferSize", DEREF(10),
522579
LITERAL("0")))
523580
REMOVE_API_FACTORY_ENTRY("cusparseSpSM_createDescr")

clang/lib/DPCT/RulesMathLib/SpBLASAPIMigration.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ using namespace clang::ast_matchers;
2020
void SpBLASTypeLocRule::registerMatcher(ast_matchers::MatchFinder &MF) {
2121
auto TargetTypeName = [&]() {
2222
return hasAnyName("csrsv2Info_t", "cusparseSolvePolicy_t",
23-
"cusparseAction_t", "csrgemm2Info_t");
23+
"cusparseAction_t", "csrgemm2Info_t", "csrsm2Info_t");
2424
};
2525

2626
MF.addMatcher(
@@ -41,8 +41,6 @@ void SpBLASTypeLocRule::runRule(
4141

4242
// Rule for spBLAS function calls.
4343
void SPBLASFunctionCallRule::registerMatcher(MatchFinder &MF) {
44-
45-
4644
auto functionName = [&]() {
4745
return hasAnyName(
4846
/*management*/
@@ -80,6 +78,13 @@ void SPBLASFunctionCallRule::registerMatcher(MatchFinder &MF) {
8078
"cusparseScsrgemm", "cusparseDcsrgemm", "cusparseCcsrgemm",
8179
"cusparseZcsrgemm", "cusparseXcsrgemmNnz", "cusparseScsrmm2",
8280
"cusparseDcsrmm2", "cusparseCcsrmm2", "cusparseZcsrmm2",
81+
"cusparseCreateCsrsm2Info", "cusparseDestroyCsrsm2Info",
82+
"cusparseScsrsm2_bufferSizeExt", "cusparseDcsrsm2_bufferSizeExt",
83+
"cusparseCcsrsm2_bufferSizeExt", "cusparseZcsrsm2_bufferSizeExt",
84+
"cusparseScsrsm2_analysis", "cusparseDcsrsm2_analysis",
85+
"cusparseCcsrsm2_analysis", "cusparseZcsrsm2_analysis",
86+
"cusparseScsrsm2_solve", "cusparseDcsrsm2_solve",
87+
"cusparseCcsrsm2_solve", "cusparseZcsrsm2_solve",
8388
"cusparseScsrgemm2_bufferSizeExt", "cusparseDcsrgemm2_bufferSizeExt",
8489
"cusparseCcsrgemm2_bufferSizeExt", "cusparseZcsrgemm2_bufferSizeExt",
8590
"cusparseXcsrgemm2Nnz", "cusparseScsrgemm2", "cusparseDcsrgemm2",

clang/lib/DPCT/SrcAPI/APINames_cuSPARSE.inc

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ ENTRY(cusparseSetStream, cusparseSetStream, true, NO_FLAG, P4, "Successful")
5656
ENTRY(cusparseGetStream, cusparseGetStream, true, NO_FLAG, P4, "Successful")
5757
ENTRY(cusparseCreateCsrsv2Info, cusparseCreateCsrsv2Info, true, NO_FLAG, P4, "comment")
5858
ENTRY(cusparseDestroyCsrsv2Info, cusparseDestroyCsrsv2Info, true, NO_FLAG, P4, "comment")
59-
ENTRY(cusparseCreateCsrsm2Info, cusparseCreateCsrsm2Info, false, NO_FLAG, P4, "comment")
60-
ENTRY(cusparseDestroyCsrsm2Info, cusparseDestroyCsrsm2Info, false, NO_FLAG, P4, "comment")
59+
ENTRY(cusparseCreateCsrsm2Info, cusparseCreateCsrsm2Info, true, NO_FLAG, P4, "Successful")
60+
ENTRY(cusparseDestroyCsrsm2Info, cusparseDestroyCsrsm2Info, true, NO_FLAG, P4, "Successful")
6161
ENTRY(cusparseCreateCsric02Info, cusparseCreateCsric02Info, false, NO_FLAG, P4, "comment")
6262
ENTRY(cusparseDestroyCsric02Info, cusparseDestroyCsric02Info, false, NO_FLAG, P4, "comment")
6363
ENTRY(cusparseCreateCsrilu02Info, cusparseCreateCsrilu02Info, false, NO_FLAG, P4, "comment")
@@ -211,18 +211,18 @@ ENTRY(cusparseScsrsm_solve, cusparseScsrsm_solve, false, NO_FLAG, P4, "comment")
211211
ENTRY(cusparseDcsrsm_solve, cusparseDcsrsm_solve, false, NO_FLAG, P4, "comment")
212212
ENTRY(cusparseCcsrsm_solve, cusparseCcsrsm_solve, false, NO_FLAG, P4, "comment")
213213
ENTRY(cusparseZcsrsm_solve, cusparseZcsrsm_solve, false, NO_FLAG, P4, "comment")
214-
ENTRY(cusparseScsrsm2_bufferSizeExt, cusparseScsrsm2_bufferSizeExt, false, NO_FLAG, P4, "comment")
215-
ENTRY(cusparseDcsrsm2_bufferSizeExt, cusparseDcsrsm2_bufferSizeExt, false, NO_FLAG, P4, "comment")
216-
ENTRY(cusparseCcsrsm2_bufferSizeExt, cusparseCcsrsm2_bufferSizeExt, false, NO_FLAG, P4, "comment")
217-
ENTRY(cusparseZcsrsm2_bufferSizeExt, cusparseZcsrsm2_bufferSizeExt, false, NO_FLAG, P4, "comment")
218-
ENTRY(cusparseScsrsm2_analysis, cusparseScsrsm2_analysis, false, NO_FLAG, P4, "comment")
219-
ENTRY(cusparseDcsrsm2_analysis, cusparseDcsrsm2_analysis, false, NO_FLAG, P4, "comment")
220-
ENTRY(cusparseCcsrsm2_analysis, cusparseCcsrsm2_analysis, false, NO_FLAG, P4, "comment")
221-
ENTRY(cusparseZcsrsm2_analysis, cusparseZcsrsm2_analysis, false, NO_FLAG, P4, "comment")
222-
ENTRY(cusparseScsrsm2_solve, cusparseScsrsm2_solve, false, NO_FLAG, P4, "comment")
223-
ENTRY(cusparseDcsrsm2_solve, cusparseDcsrsm2_solve, false, NO_FLAG, P4, "comment")
224-
ENTRY(cusparseCcsrsm2_solve, cusparseCcsrsm2_solve, false, NO_FLAG, P4, "comment")
225-
ENTRY(cusparseZcsrsm2_solve, cusparseZcsrsm2_solve, false, NO_FLAG, P4, "comment")
214+
ENTRY(cusparseScsrsm2_bufferSizeExt, cusparseScsrsm2_bufferSizeExt, true, NO_FLAG, P4, "Successful")
215+
ENTRY(cusparseDcsrsm2_bufferSizeExt, cusparseDcsrsm2_bufferSizeExt, true, NO_FLAG, P4, "Successful")
216+
ENTRY(cusparseCcsrsm2_bufferSizeExt, cusparseCcsrsm2_bufferSizeExt, true, NO_FLAG, P4, "Successful")
217+
ENTRY(cusparseZcsrsm2_bufferSizeExt, cusparseZcsrsm2_bufferSizeExt, true, NO_FLAG, P4, "Successful")
218+
ENTRY(cusparseScsrsm2_analysis, cusparseScsrsm2_analysis, true, NO_FLAG, P4, "Successful")
219+
ENTRY(cusparseDcsrsm2_analysis, cusparseDcsrsm2_analysis, true, NO_FLAG, P4, "Successful")
220+
ENTRY(cusparseCcsrsm2_analysis, cusparseCcsrsm2_analysis, true, NO_FLAG, P4, "Successful")
221+
ENTRY(cusparseZcsrsm2_analysis, cusparseZcsrsm2_analysis, true, NO_FLAG, P4, "Successful")
222+
ENTRY(cusparseScsrsm2_solve, cusparseScsrsm2_solve, true, NO_FLAG, P4, "Successful")
223+
ENTRY(cusparseDcsrsm2_solve, cusparseDcsrsm2_solve, true, NO_FLAG, P4, "Successful")
224+
ENTRY(cusparseCcsrsm2_solve, cusparseCcsrsm2_solve, true, NO_FLAG, P4, "Successful")
225+
ENTRY(cusparseZcsrsm2_solve, cusparseZcsrsm2_solve, true, NO_FLAG, P4, "Successful")
226226
ENTRY(cusparseXcsrsm2_zeroPivot, cusparseXcsrsm2_zeroPivot, false, NO_FLAG, P4, "comment")
227227
ENTRY(cusparseSgemmi, cusparseSgemmi, false, NO_FLAG, P4, "comment")
228228
ENTRY(cusparseDgemmi, cusparseDgemmi, false, NO_FLAG, P4, "comment")

clang/runtime/dpct-rt/include/dpct/detail/sparse_utils_detail.hpp

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,85 @@ template <typename T> struct csrsv_impl {
223223
}
224224
};
225225

226+
template <typename T> struct optimize_csrsm_impl {
227+
void operator()(sycl::queue &queue, oneapi::mkl::transpose transa,
228+
oneapi::mkl::transpose transb, int row_col, int nrhs,
229+
const std::shared_ptr<matrix_info> info, const void *val,
230+
const int *row_ptr, const int *col_ind,
231+
std::shared_ptr<optimize_info> optimize_info) {
232+
using Ty = typename ::dpct::detail::lib_data_traits_t<T>;
233+
auto temp_row_ptr = dpct::detail::get_memory<int>(row_ptr);
234+
auto temp_col_ind = dpct::detail::get_memory<int>(col_ind);
235+
auto temp_val = dpct::detail::get_memory<Ty>(val);
236+
#ifdef DPCT_USM_LEVEL_NONE
237+
optimize_info->_row_ptr_buf = temp_row_ptr;
238+
optimize_info->_col_ind_buf = temp_col_ind;
239+
optimize_info->_val_buf = temp_val;
240+
auto &data_row_ptr = optimize_info->_row_ptr_buf;
241+
auto &data_col_ind = optimize_info->_col_ind_buf;
242+
auto &data_val = std::get<sycl::buffer<Ty>>(optimize_info->_val_buf);
243+
#else
244+
auto data_row_ptr = temp_row_ptr;
245+
auto data_col_ind = temp_col_ind;
246+
auto data_val = temp_val;
247+
#endif
248+
oneapi::mkl::sparse::set_csr_data(queue, optimize_info->get_matrix_handle(),
249+
row_col, row_col, info->get_index_base(),
250+
data_row_ptr, data_col_ind, data_val);
251+
if (info->get_matrix_type() != matrix_info::matrix_type::tr)
252+
throw std::runtime_error("dpct::sparse::optimize_csrsv_impl()(): "
253+
"oneapi::mkl::sparse::optimize_trsm "
254+
"only accept triangular matrix.");
255+
SPARSE_CALL(oneapi::mkl::sparse::optimize_trsm(
256+
queue,
257+
transb == oneapi::mkl::transpose::nontrans
258+
? oneapi::mkl::layout::col_major
259+
: oneapi::mkl::layout::row_major,
260+
info->get_uplo(), transa, info->get_diag(),
261+
optimize_info->get_matrix_handle(), nrhs),
262+
optimize_info);
263+
}
264+
};
265+
template <typename T> struct csrsm_impl {
266+
void operator()(sycl::queue &queue, oneapi::mkl::transpose transa,
267+
oneapi::mkl::transpose transb, int row_col, int nrhs,
268+
const void *alpha, const std::shared_ptr<matrix_info> info,
269+
const void *val, const int *row_ptr, const int *col_ind,
270+
void *b, int ldb,
271+
std::shared_ptr<optimize_info> optimize_info) {
272+
using Ty = typename ::dpct::detail::lib_data_traits_t<T>;
273+
auto alpha_value =
274+
dpct::detail::get_value(static_cast<const Ty *>(alpha), queue);
275+
auto data_b = dpct::detail::get_memory<Ty>(b);
276+
277+
int x_size =
278+
ldb * (transb == oneapi::mkl::transpose::nontrans ? nrhs : row_col);
279+
Ty *x = (Ty *)::dpct::cs::malloc(sizeof(Ty) * x_size, queue);
280+
281+
auto data_x = dpct::detail::get_memory<Ty>(x);
282+
283+
sycl::event e1;
284+
#ifndef DPCT_USM_LEVEL_NONE
285+
e1 =
286+
#endif
287+
oneapi::mkl::sparse::trsm(
288+
queue,
289+
transb == oneapi::mkl::transpose::nontrans
290+
? oneapi::mkl::layout::col_major
291+
: oneapi::mkl::layout::row_major,
292+
transa, oneapi::mkl::transpose::nontrans, info->get_uplo(),
293+
info->get_diag(), alpha_value, optimize_info->get_matrix_handle(),
294+
data_b, nrhs, ldb, data_x, ldb);
295+
296+
sycl::event e2 =
297+
::dpct::cs::memcpy(queue, b, x, sizeof(Ty) * x_size,
298+
::dpct::cs::memcpy_direction::automatic, {e1});
299+
300+
sycl::event e3 = ::dpct::cs::enqueue_free({x}, {e2}, queue);
301+
optimize_info->add_dependency(e3);
302+
}
303+
};
304+
226305
template <typename T> struct spmv_impl {
227306
void operator()(sycl::queue &queue, oneapi::mkl::transpose trans,
228307
const void *alpha, sparse_matrix_desc_t a,

clang/runtime/dpct-rt/include/dpct/sparse_utils.hpp

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ enum class conversion_scope : int { index = 0, index_and_value };
5050
// Forward declaration
5151
namespace detail {
5252
template <typename T> struct optimize_csrsv_impl;
53+
template <typename T> struct optimize_csrsm_impl;
5354
}
5455

5556
/// Saving the optimization information for solving a system of linear
@@ -74,6 +75,7 @@ class optimize_info {
7475
}
7576
#ifdef DPCT_USM_LEVEL_NONE
7677
template <typename T> friend struct detail::optimize_csrsv_impl;
78+
template <typename T> friend struct detail::optimize_csrsm_impl;
7779
#endif
7880

7981
private:
@@ -830,6 +832,62 @@ inline void csrsv(sycl::queue &queue, oneapi::mkl::transpose trans, int row_col,
830832
optimize_info, x, y);
831833
}
832834

835+
/// Performs internal optimizations for dpct::sparse::csrsm by analyzing
836+
/// the provided matrix structure and operation parameters. The matrix A must be
837+
/// a triangular sparse matrix with the CSR format.
838+
/// \param [in] queue The queue where the routine should be executed. It must
839+
/// have the in_order property when using the USM mode.
840+
/// \param [in] transa The operation applied to A.
841+
/// \param [in] transb The operation applied to B and X.
842+
/// \param [in] row_col Number of rows and columns of A.
843+
/// \param [in] nrhs Number of columns op_b(B).
844+
/// \param [in] info Matrix info of A.
845+
/// \param [in] val An array containing the non-zero elements of A.
846+
/// \param [in] row_ptr An array of length \p num_rows + 1.
847+
/// \param [in] col_ind An array containing the column indices in index-based
848+
/// numbering.
849+
/// \param [out] optimize_info The result of the optimizations.
850+
template <typename T>
851+
void optimize_csrsm(sycl::queue &queue, oneapi::mkl::transpose transa,
852+
oneapi::mkl::transpose transb, int row_col, int nrhs,
853+
const std::shared_ptr<matrix_info> info, const T *val,
854+
const int *row_ptr, const int *col_ind,
855+
std::shared_ptr<optimize_info> optimize_info) {
856+
detail::optimize_csrsm_impl<T>()(queue, transa, transb, row_col, nrhs, info,
857+
val, row_ptr, col_ind, optimize_info);
858+
}
859+
860+
/// Solves the sparse triangular system op_a(A) * op_b(X) = alpha * op_b(B).
861+
/// A is a sparse triangular matrix with the CSR format of size \p row_col
862+
/// by \p row_col .
863+
/// B is a dense matrix of size \p row_col by \p nrhs ( \p transb is nontrans)
864+
/// or \p nrhs by \p row_col ( \p transb isn't nontrans).
865+
/// X is the solution dense matrix.
866+
/// \param [in] queue The queue where the routine should be executed. It must
867+
/// have the in_order property when using the USM mode.
868+
/// \param [in] transa The operation applied to A.
869+
/// \param [in] transb The operation applied to B and X.
870+
/// \param [in] row_col Number of rows and columns of A.
871+
/// \param [in] nrhs Number of columns op_b(B).
872+
/// \param [in] alpha Specifies the scalar.
873+
/// \param [in] info Matrix info of A.
874+
/// \param [in] val An array containing the non-zero elements of A.
875+
/// \param [in] row_ptr An array of length \p num_rows + 1.
876+
/// \param [in] col_ind An array containing the column indices in index-based
877+
/// numbering.
878+
/// \param [in, out] b The RHS matrix. It will be overwritten by the X.
879+
/// \param [in] ldb The leading dimension of B and X.
880+
/// \param [in] optimize_info The result of the optimizations.
881+
template <typename T>
882+
void csrsm(sycl::queue &queue, oneapi::mkl::transpose transa,
883+
oneapi::mkl::transpose transb, int row_col, int nrhs, const T *alpha,
884+
const std::shared_ptr<matrix_info> info, const T *val,
885+
const int *row_ptr, const int *col_ind, T *b, int ldb,
886+
std::shared_ptr<optimize_info> optimize_info) {
887+
detail::csrsm_impl<T>()(queue, transa, transb, row_col, nrhs, alpha, info,
888+
val, row_ptr, col_ind, b, ldb, optimize_info);
889+
}
890+
833891
/// Computes a sparse matrix-dense vector product: y = alpha * op(a) * x + beta * y.
834892
/// \param [in] queue The queue where the routine should be executed. It must
835893
/// have the in_order property when using the USM mode.

0 commit comments

Comments
 (0)