Files
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

778 lines
27 KiB
C++

/*! \file */
/* ************************************************************************
* Copyright (C) 2024-2026 Advanced Micro Devices, Inc. All rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* ************************************************************************ */
#include "hipsparse_routine.hpp"
constexpr const char* hipsparse_routine::s_routine_names[hipsparse_routine::num_routines];
hipsparse_routine::hipsparse_routine(const char* function)
{
for(auto routine : all_routines)
{
const char* str = s_routine_names[routine];
if(!strcmp(function, str))
{
this->value = routine;
return;
}
}
std::cerr << "// function " << function << " is invalid, list of valid function is"
<< std::endl;
for(auto routine : all_routines)
{
const char* str = s_routine_names[routine];
std::cerr << "// - " << str << std::endl;
}
throw HIPSPARSE_STATUS_INVALID_VALUE;
}
hipsparse_routine::hipsparse_routine()
: value((value_type)-1){};
hipsparse_routine& hipsparse_routine::operator()(const char* function)
{
for(auto routine : all_routines)
{
const char* str = s_routine_names[routine];
if(!strcmp(function, str))
{
this->value = routine;
return *this;
}
}
std::cerr << "// function " << function << " is invalid, list of valid function is"
<< std::endl;
for(auto routine : all_routines)
{
const char* str = s_routine_names[routine];
std::cerr << "// - " << str << std::endl;
}
throw HIPSPARSE_STATUS_INVALID_VALUE;
}
constexpr hipsparse_routine::value_type hipsparse_routine::all_routines[];
template <hipsparse_routine::value_type FNAME, typename T>
hipsparseStatus_t hipsparse_routine::dispatch_indextype(const char cindextype, const Arguments& arg)
{
const hipsparseIndexType_t indextype = (cindextype == 'm') ? HIPSPARSE_INDEX_64I
: (cindextype == 's') ? HIPSPARSE_INDEX_32I
: (cindextype == 'd') ? HIPSPARSE_INDEX_64I
: ((hipsparseIndexType_t)-1);
const bool mixed = (cindextype == 'm');
switch(indextype)
{
case HIPSPARSE_INDEX_16U:
{
break;
}
case HIPSPARSE_INDEX_32I:
{
return dispatch_call<FNAME, T, int32_t>(arg);
}
case HIPSPARSE_INDEX_64I:
{
if(mixed)
{
return dispatch_call<FNAME, T, int64_t, int32_t>(arg);
}
else
{
return dispatch_call<FNAME, T, int64_t>(arg);
}
}
}
return HIPSPARSE_STATUS_INVALID_VALUE;
}
template <hipsparse_routine::value_type FNAME>
hipsparseStatus_t hipsparse_routine::dispatch_precision(const char precision,
const char indextype,
const Arguments& arg)
{
const hipDataType datatype = (precision == 's') ? HIP_R_32F
: (precision == 'd') ? HIP_R_64F
: (precision == 'c') ? HIP_C_32F
: (precision == 'z') ? HIP_C_64F
: ((hipDataType)-1);
switch(datatype)
{
case HIP_R_32F:
return dispatch_indextype<FNAME, float>(indextype, arg);
case HIP_R_64F:
return dispatch_indextype<FNAME, double>(indextype, arg);
case HIP_C_32F:
return dispatch_indextype<FNAME, hipComplex>(indextype, arg);
case HIP_C_64F:
return dispatch_indextype<FNAME, hipDoubleComplex>(indextype, arg);
default:
return HIPSPARSE_STATUS_INVALID_VALUE;
}
}
hipsparseStatus_t hipsparse_routine::dispatch(const char precision,
const char indextype,
const Arguments& arg) const
{
switch(this->value)
{
#define HIPSPARSE_DO_ROUTINE(FNAME) \
case FNAME: \
return dispatch_precision<FNAME>(precision, indextype, arg);
HIPSPARSE_FOREACH_ROUTINE;
#undef HIPSPARSE_DO_ROUTINE
}
return HIPSPARSE_STATUS_INVALID_VALUE;
}
constexpr const char* hipsparse_routine::to_string() const
{
// switch for checking inconsistency.
switch(this->value)
{
#define HIPSPARSE_DO_ROUTINE(x_) \
case x_: \
{ \
if(strcmp(#x_, s_routine_names[this->value])) \
return nullptr; \
break; \
}
HIPSPARSE_FOREACH_ROUTINE;
}
#undef HIPSPARSE_DO_ROUTINE
return s_routine_names[this->value];
}
// Level1
#include "testing_axpyi.hpp"
#include "testing_dotci.hpp"
#include "testing_doti.hpp"
#include "testing_gthr.hpp"
#include "testing_gthrz.hpp"
#include "testing_roti.hpp"
#include "testing_sctr.hpp"
// Level2
#include "testing_bsrmv.hpp"
#include "testing_bsrsv2.hpp"
#include "testing_csrsv2.hpp"
#include "testing_gemvi.hpp"
#include "testing_hybmv.hpp"
// Level3
#include "testing_bsrmm.hpp"
#include "testing_bsrsm2.hpp"
#include "testing_gemmi.hpp"
// Extra
#include "testing_csrgeam.hpp"
#include "testing_csrgemm.hpp"
// Precond
#include "testing_bsric02.hpp"
#include "testing_bsrilu02.hpp"
#include "testing_csric02.hpp"
#include "testing_csrilu02.hpp"
#include "testing_gpsv_interleaved_batch.hpp"
#include "testing_gtsv.hpp" // File should be renamed to testing_gtsv2.hpp
#include "testing_gtsv2_nopivot.hpp"
#include "testing_gtsv2_strided_batch.hpp"
#include "testing_gtsv_interleaved_batch.hpp"
// Conversion
#include "testing_bsr2csr.hpp"
#include "testing_coo2csr.hpp"
#include "testing_csr2bsr.hpp"
#include "testing_csr2coo.hpp"
#include "testing_csr2csc.hpp"
#include "testing_csr2csr_compress.hpp"
#include "testing_csr2gebsr.hpp"
#include "testing_csr2hyb.hpp"
#include "testing_gebsr2csr.hpp"
#include "testing_gebsr2gebsc.hpp"
#include "testing_gebsr2gebsr.hpp"
#include "testing_hyb2csr.hpp"
// Generic
#include "testing_dense_to_sparse_coo.hpp"
#include "testing_dense_to_sparse_csc.hpp"
#include "testing_dense_to_sparse_csr.hpp"
#include "testing_sparse_to_dense_coo.hpp"
#include "testing_sparse_to_dense_csc.hpp"
#include "testing_sparse_to_dense_csr.hpp"
#include "testing_spmm_coo.hpp"
#include "testing_spmm_csc.hpp"
#include "testing_spmm_csr.hpp"
#include "testing_spmv_coo.hpp"
#include "testing_spmv_csr.hpp"
#include "testing_spmv_sell.hpp"
#include "testing_spsm_coo.hpp"
#include "testing_spsm_csc.hpp"
#include "testing_spsm_csr.hpp"
#include "testing_spsv_csc.hpp"
#include "testing_spsv_csr.hpp"
bool hipsparse_routine::is_routine_supported(hipsparse_routine::value_type FNAME)
{
switch(FNAME)
{
// Level 1
case axpyi:
return routine_support::is_axpyi_supported();
case doti:
return routine_support::is_doti_supported();
case dotci:
return routine_support::is_dotci_supported();
case gthr:
return routine_support::is_gthr_supported();
case gthrz:
return routine_support::is_gthrz_supported();
case roti:
return routine_support::is_roti_supported();
case sctr:
return routine_support::is_sctr_supported();
// Level 2
case bsrsv2:
return routine_support::is_bsrsv2_supported();
case coomv:
return routine_support::is_coomv_supported();
case csrmv:
return routine_support::is_csrmv_supported();
case csrsv:
return routine_support::is_csrsv_supported();
case cscsv:
return routine_support::is_cscsv_supported();
case gemvi:
return routine_support::is_gemvi_supported();
case hybmv:
return routine_support::is_hybmv_supported();
// Level 3
case bsrmm:
return routine_support::is_bsrmm_supported();
case bsrsm2:
return routine_support::is_bsrsm2_supported();
case coomm:
return routine_support::is_coomm_supported();
case cscmm:
return routine_support::is_cscmm_supported();
case csrmm:
return routine_support::is_csrmm_supported();
case coosm:
return routine_support::is_coosm_supported();
case csrsm:
return routine_support::is_csrsm_supported();
case cscsm:
return routine_support::is_cscsm_supported();
case gemmi:
return routine_support::is_gemmi_supported();
// Extra
case csrgeam:
return routine_support::is_csrgeam_supported();
case csrgemm:
return routine_support::is_csrgemm_supported();
// Precond
case bsric02:
return routine_support::is_bsric02_supported();
case bsrilu02:
return routine_support::is_bsrilu02_supported();
case csric02:
return routine_support::is_csric02_supported();
case csrilu02:
return routine_support::is_csrilu02_supported();
case gtsv2:
return routine_support::is_gtsv2_supported();
case gtsv2_nopivot:
return routine_support::is_gtsv2_nopivot_supported();
case gtsv2_strided_batch:
return routine_support::is_gtsv2_strided_batch_supported();
case gtsv_interleaved_batch:
return routine_support::is_gtsv_interleaved_batch_supported();
case gpsv_interleaved_batch:
return routine_support::is_gpsv_interleaved_batch_supported();
// Conversion
case bsr2csr:
return routine_support::is_bsr2csr_supported();
case csr2coo:
return routine_support::is_csr2coo_supported();
case csr2csc:
return routine_support::is_csr2csc_supported();
case csr2hyb:
return routine_support::is_csr2hyb_supported();
case csr2bsr:
return routine_support::is_csr2bsr_supported();
case csr2gebsr:
return routine_support::is_csr2gebsr_supported();
case csr2csr_compress:
return routine_support::is_csr2csr_compress_supported();
case coo2csr:
return routine_support::is_coo2csr_supported();
case hyb2csr:
return routine_support::is_hyb2csr_supported();
case csr2dense:
return routine_support::is_csr2dense_supported();
case csc2dense:
return routine_support::is_csc2dense_supported();
case coo2dense:
return routine_support::is_coo2dense_supported();
case dense2csr:
return routine_support::is_dense2csr_supported();
case dense2csc:
return routine_support::is_dense2csc_supported();
case dense2coo:
return routine_support::is_dense2coo_supported();
case gebsr2csr:
return routine_support::is_gebsr2csr_supported();
case gebsr2gebsc:
return routine_support::is_gebsr2gebsc_supported();
case gebsr2gebsr:
return routine_support::is_gebsr2gebsr_supported();
}
return false;
}
void hipsparse_routine::print_routine_support_info(hipsparse_routine::value_type FNAME)
{
switch(FNAME)
{
// Level 1
case axpyi:
routine_support::print_axpyi_support_warning();
break;
case doti:
routine_support::print_doti_support_warning();
break;
case dotci:
routine_support::print_dotci_support_warning();
break;
case gthr:
routine_support::print_gthr_support_warning();
break;
case gthrz:
routine_support::print_gthrz_support_warning();
break;
case roti:
routine_support::print_roti_support_warning();
break;
case sctr:
routine_support::print_sctr_support_warning();
break;
// Level 2
case bsrsv2:
routine_support::print_bsrsv2_support_warning();
break;
case coomv:
routine_support::print_coomv_support_warning();
break;
case csrmv:
routine_support::print_csrmv_support_warning();
break;
case csrsv:
routine_support::print_csrsv_support_warning();
break;
case cscsv:
routine_support::print_cscsv_support_warning();
break;
case gemvi:
routine_support::print_gemvi_support_warning();
break;
case hybmv:
routine_support::print_hybmv_support_warning();
break;
// Level 3
case bsrmm:
routine_support::print_bsrmm_support_warning();
break;
case bsrsm2:
routine_support::print_bsrsm2_support_warning();
break;
case coomm:
routine_support::print_coomm_support_warning();
break;
case cscmm:
routine_support::print_cscmm_support_warning();
break;
case csrmm:
routine_support::print_csrmm_support_warning();
break;
case coosm:
routine_support::print_coosm_support_warning();
break;
case csrsm:
routine_support::print_csrsm_support_warning();
break;
case cscsm:
routine_support::print_cscsm_support_warning();
break;
case gemmi:
routine_support::print_gemmi_support_warning();
break;
// Extra
case csrgeam:
routine_support::print_csrgeam_support_warning();
break;
case csrgemm:
routine_support::print_csrgemm_support_warning();
break;
// Precond
case bsric02:
routine_support::print_bsric02_support_warning();
break;
case bsrilu02:
routine_support::print_bsrilu02_support_warning();
break;
case csric02:
routine_support::print_csric02_support_warning();
break;
case csrilu02:
routine_support::print_csrilu02_support_warning();
break;
case gtsv2:
routine_support::print_gtsv2_support_warning();
break;
case gtsv2_nopivot:
routine_support::print_gtsv2_nopivot_support_warning();
break;
case gtsv2_strided_batch:
routine_support::print_gtsv2_strided_batch_support_warning();
break;
case gtsv_interleaved_batch:
routine_support::print_gtsv_interleaved_batch_support_warning();
break;
case gpsv_interleaved_batch:
routine_support::print_gpsv_interleaved_batch_support_warning();
break;
// Conversion
case bsr2csr:
routine_support::print_bsr2csr_support_warning();
break;
case csr2coo:
routine_support::print_csr2coo_support_warning();
break;
case csr2csc:
routine_support::print_csr2csc_support_warning();
break;
case csr2hyb:
routine_support::print_csr2hyb_support_warning();
break;
case csr2bsr:
routine_support::print_csr2bsr_support_warning();
break;
case csr2gebsr:
routine_support::print_csr2gebsr_support_warning();
break;
case csr2csr_compress:
routine_support::print_csr2csr_compress_support_warning();
break;
case coo2csr:
routine_support::print_coo2csr_support_warning();
break;
case hyb2csr:
routine_support::print_hyb2csr_support_warning();
break;
case csr2dense:
routine_support::print_csr2dense_support_warning();
break;
case csc2dense:
routine_support::print_csc2dense_support_warning();
break;
case coo2dense:
routine_support::print_coo2dense_support_warning();
break;
case dense2csr:
routine_support::print_dense2csr_support_warning();
break;
case dense2csc:
routine_support::print_dense2csc_support_warning();
break;
case dense2coo:
routine_support::print_dense2coo_support_warning();
break;
case gebsr2csr:
routine_support::print_gebsr2csr_support_warning();
break;
case gebsr2gebsc:
routine_support::print_gebsr2gebsc_support_warning();
break;
case gebsr2gebsr:
routine_support::print_gebsr2gebsr_support_warning();
break;
}
}
template <hipsparse_routine::value_type FNAME, typename T, typename I, typename J>
hipsparseStatus_t hipsparse_routine::dispatch_call(const Arguments& arg)
{
if(!is_routine_supported(FNAME))
{
print_routine_support_info(FNAME);
return HIPSPARSE_STATUS_INVALID_VALUE;
}
#define DEFINE_CASE_T_X(value, testingf) \
case value: \
{ \
try \
{ \
testingf<T>(arg); \
return HIPSPARSE_STATUS_SUCCESS; \
} \
catch(const hipsparseStatus_t& status) \
{ \
return status; \
} \
}
#define DEFINE_CASE_IT_X(value, testingf) \
case value: \
{ \
try \
{ \
testingf<I, T>(arg); \
return HIPSPARSE_STATUS_SUCCESS; \
} \
catch(const hipsparseStatus_t& status) \
{ \
return status; \
} \
}
#define DEFINE_CASE_IJT_X(value, testingf) \
case value: \
{ \
try \
{ \
testingf<I, J, T>(arg); \
return HIPSPARSE_STATUS_SUCCESS; \
} \
catch(const hipsparseStatus_t& status) \
{ \
return status; \
} \
}
#define DEFINE_CASE_IXYT_X(value, testingf) \
case value: \
{ \
try \
{ \
testingf<I, T, T, T>(arg); \
return HIPSPARSE_STATUS_SUCCESS; \
} \
catch(const hipsparseStatus_t& status) \
{ \
return status; \
} \
}
#define DEFINE_CASE_IAXYT_X(value, testingf) \
case value: \
{ \
try \
{ \
testingf<I, T, T, T, T>(arg); \
return HIPSPARSE_STATUS_SUCCESS; \
} \
catch(const hipsparseStatus_t& status) \
{ \
return status; \
} \
}
#define DEFINE_CASE_IABCT_X(value, testingf) DEFINE_CASE_IAXYT_X(value, testingf)
#define DEFINE_CASE_IJAXYT_X(value, testingf) \
case value: \
{ \
try \
{ \
testingf<I, J, T, T, T, T>(arg); \
return HIPSPARSE_STATUS_SUCCESS; \
} \
catch(const hipsparseStatus_t& status) \
{ \
return status; \
} \
}
#define DEFINE_CASE_IJABCT_X(value, testingf) DEFINE_CASE_IJAXYT_X(value, testingf)
#define DEFINE_CASE_T(value) DEFINE_CASE_T_X(value, testing_##value)
#define IS_T_FLOAT (std::is_same<T, float>())
#define IS_T_DOUBLE (std::is_same<T, double>())
#define IS_T_COMPLEX_FLOAT (std::is_same<T, hipComplex>())
#define IS_T_COMPLEX_DOUBLE (std::is_same<T, hipDoubleComplex>())
#define DEFINE_CASE_T_REAL_ONLY(value) \
case value: \
{ \
if(IS_T_FLOAT) \
{ \
try \
{ \
testing_##value<float>(arg); \
return HIPSPARSE_STATUS_SUCCESS; \
} \
catch(const hipsparseStatus_t& status) \
{ \
return status; \
} \
} \
else if(IS_T_DOUBLE) \
{ \
try \
{ \
testing_##value<double>(arg); \
return HIPSPARSE_STATUS_SUCCESS; \
} \
catch(const hipsparseStatus_t& status) \
{ \
return status; \
} \
} \
else \
{ \
return HIPSPARSE_STATUS_INTERNAL_ERROR; \
} \
}
#define DEFINE_CASE_T_REAL_VS_COMPLEX(value, rtestingf, ctestingf) \
case value: \
{ \
try \
{ \
if(IS_T_FLOAT) \
{ \
rtestingf<float>(arg); \
} \
else if(IS_T_DOUBLE) \
{ \
rtestingf<double>(arg); \
} \
else if(IS_T_COMPLEX_FLOAT) \
{ \
ctestingf<hipComplex>(arg); \
} \
else if(IS_T_COMPLEX_DOUBLE) \
{ \
ctestingf<hipDoubleComplex>(arg); \
} \
else \
{ \
return HIPSPARSE_STATUS_INTERNAL_ERROR; \
} \
} \
catch(const hipsparseStatus_t& status) \
{ \
return status; \
} \
}
switch(FNAME)
{
// Level 1
DEFINE_CASE_T(axpyi);
DEFINE_CASE_T(doti);
DEFINE_CASE_T_REAL_VS_COMPLEX(dotci, testing_doti, testing_dotci);
DEFINE_CASE_T(gthr);
DEFINE_CASE_T(gthrz);
DEFINE_CASE_T_REAL_ONLY(roti);
DEFINE_CASE_T(sctr);
// Level2
DEFINE_CASE_T(bsrsv2);
DEFINE_CASE_IABCT_X(coomv, testing_spmv_coo);
DEFINE_CASE_IJABCT_X(csrmv, testing_spmv_csr);
DEFINE_CASE_IJT_X(csrsv, testing_spsv_csr);
DEFINE_CASE_IJT_X(cscsv, testing_spsv_csc);
DEFINE_CASE_T(gemvi);
DEFINE_CASE_T(hybmv);
// Level3
DEFINE_CASE_T(bsrmm);
DEFINE_CASE_T(bsrsm2);
DEFINE_CASE_IT_X(coomm, testing_spmm_coo);
DEFINE_CASE_IJT_X(cscmm, testing_spmm_csc);
DEFINE_CASE_IJT_X(csrmm, testing_spmm_csr);
DEFINE_CASE_IT_X(coosm, testing_spsm_coo);
DEFINE_CASE_IJT_X(csrsm, testing_spsm_csr);
DEFINE_CASE_IJT_X(cscsm, testing_spsm_csc);
DEFINE_CASE_T(gemmi);
// Extra
DEFINE_CASE_T(csrgeam);
DEFINE_CASE_T(csrgemm);
// Precond
DEFINE_CASE_T(bsric02);
DEFINE_CASE_T(bsrilu02);
DEFINE_CASE_T(csric02);
DEFINE_CASE_T(csrilu02);
DEFINE_CASE_T(gtsv2);
DEFINE_CASE_T(gtsv2_nopivot);
DEFINE_CASE_T(gtsv2_strided_batch);
DEFINE_CASE_T(gtsv_interleaved_batch);
DEFINE_CASE_T(gpsv_interleaved_batch);
// Conversion
DEFINE_CASE_T(bsr2csr);
DEFINE_CASE_T(csr2coo);
DEFINE_CASE_T(csr2csc);
DEFINE_CASE_T(csr2hyb);
DEFINE_CASE_T(csr2bsr);
DEFINE_CASE_T(csr2gebsr);
DEFINE_CASE_T(csr2csr_compress);
DEFINE_CASE_T(coo2csr);
DEFINE_CASE_T(hyb2csr);
DEFINE_CASE_IJT_X(csr2dense, testing_sparse_to_dense_csr);
DEFINE_CASE_IJT_X(csc2dense, testing_sparse_to_dense_csc);
DEFINE_CASE_IT_X(coo2dense, testing_sparse_to_dense_coo);
DEFINE_CASE_IJT_X(dense2csr, testing_dense_to_sparse_csr);
DEFINE_CASE_IJT_X(dense2csc, testing_dense_to_sparse_csc);
DEFINE_CASE_IT_X(dense2coo, testing_dense_to_sparse_coo);
DEFINE_CASE_T(gebsr2csr);
DEFINE_CASE_T(gebsr2gebsc);
DEFINE_CASE_T(gebsr2gebsr);
}
#undef DEFINE_CASE_T_X
#undef DEFINE_CASE_IT_X
#undef DEFINE_CASE_IJT_X
#undef DEFINE_CASE_T
#undef IS_T_FLOAT
#undef IS_T_DOUBLE
#undef IS_T_COMPLEX_FLOAT
#undef IS_T_COMPLEX_DOUBLE
#undef DEFINE_CASE_T_REAL_ONLY
#undef DEFINE_CASE_T_REAL_VS_COMPLEX
return HIPSPARSE_STATUS_INVALID_VALUE;
}