Skip to content

Commit

Permalink
Disable spsv symmetric conjtrans
Browse files Browse the repository at this point in the history
  • Loading branch information
Rbiessy committed Jul 4, 2024
1 parent d109332 commit 9b9548a
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 7 deletions.
3 changes: 3 additions & 0 deletions docs/domains/sparse_linear_algebra.rst
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,8 @@ Currently known limitations:
``oneapi::mkl::transpose::conjtrans`` and has the
``oneapi::mkl::sparse::matrix_property::symmetric`` property will throw an
``oneapi::mkl::unimplemented`` exception.
- Using ``spsv`` on Intel GPU with a sparse matrix that is
``oneapi::mkl::transpose::conjtrans`` and will throw an
``oneapi::mkl::unimplemented`` exception.
- Scalar parameters ``alpha`` and ``beta`` should be host pointers to prevent
synchronizations and copies to the host.
5 changes: 4 additions & 1 deletion src/sparse_blas/backends/mkl_common/mkl_spmm.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,10 @@ void check_valid_spmm(const std::string function_name, sycl::queue &queue,
}

#if BACKEND == gpu
if (opA == oneapi::mkl::transpose::conjtrans &&
detail::data_type data_type = internal_A_handle->get_value_type();
if ((data_type == detail::data_type::complex_fp32 ||
data_type == detail::data_type::complex_fp64) &&
opA == oneapi::mkl::transpose::conjtrans &&
internal_A_handle->has_matrix_property(oneapi::mkl::sparse::matrix_property::symmetric)) {
throw mkl::unimplemented(
"sparse_blas", function_name,
Expand Down
25 changes: 19 additions & 6 deletions src/sparse_blas/backends/mkl_common/mkl_spsv.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ sycl::event release_spsv_descr(sycl::queue &queue, oneapi::mkl::sparse::spsv_des
}

void check_valid_spsv(const std::string function_name, sycl::queue &queue,
oneapi::mkl::sparse::matrix_view A_view,
oneapi::mkl::transpose opA, oneapi::mkl::sparse::matrix_view A_view,
oneapi::mkl::sparse::matrix_handle_t A_handle,
oneapi::mkl::sparse::dense_vector_handle_t x_handle,
oneapi::mkl::sparse::dense_vector_handle_t y_handle, const void *alpha,
Expand All @@ -47,6 +47,19 @@ void check_valid_spsv(const std::string function_name, sycl::queue &queue,
"The backend does not support `no_optimize_alg` unless A_handle has the property `matrix_property::sorted`.");
}

#if BACKEND == gpu
detail::data_type data_type = internal_A_handle->get_value_type();
if ((data_type == detail::data_type::complex_fp32 ||
data_type == detail::data_type::complex_fp64) &&
opA == oneapi::mkl::transpose::conjtrans) {
throw mkl::unimplemented(
"sparse_blas", function_name,
"The backend does not support spsv using conjtrans.");
}
#else
(void)opA;
#endif // BACKEND

detail::check_all_containers_compatible(function_name, internal_A_handle, x_handle, y_handle);
if (A_view.type_view != matrix_descr::triangular) {
throw mkl::invalid_argument("sparse_blas", function_name,
Expand All @@ -58,7 +71,7 @@ void check_valid_spsv(const std::string function_name, sycl::queue &queue,
}
}

void spsv_buffer_size(sycl::queue &queue, oneapi::mkl::transpose /*opA*/, const void *alpha,
void spsv_buffer_size(sycl::queue &queue, oneapi::mkl::transpose opA, const void *alpha,
oneapi::mkl::sparse::matrix_view A_view,
oneapi::mkl::sparse::matrix_handle_t A_handle,
oneapi::mkl::sparse::dense_vector_handle_t x_handle,
Expand All @@ -67,7 +80,7 @@ void spsv_buffer_size(sycl::queue &queue, oneapi::mkl::transpose /*opA*/, const
oneapi::mkl::sparse::spsv_descr_t /*spsv_descr*/,
std::size_t &temp_buffer_size) {
// TODO: Add support for external workspace once the close-source oneMKL backend supports it.
check_valid_spsv(__func__, queue, A_view, A_handle, x_handle, y_handle, alpha, alg);
check_valid_spsv(__func__, queue, opA, A_view, A_handle, x_handle, y_handle, alpha, alg);
temp_buffer_size = 0;
}

Expand All @@ -79,7 +92,7 @@ void spsv_optimize(sycl::queue &queue, oneapi::mkl::transpose opA, const void *a
oneapi::mkl::sparse::spsv_alg alg,
oneapi::mkl::sparse::spsv_descr_t /*spsv_descr*/,
sycl::buffer<std::uint8_t, 1> /*workspace*/) {
check_valid_spsv(__func__, queue, A_view, A_handle, x_handle, y_handle, alpha, alg);
check_valid_spsv(__func__, queue, opA, A_view, A_handle, x_handle, y_handle, alpha, alg);
auto internal_A_handle = detail::get_internal_handle(A_handle);
if (!internal_A_handle->all_use_buffer()) {
detail::throw_incompatible_container(__func__);
Expand All @@ -102,7 +115,7 @@ sycl::event spsv_optimize(sycl::queue &queue, oneapi::mkl::transpose opA, const
oneapi::mkl::sparse::spsv_alg alg,
oneapi::mkl::sparse::spsv_descr_t /*spsv_descr*/, void * /*workspace*/,
const std::vector<sycl::event> &dependencies) {
check_valid_spsv(__func__, queue, A_view, A_handle, x_handle, y_handle, alpha, alg);
check_valid_spsv(__func__, queue, opA, A_view, A_handle, x_handle, y_handle, alpha, alg);
auto internal_A_handle = detail::get_internal_handle(A_handle);
if (internal_A_handle->all_use_buffer()) {
detail::throw_incompatible_container(__func__);
Expand Down Expand Up @@ -149,7 +162,7 @@ sycl::event spsv(sycl::queue &queue, oneapi::mkl::transpose opA, const void *alp
oneapi::mkl::sparse::dense_vector_handle_t y_handle,
oneapi::mkl::sparse::spsv_alg alg, oneapi::mkl::sparse::spsv_descr_t spsv_descr,
const std::vector<sycl::event> &dependencies) {
check_valid_spsv(__func__, queue, A_view, A_handle, x_handle, y_handle, alpha, alg);
check_valid_spsv(__func__, queue, opA, A_view, A_handle, x_handle, y_handle, alpha, alg);
auto value_type = detail::get_internal_handle(A_handle)->get_value_type();
DISPATCH_MKL_OPERATION("spsv", value_type, internal_spsv, queue, opA, alpha, A_view, A_handle,
x_handle, y_handle, alg, spsv_descr, dependencies);
Expand Down

0 comments on commit 9b9548a

Please sign in to comment.