From 0bda0f6734b4ff2d2e8d1df2982eea883781bb4e Mon Sep 17 00:00:00 2001 From: Spencer Patty Date: Mon, 24 Feb 2025 10:43:15 -0800 Subject: [PATCH 1/3] [ONEMKL_IESPBLAS] Adding new backend using oneMKL Inspector Executor Sparse BLAS C apis --- include/spblas/detail/operation_info_t.hpp | 16 ++ include/spblas/detail/types.hpp | 4 + include/spblas/spblas.hpp | 3 +- .../vendor/onemkl_iespblas/algorithms.hpp | 5 + .../vendor/onemkl_iespblas/mkl_wrappers.hpp | 134 +++++++++++++++ .../onemkl_iespblas/onemkl_iespblas.hpp | 5 + .../onemkl_iespblas/operation_state_t.hpp | 53 ++++++ .../vendor/onemkl_iespblas/spgemm_impl.hpp | 156 ++++++++++++++++++ .../vendor/onemkl_iespblas/spmm_impl.hpp | 80 +++++++++ .../vendor/onemkl_iespblas/spmv_impl.hpp | 71 ++++++++ .../spblas/vendor/onemkl_iespblas/types.hpp | 11 ++ 11 files changed, 537 insertions(+), 1 deletion(-) create mode 100644 include/spblas/vendor/onemkl_iespblas/algorithms.hpp create mode 100644 include/spblas/vendor/onemkl_iespblas/mkl_wrappers.hpp create mode 100644 include/spblas/vendor/onemkl_iespblas/onemkl_iespblas.hpp create mode 100644 include/spblas/vendor/onemkl_iespblas/operation_state_t.hpp create mode 100644 include/spblas/vendor/onemkl_iespblas/spgemm_impl.hpp create mode 100644 include/spblas/vendor/onemkl_iespblas/spmm_impl.hpp create mode 100644 include/spblas/vendor/onemkl_iespblas/spmv_impl.hpp create mode 100644 include/spblas/vendor/onemkl_iespblas/types.hpp diff --git a/include/spblas/detail/operation_info_t.hpp b/include/spblas/detail/operation_info_t.hpp index f91856a..e113de4 100644 --- a/include/spblas/detail/operation_info_t.hpp +++ b/include/spblas/detail/operation_info_t.hpp @@ -3,6 +3,10 @@ #include #include +#ifdef SPBLAS_ENABLE_ONEMKL_IESPBLAS +#include +#endif + #ifdef SPBLAS_ENABLE_ONEMKL_SYCL #include #endif @@ -28,6 +32,13 @@ class operation_info_t { operation_info_t(index<> result_shape, offset_t result_nnz) : result_shape_(result_shape), result_nnz_(result_nnz) {} +#ifdef SPBLAS_ENABLE_ONEMKL_IESPBLAS + operation_info_t(index<> result_shape, offset_t result_nnz, + __mkl_iespblas::operation_state_t&& state) + : result_shape_(result_shape), result_nnz_(result_nnz), + state_(std::move(state)) {} +#endif + #ifdef SPBLAS_ENABLE_ONEMKL_SYCL operation_info_t(index<> result_shape, offset_t result_nnz, __mkl::operation_state_t&& state) @@ -51,6 +62,11 @@ class operation_info_t { index<> result_shape_; offset_t result_nnz_; +#ifdef SPBLAS_ENABLE_ONEMKL_IESPBLAS +public: + __mkl_iespblas::operation_state_t state_; +#endif + #ifdef SPBLAS_ENABLE_ONEMKL_SYCL public: __mkl::operation_state_t state_; diff --git a/include/spblas/detail/types.hpp b/include/spblas/detail/types.hpp index 5b58bd6..1a486fd 100644 --- a/include/spblas/detail/types.hpp +++ b/include/spblas/detail/types.hpp @@ -3,6 +3,10 @@ #include #include +#ifdef SPBLAS_ENABLE_ONEMKL_IESPBLAS +#include +#endif + #ifdef SPBLAS_ENABLE_ONEMKL_SYCL #include #endif diff --git a/include/spblas/spblas.hpp b/include/spblas/spblas.hpp index b177858..b5758f8 100644 --- a/include/spblas/spblas.hpp +++ b/include/spblas/spblas.hpp @@ -1,6 +1,7 @@ #pragma once -#if defined(SPBLAS_ENABLE_ONEMKL_SYCL) || defined(SPBLAS_ENABLE_ARMPL) +#if defined(SPBLAS_ENABLE_ONEMKL_SYCL) || defined(SPBLAS_ENABLE_ONEMKL_IESPBLAS) || \ + defined(SPBLAS_ENABLE_ARMPL) #define SPBLAS_VENDOR_BACKEND true #endif diff --git a/include/spblas/vendor/onemkl_iespblas/algorithms.hpp b/include/spblas/vendor/onemkl_iespblas/algorithms.hpp new file mode 100644 index 0000000..1734337 --- /dev/null +++ b/include/spblas/vendor/onemkl_iespblas/algorithms.hpp @@ -0,0 +1,5 @@ +#pragma once + +#include "spmv_impl.hpp" +#include "spmm_impl.hpp" +#include "spgemm_impl.hpp" diff --git a/include/spblas/vendor/onemkl_iespblas/mkl_wrappers.hpp b/include/spblas/vendor/onemkl_iespblas/mkl_wrappers.hpp new file mode 100644 index 0000000..87693eb --- /dev/null +++ b/include/spblas/vendor/onemkl_iespblas/mkl_wrappers.hpp @@ -0,0 +1,134 @@ +#pragma once + +#include +#include "mkl.h" + +// +// Add several templated functions for mapping from data_type to C style IE Sparse BLAS APIs +// + + +namespace spblas { +namespace __mkl_iespblas { + +// +// mkl_sparse_create_csr +// +template +inline sparse_status_t mkl_sparse_create_csr( sparse_matrix_t *csrA, const sparse_index_base_t indexing, + const MKL_INT nrows, const MKL_INT ncols, MKL_INT *rowptr_st, + MKL_INT *rowptr_en, MKL_INT *colind, T *values) +{ + std::cout << "mkl_sparse_create_csr data types are not supported" << std::endl; + return SPARSE_STATUS_NOT_SUPPORTED; +} + +template<> +inline sparse_status_t mkl_sparse_create_csr( sparse_matrix_t *csrA, const sparse_index_base_t indexing, + const MKL_INT nrows, const MKL_INT ncols, MKL_INT *rowptr_st, + MKL_INT *rowptr_en, MKL_INT *colind, float *values) +{ + return mkl_sparse_s_create_csr(csrA, indexing, nrows, ncols, rowptr_st, rowptr_en, colind, values); +} + +template<> +inline sparse_status_t mkl_sparse_create_csr( sparse_matrix_t *csrA, const sparse_index_base_t indexing, + const MKL_INT nrows, const MKL_INT ncols, MKL_INT *rowptr_st, + MKL_INT *rowptr_en, MKL_INT *colind, double *values) +{ + return mkl_sparse_d_create_csr(csrA, indexing, nrows, ncols, rowptr_st, rowptr_en, colind, values); +} + + +// +// mkl_sparse_export_csr +// + +template +inline sparse_status_t mkl_sparse_export_csr( const sparse_matrix_t csrA, sparse_index_base_t *indexing, + MKL_INT *nrows, MKL_INT *ncols, MKL_INT **rowptr_st, + MKL_INT **rowptr_en, MKL_INT **colind, T **values) +{ + std::cout << "mkl_sparse_export_csr data types are not supported" << std::endl; + return SPARSE_STATUS_NOT_SUPPORTED; +} + +template<> +inline sparse_status_t mkl_sparse_export_csr( const sparse_matrix_t csrA, sparse_index_base_t *indexing, + MKL_INT *nrows, MKL_INT *ncols, MKL_INT **rowptr_st, + MKL_INT **rowptr_en, MKL_INT **colind, float **values) +{ + return mkl_sparse_s_export_csr(csrA, indexing, nrows, ncols, rowptr_st, rowptr_en, colind, values); +} + +template<> +inline sparse_status_t mkl_sparse_export_csr( const sparse_matrix_t csrA, sparse_index_base_t *indexing, + MKL_INT *nrows, MKL_INT *ncols, MKL_INT **rowptr_st, + MKL_INT **rowptr_en, MKL_INT **colind, double **values) +{ + return mkl_sparse_d_export_csr(csrA, indexing, nrows, ncols, rowptr_st, rowptr_en, colind, values); +} + + +// +// mkl_sparse_mv +// +template +inline sparse_status_t mkl_sparse_mv( const sparse_operation_t op, const T alpha, const sparse_matrix_t csrA, + const struct matrix_descr descr, const T* x, const T beta, T* y) +{ + std::cout << "mkl_sparse_mv data types are not supported" << std::endl; + return SPARSE_STATUS_NOT_SUPPORTED; +} + +template<> +inline sparse_status_t mkl_sparse_mv( const sparse_operation_t op, const float alpha, const sparse_matrix_t csrA, + const struct matrix_descr descr, const float* x, const float beta, float* y) +{ + return mkl_sparse_s_mv(op, alpha, csrA, descr, x, beta, y); +} + +template<> +inline sparse_status_t mkl_sparse_mv( const sparse_operation_t op, const double alpha, const sparse_matrix_t csrA, + const struct matrix_descr descr, const double* x, const double beta, double* y) +{ + return mkl_sparse_d_mv(op, alpha, csrA, descr, x, beta, y); +} + + +// +// mkl_sparse_mm +// +template +inline sparse_status_t mkl_sparse_mm( const sparse_operation_t op, const T alpha, const sparse_matrix_t csrA, + const struct matrix_descr descr, const sparse_layout_t layout, + const T* x, const index_t nrhs, const index_t ldx, const T beta, T* y, const index_t ldy) +{ + std::cout << "mkl_sparse_mm data types are not supported" << std::endl; + return SPARSE_STATUS_NOT_SUPPORTED; +} + +template<> +inline sparse_status_t mkl_sparse_mm( const sparse_operation_t op, const float alpha, const sparse_matrix_t csrA, + const struct matrix_descr descr, const sparse_layout_t layout, + const float* x, const index_t nrhs, const index_t ldx, const float beta, float* y, const index_t ldy) +{ + return mkl_sparse_s_mm(op, alpha, csrA, descr, layout, x, nrhs, ldx, beta, y, ldy); +} + +template<> +inline sparse_status_t mkl_sparse_mm( const sparse_operation_t op, const double alpha, const sparse_matrix_t csrA, + const struct matrix_descr descr, const sparse_layout_t layout, + const double* x, const index_t nrhs, const index_t ldx, const double beta, double* y, const index_t ldy) +{ + return mkl_sparse_d_mm(op, alpha, csrA, descr, layout, x, nrhs, ldx, beta, y, ldy); +} + + + +} // namespace __mkl_iespblas +} // namespace spblas + + + + diff --git a/include/spblas/vendor/onemkl_iespblas/onemkl_iespblas.hpp b/include/spblas/vendor/onemkl_iespblas/onemkl_iespblas.hpp new file mode 100644 index 0000000..e1d377a --- /dev/null +++ b/include/spblas/vendor/onemkl_iespblas/onemkl_iespblas.hpp @@ -0,0 +1,5 @@ +#pragma once + +#include "algorithms.hpp" +#include + diff --git a/include/spblas/vendor/onemkl_iespblas/operation_state_t.hpp b/include/spblas/vendor/onemkl_iespblas/operation_state_t.hpp new file mode 100644 index 0000000..cb1e3bb --- /dev/null +++ b/include/spblas/vendor/onemkl_iespblas/operation_state_t.hpp @@ -0,0 +1,53 @@ +#pragma once + +#include "mkl.h" + +namespace spblas { + +namespace __mkl_iespblas{ + +struct operation_state_t { + sparse_matrix_t a_handle = nullptr; + sparse_matrix_t b_handle = nullptr; + sparse_matrix_t c_handle = nullptr; + + operation_state_t() = default; + + operation_state_t(sparse_matrix_t a_handle, + sparse_matrix_t b_handle, + sparse_matrix_t c_handle) + : a_handle(a_handle), b_handle(b_handle), c_handle(c_handle) {} + + operation_state_t(operation_state_t&& other) { + *this = std::move(other); + } + + operation_state_t& operator=(operation_state_t&& other) { + a_handle = other.a_handle; + b_handle = other.b_handle; + c_handle = other.c_handle; + + other.a_handle = other.b_handle = other.c_handle = nullptr; + + return *this; + } + + operation_state_t(const operation_state_t& other) = delete; + + ~operation_state_t() { + release_matrix_handle(a_handle); + release_matrix_handle(b_handle); + release_matrix_handle(c_handle); + } + +private: + void release_matrix_handle(sparse_matrix_t handle) { + if (handle != nullptr) { + mkl_sparse_destroy(handle); + } + } +}; + +} // namespace __mkl_iespblas + +} // namespace spblas diff --git a/include/spblas/vendor/onemkl_iespblas/spgemm_impl.hpp b/include/spblas/vendor/onemkl_iespblas/spgemm_impl.hpp new file mode 100644 index 0000000..bbf0ff2 --- /dev/null +++ b/include/spblas/vendor/onemkl_iespblas/spgemm_impl.hpp @@ -0,0 +1,156 @@ +#pragma once + +#include // aligned_alloc +#include +#include "mkl.h" + +#include + +#include "mkl_wrappers.hpp" +#include +#include +#include + +// +// Defines the following APIs for SpGEMM: +// +// C = op(A) * op(B) +// +// where A,B and C are sparse matrices of CSR format +// +// operation_info_t multiply_inspect(A, B, C) +// void multiply_execute(operation_info_t, A, B, C) +// + + + +namespace spblas { + + +template + requires __detail::has_csr_base && __detail::has_csr_base && + __detail::is_csr_view_v +operation_info_t multiply_inspect(A&& a, B&& b, C&& c) +{ + log_trace(""); + auto a_base = __detail::get_ultimate_base(a); + auto b_base = __detail::get_ultimate_base(b); + + using T = tensor_scalar_t; + using I = tensor_index_t; + using O = tensor_offset_t; + + sparse_matrix_t csrA = nullptr; + struct matrix_descr descrA; + descrA.type = SPARSE_MATRIX_TYPE_GENERAL; + sparse_index_base_t indexingA = SPARSE_INDEX_BASE_ZERO; + sparse_operation_t opA = SPARSE_OPERATION_NON_TRANSPOSE; + const index_t a_nrows = __backend::shape(a_base)[0]; + const index_t a_ncols = __backend::shape(a_base)[1]; + + sparse_matrix_t csrB = nullptr; + struct matrix_descr descrB; + descrB.type = SPARSE_MATRIX_TYPE_GENERAL; + sparse_index_base_t indexingB = SPARSE_INDEX_BASE_ZERO; + sparse_operation_t opB = SPARSE_OPERATION_NON_TRANSPOSE; + const index_t b_nrows = __backend::shape(b_base)[0]; + const index_t b_ncols = __backend::shape(b_base)[1]; + + sparse_matrix_t csrC = nullptr; + sparse_index_base_t indexingC = SPARSE_INDEX_BASE_ZERO; + index_t c_nrows = 0, c_ncols = 0; + offset_t c_nnz = -1; + offset_t *c_rowptr_st = nullptr, *c_rowptr_en = nullptr; + index_t *c_colind = nullptr; + T *c_values = nullptr; + + __mkl_iespblas::mkl_sparse_create_csr( &csrA, indexingA, a_nrows, a_ncols, a_base.rowptr().data(), + a_base.rowptr().data()+1, a_base.colind().data(), a_base.values().data()); + + __mkl_iespblas::mkl_sparse_create_csr( &csrB, indexingB, b_nrows, b_ncols, b_base.rowptr().data(), + b_base.rowptr().data()+1, b_base.colind().data(), b_base.values().data()); + + sparse_request_t request = SPARSE_STAGE_NNZ_COUNT; + mkl_sparse_sp2m(opA, descrA, csrA, opB, descrB, csrB, request, &csrC); + + __mkl_iespblas::mkl_sparse_export_csr( csrC, &indexingC, &c_nrows, &c_ncols, &c_rowptr_st, &c_rowptr_en, + &c_colind, &c_values); + offset_t c_ind = indexingC == SPARSE_INDEX_BASE_ZERO ? 0 : 1; + c_nnz = c_rowptr_st[c_nrows] - c_ind; + log_info("computed c_nnz = %d", c_nnz); + + return operation_info_t{ + index<>{__backend::shape(c)[0], __backend::shape(c)[1]}, c_nnz, + __mkl_iespblas::operation_state_t{csrA, csrB, csrC}}; +} + + + +template + requires __detail::has_csr_base && __detail::has_csr_base && + __detail::is_csr_view_v +void multiply_execute(operation_info_t& info, A&& a, B&& b, C&& c) +{ + log_trace(""); + + auto a_base = __detail::get_ultimate_base(a); + auto b_base = __detail::get_ultimate_base(b); + auto c_base = __detail::get_ultimate_base(c); + + using T = tensor_scalar_t; + using I = tensor_index_t; + using O = tensor_offset_t; + + auto alpha_optional = __detail::get_scaling_factor(a, b); + tensor_scalar_t alpha = alpha_optional.value_or(1); + + sparse_matrix_t csrA = info.state_.a_handle; + sparse_matrix_t csrB = info.state_.b_handle; + sparse_matrix_t csrC = info.state_.c_handle; + offset_t c_nnz = info.result_nnz(); + + struct matrix_descr descrA; + descrA.type = SPARSE_MATRIX_TYPE_GENERAL; + sparse_index_base_t indexingA = SPARSE_INDEX_BASE_ZERO; + sparse_operation_t opA = SPARSE_OPERATION_NON_TRANSPOSE; + const index_t a_nrows = __backend::shape(a_base)[0]; + const index_t a_ncols = __backend::shape(a_base)[1]; + + struct matrix_descr descrB; + descrB.type = SPARSE_MATRIX_TYPE_GENERAL; + sparse_index_base_t indexingB = SPARSE_INDEX_BASE_ZERO; + sparse_operation_t opB = SPARSE_OPERATION_NON_TRANSPOSE; + const index_t b_nrows = __backend::shape(b_base)[0]; + const index_t b_ncols = __backend::shape(b_base)[1]; + + sparse_index_base_t indexingC = SPARSE_INDEX_BASE_ZERO; + index_t c_nrows = __backend::shape(c_base)[0]; + index_t c_ncols = __backend::shape(c_base)[1]; + offset_t *c_rowptr_st = nullptr, *c_rowptr_en = nullptr; + index_t *c_colind = nullptr; + T *c_values = nullptr; + + sparse_request_t request = SPARSE_STAGE_FINALIZE_MULT; + mkl_sparse_sp2m(opA, descrA, csrA, opB, descrB, csrB, request, &csrC); + + __mkl_iespblas::mkl_sparse_export_csr( csrC, &indexingC, &c_nrows, &c_ncols, &c_rowptr_st, &c_rowptr_en, + &c_colind, &c_values); + + using T = tensor_scalar_t; + using I = tensor_index_t; + using O = tensor_offset_t; + + // copy out of csrC arrays into C arrays + std::copy(c_rowptr_st, c_rowptr_st+c_nrows+1, c.rowptr().begin()); + std::copy(c_colind, c_colind+c_nnz, c.colind().begin()); + std::copy(c_values, c_values+c_nnz, c.values().begin()); + + if (alpha_optional.has_value()) { + scale(alpha, c); + } +} + + + +} // namespace spblas + diff --git a/include/spblas/vendor/onemkl_iespblas/spmm_impl.hpp b/include/spblas/vendor/onemkl_iespblas/spmm_impl.hpp new file mode 100644 index 0000000..962eab5 --- /dev/null +++ b/include/spblas/vendor/onemkl_iespblas/spmm_impl.hpp @@ -0,0 +1,80 @@ +#pragma once + +#include "mkl.h" + +#include + +#include "mkl_wrappers.hpp" +#include +#include +#include + +// +// Defines the following APIs for SpMM: +// +// Y = alpha * op(A) * X +// +// where A is a sparse matrices of CSR format and +// X/Y are dense matrices of row_major format +// +// //operation_info_t multiply_inspect(A, x, y) +// //void multiply_inspect(operation_info_t, A, x, y) +// +// //void multiply_execute(operation_info_t, A, x, y) +// void multiply(A, x, y) +// + +namespace spblas { + +template + requires __detail::has_csr_base && __detail::has_mdspan_matrix_base && + __detail::is_matrix_instantiation_of_mdspan_v && + std::is_same_v< + typename __detail::ultimate_base_type_t::layout_type, + __mdspan::layout_right> && + std::is_same_v::layout_type, + __mdspan::layout_right> +void multiply(A&& a, X&& x, Y&& y) { + log_trace(""); + auto a_base = __detail::get_ultimate_base(a); + auto x_base = __detail::get_ultimate_base(x); + auto y_base = __detail::get_ultimate_base(y); + + using T = tensor_scalar_t; + using I = tensor_index_t; + using O = tensor_offset_t; + + auto alpha_optional = __detail::get_scaling_factor(a, x); + tensor_scalar_t alpha = alpha_optional.value_or(1); + + sparse_matrix_t csrA = nullptr; + struct matrix_descr descr; + descr.type = SPARSE_MATRIX_TYPE_GENERAL; + sparse_index_base_t indexing = SPARSE_INDEX_BASE_ZERO; + sparse_operation_t opA = SPARSE_OPERATION_NON_TRANSPOSE; + sparse_layout_t layout = SPARSE_LAYOUT_ROW_MAJOR; + + const index_t a_nrows = __backend::shape(a_base)[0]; + const index_t a_ncols = __backend::shape(a_base)[1]; + const index_t nrhs = x_base.extent(1); + const index_t ldx = x_base.extent(1); + const index_t ldy = y_base.extent(1); + + __mkl_iespblas::mkl_sparse_create_csr( &csrA, indexing, a_nrows, a_ncols, a_base.rowptr().data(), + a_base.rowptr().data()+1, a_base.colind().data(), a_base.values().data()); + + mkl_sparse_set_mm_hint( csrA, opA, descr, layout, nrhs, 1); + + mkl_sparse_optimize( csrA ); + + T beta = static_cast(0.0); + __mkl_iespblas::mkl_sparse_mm( opA, alpha, csrA, descr, layout, x_base.data_handle(), + nrhs, ldx, beta, y.data_handle(), ldy); + + mkl_sparse_destroy( csrA ); + +} + + + +} // namespace spblas diff --git a/include/spblas/vendor/onemkl_iespblas/spmv_impl.hpp b/include/spblas/vendor/onemkl_iespblas/spmv_impl.hpp new file mode 100644 index 0000000..e0bcd2d --- /dev/null +++ b/include/spblas/vendor/onemkl_iespblas/spmv_impl.hpp @@ -0,0 +1,71 @@ +#pragma once + +#include "mkl.h" + +#include + +#include "mkl_wrappers.hpp" +#include +#include +#include + +// +// Defines the following APIs for SpMV: +// +// y =alpha* op(A) * x +// +// where A is a sparse matrices of CSR format and +// x/y are dense vectors +// +// //operation_info_t multiply_inspect(A, x, y) +// //void multiply_inspect(operation_info_t, A, x, y) +// +// //void multiply_execute(operation_info_t, A, x, y) +// void multiply(A, x, y) +// + + +namespace spblas { + +template + requires __detail::has_csr_base && + __detail::has_contiguous_range_base && + __ranges::contiguous_range +void multiply(A&& a, X&& x, Y&& y) +{ + log_trace(""); + auto a_base = __detail::get_ultimate_base(a); + auto x_base = __detail::get_ultimate_base(x); + + using T = tensor_scalar_t; + using I = tensor_index_t; + using O = tensor_offset_t; + + auto alpha_optional = __detail::get_scaling_factor(a, x); + T alpha = alpha_optional.value_or(1); + + sparse_matrix_t csrA = nullptr; + struct matrix_descr descr; + descr.type = SPARSE_MATRIX_TYPE_GENERAL; + sparse_index_base_t indexing = SPARSE_INDEX_BASE_ZERO; + sparse_operation_t opA = SPARSE_OPERATION_NON_TRANSPOSE; + + const index_t a_nrows = __backend::shape(a_base)[0]; + const index_t a_ncols = __backend::shape(a_base)[1]; + + __mkl_iespblas::mkl_sparse_create_csr( &csrA, indexing, a_nrows, a_ncols, a_base.rowptr().data(), + a_base.rowptr().data()+1, a_base.colind().data(), a_base.values().data()); + + mkl_sparse_set_mv_hint( csrA, opA, descr, 1); + + mkl_sparse_optimize( csrA ); + + T beta = static_cast(0.0); + __mkl_iespblas::mkl_sparse_mv( opA, alpha, csrA, descr, __ranges::data(x_base), beta, __ranges::data(y)); + + mkl_sparse_destroy( csrA ); + +} + + +} // namespace spblas diff --git a/include/spblas/vendor/onemkl_iespblas/types.hpp b/include/spblas/vendor/onemkl_iespblas/types.hpp new file mode 100644 index 0000000..ca138db --- /dev/null +++ b/include/spblas/vendor/onemkl_iespblas/types.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include "mkl.h" +#include + +namespace spblas { + +using index_t = MKL_INT; +using offset_t = index_t; + +} From f3d981b90fa1b9bc23e4f8788ef3109bee390b4d Mon Sep 17 00:00:00 2001 From: Spencer Patty Date: Wed, 26 Feb 2025 13:16:21 -0800 Subject: [PATCH 2/3] Add extra changes to be bale to compile --- CMakeLists.txt | 7 +++++++ include/spblas/backend/backend.hpp | 4 ++++ include/spblas/vendor/onemkl_iespblas/spgemm_impl.hpp | 3 +-- include/spblas/vendor/onemkl_iespblas/spmm_impl.hpp | 3 +-- include/spblas/vendor/onemkl_iespblas/spmv_impl.hpp | 2 +- 5 files changed, 14 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5734ab3..d8fdc15 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,13 @@ endif() # Download dependencies include(FetchContent) +if (ENABLE_ONEMKL_IESPBLAS) + find_package(MKL REQUIRED) + target_link_libraries(spblas INTERFACE MKL::MKL) # C APIs + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSPBLAS_ENABLE_ONEMKL_IESPBLAS") +endif() + + if (ENABLE_ONEMKL_SYCL) find_package(MKL REQUIRED) target_link_libraries(spblas INTERFACE MKL::MKL_SYCL) # SYCL APIs diff --git a/include/spblas/backend/backend.hpp b/include/spblas/backend/backend.hpp index 0b16264..b0f2df9 100644 --- a/include/spblas/backend/backend.hpp +++ b/include/spblas/backend/backend.hpp @@ -6,6 +6,10 @@ #include #include +#ifdef SPBLAS_ENABLE_ONEMKL_IESPBLAS +#include +#endif + #ifdef SPBLAS_ENABLE_ONEMKL_SYCL #include #endif diff --git a/include/spblas/vendor/onemkl_iespblas/spgemm_impl.hpp b/include/spblas/vendor/onemkl_iespblas/spgemm_impl.hpp index bbf0ff2..04e81ee 100644 --- a/include/spblas/vendor/onemkl_iespblas/spgemm_impl.hpp +++ b/include/spblas/vendor/onemkl_iespblas/spgemm_impl.hpp @@ -4,12 +4,11 @@ #include #include "mkl.h" -#include - #include "mkl_wrappers.hpp" #include #include #include +#include // // Defines the following APIs for SpGEMM: diff --git a/include/spblas/vendor/onemkl_iespblas/spmm_impl.hpp b/include/spblas/vendor/onemkl_iespblas/spmm_impl.hpp index 962eab5..d7c5227 100644 --- a/include/spblas/vendor/onemkl_iespblas/spmm_impl.hpp +++ b/include/spblas/vendor/onemkl_iespblas/spmm_impl.hpp @@ -2,12 +2,11 @@ #include "mkl.h" -#include - #include "mkl_wrappers.hpp" #include #include #include +#include // // Defines the following APIs for SpMM: diff --git a/include/spblas/vendor/onemkl_iespblas/spmv_impl.hpp b/include/spblas/vendor/onemkl_iespblas/spmv_impl.hpp index e0bcd2d..4881b9f 100644 --- a/include/spblas/vendor/onemkl_iespblas/spmv_impl.hpp +++ b/include/spblas/vendor/onemkl_iespblas/spmv_impl.hpp @@ -2,12 +2,12 @@ #include "mkl.h" -#include #include "mkl_wrappers.hpp" #include #include #include +#include // // Defines the following APIs for SpMV: From 165f50abae484825cf473f605db4e3ea2c5766fe Mon Sep 17 00:00:00 2001 From: Spencer Patty Date: Wed, 26 Feb 2025 13:26:30 -0800 Subject: [PATCH 3/3] add trsv and make everything work but spgemm test --- include/spblas/vendor/onemkl_iespblas/algorithms.hpp | 1 + include/spblas/vendor/onemkl_iespblas/mkl_wrappers.hpp | 10 ++++++---- include/spblas/vendor/onemkl_iespblas/spgemm_impl.hpp | 4 ++-- .../vendor/onemkl_iespblas/triangular_solve_impl.hpp | 4 ++++ 4 files changed, 13 insertions(+), 6 deletions(-) create mode 100644 include/spblas/vendor/onemkl_iespblas/triangular_solve_impl.hpp diff --git a/include/spblas/vendor/onemkl_iespblas/algorithms.hpp b/include/spblas/vendor/onemkl_iespblas/algorithms.hpp index 1734337..36d7d45 100644 --- a/include/spblas/vendor/onemkl_iespblas/algorithms.hpp +++ b/include/spblas/vendor/onemkl_iespblas/algorithms.hpp @@ -3,3 +3,4 @@ #include "spmv_impl.hpp" #include "spmm_impl.hpp" #include "spgemm_impl.hpp" +#include "triangular_solve_impl.hpp" diff --git a/include/spblas/vendor/onemkl_iespblas/mkl_wrappers.hpp b/include/spblas/vendor/onemkl_iespblas/mkl_wrappers.hpp index 87693eb..e909376 100644 --- a/include/spblas/vendor/onemkl_iespblas/mkl_wrappers.hpp +++ b/include/spblas/vendor/onemkl_iespblas/mkl_wrappers.hpp @@ -3,6 +3,8 @@ #include #include "mkl.h" +#include + // // Add several templated functions for mapping from data_type to C style IE Sparse BLAS APIs // @@ -19,7 +21,7 @@ inline sparse_status_t mkl_sparse_create_csr( sparse_matrix_t *csrA, const spars const MKL_INT nrows, const MKL_INT ncols, MKL_INT *rowptr_st, MKL_INT *rowptr_en, MKL_INT *colind, T *values) { - std::cout << "mkl_sparse_create_csr data types are not supported" << std::endl; + log_warning("mkl_sparse_create_csr data types are not supported"); return SPARSE_STATUS_NOT_SUPPORTED; } @@ -49,7 +51,7 @@ inline sparse_status_t mkl_sparse_export_csr( const sparse_matrix_t csrA, sparse MKL_INT *nrows, MKL_INT *ncols, MKL_INT **rowptr_st, MKL_INT **rowptr_en, MKL_INT **colind, T **values) { - std::cout << "mkl_sparse_export_csr data types are not supported" << std::endl; + log_warning("mkl_sparse_export_csr data types are not supported"); return SPARSE_STATUS_NOT_SUPPORTED; } @@ -77,7 +79,7 @@ template inline sparse_status_t mkl_sparse_mv( const sparse_operation_t op, const T alpha, const sparse_matrix_t csrA, const struct matrix_descr descr, const T* x, const T beta, T* y) { - std::cout << "mkl_sparse_mv data types are not supported" << std::endl; + log_warning("mkl_sparse_mv data types are not supported"); return SPARSE_STATUS_NOT_SUPPORTED; } @@ -104,7 +106,7 @@ inline sparse_status_t mkl_sparse_mm( const sparse_operation_t op, const T alpha const struct matrix_descr descr, const sparse_layout_t layout, const T* x, const index_t nrhs, const index_t ldx, const T beta, T* y, const index_t ldy) { - std::cout << "mkl_sparse_mm data types are not supported" << std::endl; + log_warning("mkl_sparse_mm data types are not supported"); return SPARSE_STATUS_NOT_SUPPORTED; } diff --git a/include/spblas/vendor/onemkl_iespblas/spgemm_impl.hpp b/include/spblas/vendor/onemkl_iespblas/spgemm_impl.hpp index 04e81ee..07e961a 100644 --- a/include/spblas/vendor/onemkl_iespblas/spgemm_impl.hpp +++ b/include/spblas/vendor/onemkl_iespblas/spgemm_impl.hpp @@ -29,7 +29,7 @@ namespace spblas { template requires __detail::has_csr_base && __detail::has_csr_base && __detail::is_csr_view_v -operation_info_t multiply_inspect(A&& a, B&& b, C&& c) +operation_info_t multiply_compute(A&& a, B&& b, C&& c) { log_trace(""); auto a_base = __detail::get_ultimate_base(a); @@ -88,7 +88,7 @@ operation_info_t multiply_inspect(A&& a, B&& b, C&& c) template requires __detail::has_csr_base && __detail::has_csr_base && __detail::is_csr_view_v -void multiply_execute(operation_info_t& info, A&& a, B&& b, C&& c) +void multiply_fill(operation_info_t& info, A&& a, B&& b, C&& c) { log_trace(""); diff --git a/include/spblas/vendor/onemkl_iespblas/triangular_solve_impl.hpp b/include/spblas/vendor/onemkl_iespblas/triangular_solve_impl.hpp new file mode 100644 index 0000000..c2b08b3 --- /dev/null +++ b/include/spblas/vendor/onemkl_iespblas/triangular_solve_impl.hpp @@ -0,0 +1,4 @@ +#pragma once + +// use reference code for now +#include