1 /* 2 3 Copyright (C) 2008-2021 Michele Martone 4 5 This file is part of librsb. 6 7 librsb is free software; you can redistribute it and/or modify it 8 under the terms of the GNU Lesser General Public License as published 9 by the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 librsb is distributed in the hope that it will be useful, but WITHOUT 13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 15 License for more details. 16 17 You should have received a copy of the GNU Lesser General Public 18 License along with librsb; see the file COPYING. 19 If not, see <http://www.gnu.org/licenses/>. 20 21 */ 22 /* @cond INNERDOC */ 23 /** 24 * @file 25 * @author Michele Martone 26 * @brief Sparse BLAS interface internals 27 * */ 28 #ifndef LIBSPBLAS_HANDLE_H_INCLUDED 29 #define LIBSPBLAS_HANDLE_H_INCLUDED 30 31 #ifdef __cplusplus 32 extern "C" { 33 #endif /* __cplusplus */ 34 35 #include "rsb.h" 36 #include "blas_sparse/blas_enum.h" 37 #include "rsb_libspblas.h" 38 #include "rsb_internals.h" 39 40 #define RSB_BLAS_FIRST_HANDLE 1024 41 #define RSB_BLAS_LAST_HANDLE (RSB_MAX_VALUE_FOR_TYPE(blas_sparse_matrix)-1) 42 #define RSB_BLAS_MATRICES_MAX (RSB_BLAS_LAST_HANDLE-RSB_BLAS_FIRST_HANDLE+1) 43 #define RSB_BLAS_HANDLE_INVALID (RSB_BLAS_LAST_HANDLE+1) 44 #define RSB_BLAS_INT_MAX RSB_MAX_VALUE_FOR_TYPE(rsb_blas_int_t) 45 46 #define RSB_BLAS_HANDLE_TO_RSB_ERROR(HANDLE) (HANDLE==(RSB_BLAS_HANDLE_INVALID)?RSB_ERR_GENERIC_ERROR:RSB_ERR_NO_ERROR) 47 48 #define RSB_ERROR_TO_BLAS_ERROR(E) (((E)==RSB_ERR_NO_ERROR)?(RSB_BLAS_NO_ERROR):(RSB_BLAS_ERROR)) 49 #define RSB_BLAS_ERROR_TO_RSB_ERROR(E) (((E)==RSB_BLAS_NO_ERROR)?(RSB_ERR_NO_ERROR):(RSB_ERR_GENERIC_ERROR)) 50 #define RSB_BLAS_WANT_EXPERIMENTAL_TUNING RSB_WANT_OMP_RECURSIVE_KERNELS /* FIXME: this is experimental */ 51 52 #define RSB_BLAS_UPLO_CHAR(UPLO) ((UPLO)==blas_lower_triangular?'L':'U') 53 #define RSB_BLAS_DIAG_CHAR(DIAG) ((DIAG)==blas_non_unit_diag?'E':'I') 54 #define RSB_BLAS_INVALID_VAL -1 55 56 #define RSB_SPB_INTERFACE_PREAMBLE RSB_INTERFACE_PREAMBLE 57 #define RSB_SPB_INTERFACE_RETURN(EXP) { int istat = EXP; RSB_INTERFACE_ENDCMD RSB_DO_ERR_MANIFEST_INTERFACE(RSB_BLAS_ERROR_TO_RSB_ERROR(istat)) return istat; } 58 #define RSB_SPB_INTERFACE_RETURN_HDL(EXP) { int handle = EXP; RSB_INTERFACE_ENDCMD RSB_DO_ERR_MANIFEST_INTERFACE(RSB_BLAS_HANDLE_TO_RSB_ERROR(handle)) return handle; } 59 #define RSB_SPB_INTERFACE_RETURN_VOID() { RSB_INTERFACE_ENDCMD return; } 60 #define RSB_SPB_INTERFACE_RETURN_EXP(EXP) { RSB_INTERFACE_ENDCMD return (EXP); } 61 62 /*typedef rsb_blas_sparse_matrix_handle_t blas_sparse_matrix;*/ 63 64 /*! 65 * \ingroup rsb_doc_sparse_blas 66 * \brief An internal, helper structure. 67 * \internal 68 */ 69 struct rsb_blas_sparse_matrix_t 70 { 71 struct rsb_mtx_t * mtxAp; 72 struct rsb_coo_matrix_t coomatrix; 73 rsb_nnz_idx_t nnzin; 74 blas_sparse_matrix handle; 75 /* rsb_blas_int_t prop ;*/ 76 int k, l, off; 77 int*rbp,*cbp; 78 enum blas_handle_type type; 79 enum blas_diag_type diag_type; 80 enum blas_symmetry_type symmetry; 81 enum blas_base_type base; 82 enum blas_order_type order; 83 enum blas_field_type fprecision; 84 enum blas_field_type field; 85 enum blas_sparsity_optimization_type sparsity_optimization_type; 86 enum blas_rsb_ext_type dupstra; 87 enum blas_rsb_ext_type fmt_hint; 88 #if RSB_BLAS_WANT_EXPERIMENTAL_TUNING 89 rsb_thread_t opt_mvn_hint, opt_mvt_hint; 90 #endif 91 /* we should also deal with : 92 blas_order_type 93 blas_trans_type 94 blas_uplo_type 95 blas_diag_type 96 blas_side_type 97 blas_cmach_type 98 blas_norm_type 99 blas_sort_type 100 blas_conj_type 101 blas_jrot_type 102 blas_prec_type 103 blas_base_type 104 blas_symmetry_type 105 blas_field_type 106 blas_size_type 107 blas_handle_type 108 blas_sparsity_optimization_type 109 */ 110 }; 111 112 113 114 rsb_err_t rsb__BLAS_is_type_supported(rsb_char_t c); 115 struct rsb_mtx_t * rsb__BLAS_inner_matrix_retrieve(blas_sparse_matrix handle); 116 blas_sparse_matrix rsb__BLAS_Xuscr_begin( rsb_blas_int_t m, rsb_blas_int_t n, rsb_type_t typecode); 117 blas_sparse_matrix rsb__BLAS_Xuscr_block_begin( rsb_blas_int_t Mb, rsb_blas_int_t Nb, rsb_blas_int_t k, rsb_blas_int_t l, rsb_type_t typecode); 118 blas_sparse_matrix rsb__BLAS_Xuscr_variable_block_begin( rsb_blas_int_t Mb, rsb_blas_int_t Nb, const rsb_blas_int_t *k, const rsb_blas_int_t *l, rsb_type_t typecode); 119 rsb_blas_int_t rsb__BLAS_Xuscr_insert_entry( blas_sparse_matrix A, const void * valp, rsb_blas_int_t i, rsb_blas_int_t j ); 120 rsb_blas_int_t rsb__BLAS_Xuscr_insert_entries( blas_sparse_matrix A, rsb_blas_int_t nz, const void * val, const rsb_blas_int_t *indx, const rsb_blas_int_t *jndx ); 121 rsb_blas_int_t rsb__BLAS_Xuscr_insert_col( blas_sparse_matrix A, rsb_blas_int_t j, rsb_blas_int_t nz, const void * val, const rsb_blas_int_t *indx ); 122 rsb_blas_int_t rsb__BLAS_Xuscr_insert_row( blas_sparse_matrix A, rsb_blas_int_t i, rsb_blas_int_t nz, const void * val, const rsb_blas_int_t *jndx ); 123 rsb_blas_int_t rsb__BLAS_Xuscr_insert_clique( blas_sparse_matrix A, const rsb_blas_int_t k, const rsb_blas_int_t l, const void * val, const rsb_blas_int_t row_stride, const rsb_blas_int_t col_stride, const rsb_blas_int_t *indx, const rsb_blas_int_t *jndx ); 124 rsb_blas_int_t rsb__BLAS_Xuscr_insert_block( blas_sparse_matrix A, const void * val, rsb_blas_int_t row_stride, rsb_blas_int_t col_stride, rsb_blas_int_t i, rsb_blas_int_t j); 125 rsb_blas_int_t rsb__BLAS_Xuscr_end( blas_sparse_matrix A); 126 rsb_blas_int_t rsb__BLAS_Xuscr_end_flagged( blas_sparse_matrix A, const rsb_flags_t*flagsp); 127 128 rsb_blas_int_t rsb__BLAS_usgp( blas_sparse_matrix A, rsb_blas_int_t pname ); 129 rsb_blas_int_t rsb__BLAS_ussp( blas_sparse_matrix A, rsb_blas_int_t pname ); 130 rsb_blas_int_t rsb__BLAS_Xusds( blas_sparse_matrix A ); 131 rsb_trans_t rsb__blas_trans_to_rsb_trans(enum blas_trans_type trans); 132 rsb_trans_t rsb__do_psblas_trans_to_rsb_trans(const char trans); 133 rsb_order_t rsb_blas_order_to_rsb_order(enum blas_order_type order); 134 blas_sparse_matrix rsb__BLAS_new_matrix_begin(rsb_coo_idx_t m, rsb_coo_idx_t k, rsb_nnz_idx_t nnzest, rsb_type_t typecode, rsb_coo_idx_t br, rsb_coo_idx_t bc, const rsb_coo_idx_t*rbp, const rsb_coo_idx_t*cbp); 135 rsb_err_t rsb__BLAS_handles_free(void); 136 137 int rsb__BLAS_Xusrows_scale(blas_sparse_matrix A,const void * d,enum blas_trans_type trans); 138 int rsb__BLAS_Xusget_diag(blas_sparse_matrix A,void * d); 139 int rsb__BLAS_Xusget_rows_sparse(blas_sparse_matrix A,void * VA, rsb_blas_int_t * IA, rsb_blas_int_t * JA, rsb_blas_int_t * nnz, rsb_blas_int_t fr, rsb_blas_int_t lr); 140 int rsb__BLAS_Xusget_matrix_nnz(blas_sparse_matrix A, rsb_blas_int_t * nnz); 141 int rsb__BLAS_Xusget_infinity_norm(blas_sparse_matrix A, void * in, enum blas_trans_type trans); 142 int rsb__BLAS_Xusget_rows_sums(blas_sparse_matrix A, void * rs, enum blas_trans_type trans); 143 int rsb__BLAS_Xusset_elements(blas_sparse_matrix A,const rsb_blas_int_t * ia, const rsb_blas_int_t *ja, const void * va, rsb_blas_int_t nnz); 144 int rsb__BLAS_Xusset_element(blas_sparse_matrix A,rsb_blas_int_t i, rsb_blas_int_t j, const void * v); 145 int rsb__BLAS_Xusget_element(blas_sparse_matrix A,rsb_blas_int_t i, rsb_blas_int_t j, void * v); 146 int rsb__BLAS_Xusmv(enum blas_trans_type transA, const void * alphap, blas_sparse_matrix A, const void * Xp, rsb_blas_int_t incX, const void * betap, void * Yp, rsb_blas_int_t incY); 147 int rsb__BLAS_Xusmm(enum blas_trans_type transA, const void * alphap, blas_sparse_matrix A, const void * b, rsb_blas_int_t ldb, const void * betap, void * c, rsb_blas_int_t ldc, rsb_blas_int_t nrhs, enum blas_order_type order); 148 int rsb__BLAS_Xussv(enum blas_trans_type transT, void * alpha, blas_sparse_matrix T, void * x, rsb_blas_int_t incx); 149 void blas_usgp_f_( blas_sparse_matrix*A, rsb_blas_int_t * pname, rsb_blas_int_t * istat ); 150 void blas_ussp_f_( blas_sparse_matrix*A, rsb_blas_int_t * pname, rsb_blas_int_t * istat ); 151 /* blas_sparse_matrix rsb_load_spblas_matrix_file_as_matrix_market(const rsb_char_t * filename, rsb_type_t typecode ); now in rsb_libspblas.h */ 152 rsb_blas_int_t rsb__BLAS_Xusget_rows_nnz( blas_sparse_matrix A, rsb_blas_int_t fr, rsb_blas_int_t lr, rsb_blas_int_t * nnzp); 153 blas_sparse_matrix rsb__BLAS_handle_free(blas_sparse_matrix handle); 154 155 #define RSB_BLAS_STDOUT_MATRIX_SUMMARY(A) \ 156 { \ 157 struct rsb_mtx_t *RSB_DUMMY_ID=rsb__BLAS_inner_matrix_retrieve(A); \ 158 if(RSB_DUMMY_ID)RSB_STDOUT_MATRIX_SUMMARY(RSB_DUMMY_ID ); \ 159 /*else RSB_STDOUT_MATRIX_SUMMARY(RSB_DUMMY_MTX);*/ \ 160 } 161 162 #ifdef __cplusplus 163 } 164 #endif /* __cplusplus */ 165 166 #endif /* LIBSPBLAS_HANDLE_H_INCLUDED */ 167 /* @endcond */ 168