📄 nist_spblas.cc
字号:
Table[i] = S;
Table_active_matrices++;
return i;
}
}
}
return -1;
}
/*
removes an exisiting sparse matrix from global table. Returns 0, if
successfull, 1 otherwise.
*/
int Table_remove(unsigned int i)
{
if (i < Table.size() && Table[i] != NULL)
{
Table[i] = NULL;
Table_active_matrices--;
return 0;
}
else
return -1;
}
void Sp_mat::print() const
{
cout << "State : " <<
(is_void() ? "void" :
is_new() ? "new" :
is_open() ? "open" :
is_valid() ? "valid" : "unknown") << "\n";
cout << "M = " << num_rows() << " N = " << num_cols() <<
" nz = " << num_nonzeros() << "\n";
#define yesno(exp) ( (exp) ? "yes" : "no" )
cout << "real: " << yesno(is_real()) << "\n";
cout << "complex: " << yesno(is_complex()) << "\n";
cout << "double " << yesno(is_double_precision()) << "\n";
cout << "single " << yesno(is_single_precision()) << "\n";
cout << "upper_triangular: " << yesno(is_upper_triangular()) << "\n";
cout << "lower_triangular: " << yesno(is_lower_triangular()) << "\n";
cout << "regular: " << yesno(is_opt_regular()) << "\n";
cout << "irregular: " << yesno(is_opt_irregular()) << "\n";
cout << "block: " << yesno(is_opt_block()) << "\n";
cout << "unassembled:" << yesno(is_opt_unassembled()) << "\n";
#undef yesno
}
void table_print()
{
cout << "Table has " << Table.size() << " element(s). \n";
for (unsigned int i=0; i< Table.size(); i++)
{
if (Table[i] != 0)
{
cout << "***** Table[" << i << "]: \n";
Table[i]->print();
cout << "\n\n";
}
}
}
void print(int A)
{
cout << "\n";
Table[A]->print();
cout << "\n";
}
}
/* namespace NIST_SPBLAS */
using namespace std;
using namespace NIST_SPBLAS;
/* Level 1 */
/* these macros are useful for creating some consistency between the
various precisions and floating point types.
*/
typedef float FLOAT;
typedef double DOUBLE;
typedef complex<float> COMPLEX_FLOAT;
typedef complex<double> COMPLEX_DOUBLE;
typedef float SPBLAS_FLOAT_IN;
typedef double SPBLAS_DOUBLE_IN;
typedef const void * SPBLAS_COMPLEX_FLOAT_IN;
typedef const void * SPBLAS_COMPLEX_DOUBLE_IN;
typedef float * SPBLAS_FLOAT_OUT;
typedef double * SPBLAS_DOUBLE_OUT;
typedef void * SPBLAS_COMPLEX_FLOAT_OUT;
typedef void * SPBLAS_COMPLEX_DOUBLE_OUT;
typedef float * SPBLAS_FLOAT_IN_OUT;
typedef double * SPBLAS_DOUBLE_IN_OUT;
typedef void * SPBLAS_COMPLEX_FLOAT_IN_OUT;
typedef void * SPBLAS_COMPLEX_DOUBLE_IN_OUT;
typedef const float * SPBLAS_VECTOR_FLOAT_IN;
typedef const double * SPBLAS_VECTOR_DOUBLE_IN;
typedef const void * SPBLAS_VECTOR_COMPLEX_FLOAT_IN;
typedef const void * SPBLAS_VECTOR_COMPLEX_DOUBLE_IN;
typedef float * SPBLAS_VECTOR_FLOAT_OUT;
typedef double * SPBLAS_VECTOR_DOUBLE_OUT;
typedef void * SPBLAS_VECTOR_COMPLEX_FLOAT_OUT;
typedef void * SPBLAS_VECTOR_COMPLEX_DOUBLE_OUT;
typedef float * SPBLAS_VECTOR_FLOAT_IN_OUT;
typedef double * SPBLAS_VECTOR_DOUBLE_IN_OUT;
typedef void * SPBLAS_VECTOR_COMPLEX_FLOAT_IN_OUT;
typedef void * SPBLAS_VECTOR_COMPLEX_DOUBLE_IN_OUT;
#define SPBLAS_TO_FLOAT_IN(x) x
#define SPBLAS_TO_DOUBLE_IN(x) x
#define SPBLAS_TO_COMPLEX_FLOAT_IN(x) \
(* reinterpret_cast<const complex<float> *>(x))
#define SPBLAS_TO_COMPLEX_DOUBLE_IN(x) \
(* reinterpret_cast<const complex<double> *>(x))
#define SPBLAS_TO_FLOAT_OUT(x) x
#define SPBLAS_TO_DOUBLE_OUT(x) x
#define SPBLAS_TO_COMPLEX_FLOAT_OUT(x) reinterpret_cast<complex<float> *>(x)
#define SPBLAS_TO_COMPLEX_DOUBLE_OUT(x) reinterpret_cast<complex<double> *>(x)
#define SPBLAS_TO_FLOAT_IN_OUT(x) x
#define SPBLAS_TO_DOUBLE_IN_OUT(x) x
#define SPBLAS_TO_COMPLEX_FLOAT_IN_OUT(x) reinterpret_cast<complex<float> *>(x)
#define SPBLAS_TO_COMPLEX_DOUBLE_IN_OUT(x) reinterpret_cast<complex<double>*>(x)
#define SPBLAS_TO_VECTOR_DOUBLE_IN(x) x
#define SPBLAS_TO_VECTOR_FLOAT_IN(x) x
#define SPBLAS_TO_VECTOR_COMPLEX_FLOAT_IN(x) \
reinterpret_cast<const complex<float>*>(x)
#define SPBLAS_TO_VECTOR_COMPLEX_DOUBLE_IN(x) \
reinterpret_cast<const complex<double>*>(x)
#define SPBLAS_TO_VECTOR_DOUBLE_OUT(x) x
#define SPBLAS_TO_VECTOR_FLOAT_OUT(x) x
#define SPBLAS_TO_VECTOR_COMPLEX_FLOAT_OUT(x) \
reinterpret_cast<complex<float>*>(x)
#define SPBLAS_TO_VECTOR_COMPLEX_DOUBLE_OUT(x) \
reinterpret_cast<complex<double>*>(x)
#define SPBLAS_TO_VECTOR_DOUBLE_IN_OUT(x) x
#define SPBLAS_TO_VECTOR_FLOAT_IN_OUT(x) x
#define SPBLAS_TO_VECTOR_COMPLEX_FLOAT_IN_OUT(x) \
reinterpret_cast<complex<float>*>(x)
#define SPBLAS_TO_VECTOR_COMPLEX_DOUBLE_IN_OUT(x) \
reinterpret_cast<complex<double>*>(x)
#define BLAS_FLOAT_NAME(routine_name) BLAS_s##routine_name
#define BLAS_DOUBLE_NAME(routine_name) BLAS_d##routine_name
#define BLAS_COMPLEX_FLOAT_NAME(routine_name) BLAS_c##routine_name
#define BLAS_COMPLEX_DOUBLE_NAME(routine_name) BLAS_z##routine_name
#define TSp_MAT_SET_FLOAT(A) {A->set_single_precision(); A->set_real();}
#define TSp_MAT_SET_DOUBLE(A) {A->set_double_precision(); A->set_real();}
#define TSp_MAT_SET_COMPLEX_FLOAT(A) {A->set_single_precision(); A->set_complex();}
#define TSp_MAT_SET_COMPLEX_DOUBLE(A) {A->set_double_precision(); A->set_complex();}
/*------------------------------------*/
/* Non-precision Sparse BLAS routines */
/*------------------------------------*/
/* -------- */
/* USSP() */
/* -------- */
int BLAS_ussp(blas_sparse_matrix A, int pname)
{
Sp_mat *S = Table[A];
/* Note: these are returns, in the case */
/* statement, so "break" is not needed. */
switch (pname)
{
case (blas_zero_base) : S->set_zero_base(); break;
case (blas_one_base) : S->set_one_base(); break;
case (blas_unit_diag) : S->set_unit_diag(); break;
case (blas_complex) : S->set_complex(); break;
case (blas_real) : S->set_real(); break;
case (blas_single_precision) : S->set_single_precision(); break;
case (blas_double_precision) : S->set_double_precision(); break;
case (blas_lower_triangular) : S->set_lower_triangular(); break;
case (blas_upper_triangular) : S->set_upper_triangular(); break;
case (blas_lower_symmetric) : S->set_lower_symmetric(); break;
case (blas_upper_symmetric) : S->set_upper_symmetric(); break;
case (blas_lower_hermitian) : S->set_lower_hermitian(); break;
case (blas_upper_hermitian) : S->set_upper_hermitian(); break;
/* optimizations not used */
case (blas_regular ) :
case (blas_irregular) :
case (blas_block) :
case (blas_unassembled) : return 0;
default: return -1; /* invalid property */
}
return 0;
}
/* -------- */
/* USGP() */
/* -------- */
int BLAS_usgp(blas_sparse_matrix A, int pname)
{
Sp_mat *S = Table[A];
switch (pname)
{
case (blas_num_rows) : return S->num_rows();
case (blas_num_cols) : return S->num_cols();
case (blas_num_nonzeros) : return S->num_nonzeros();
case (blas_complex) : return S->is_complex();
case (blas_real) : return S->is_real();
case (blas_single_precision) : return S->is_single_precision();
case (blas_double_precision) : return S->is_double_precision();
case (blas_general) : return S->is_general();
case (blas_symmetric) : return S->is_symmetric();
case (blas_hermitian) : return S->is_hermitian();
case (blas_zero_base) : return S->is_zero_base();
case (blas_one_base) : return S->is_one_base();
case (blas_rowmajor) : return S->is_rowmajor();
case (blas_colmajor) : return S->is_colmajor();
case (blas_new_handle) : return S->is_new();
case (blas_valid_handle) : return S->is_valid();
case (blas_open_handle) : return S->is_open();
case (blas_invalid_handle) : return S->is_void();
case (blas_regular) : return S->is_opt_regular();
case (blas_irregular) : return S->is_opt_irregular();
case (blas_block) : return S->is_opt_block();
case (blas_unassembled) : return S->is_opt_unassembled();
default: return -1; /* invalid property */
}
}
/* -------- */
/* USDS() */
/* -------- */
int BLAS_usds(int A)
{
Sp_mat *S = Table[A];
S->destroy();
Table_remove(A);
return 0;
}
/* --------------------------- */
/* Level 1 generic routines */
/* --------------------------- */
/* dummy routines for real version of usdot to compile. */
inline const double& conj(const double &x)
{
return x;
}
inline const float& conj(const float &x)
{
return x;
}
template <class T>
void BLAS_xusdot( enum blas_conj_type conj_flag, int nz,
const T *x, const int *index, const T *y, int incy,
T *r, enum blas_base_type index_base)
{
T t(0);
if (index_base == blas_one_base)
y -= incy;
if (conj_flag == blas_no_conj)
{
for (int i=0; i<nz; i++)
t += x[i] * y[index[i]*incy];
}
else
for (int i=0; i<nz; i++)
t += conj(x[i]) * y[index[i]*incy];
*r = t;
}
template <class T>
void BLAS_xusaxpy(int nz, T alpha, const T *x,
const int *index, T *y, int incy,
enum blas_base_type index_base)
{
if (index_base == blas_one_base)
y -= incy;
for (int i=0; i<nz; i++)
{
// y[index[i]*incy] += (alpha * x[i]);
}
}
template <class T>
void BLAS_xusga( int nz, const T *y, int incy, T *x, const int *indx,
enum blas_base_type index_base )
{
if (index_base == blas_one_base)
y -= incy;
for (int i=0; i<nz; i++)
x[i] = y[indx[i]*incy];
}
template <class T>
void BLAS_xusgz( int nz, T *y, int incy, T *x, const int *indx,
enum blas_base_type index_base )
{
if (index_base == blas_one_base)
y -= incy;
for (int i=0; i<nz; i++)
{
x[i] = y[indx[i]*incy];
y[indx[i]*incy] = (T) 0.0;
}
}
template <class T>
void BLAS_xussc(int nz, const T *x, T *y, int incy, const int *index,
enum blas_base_type index_base)
{
if (index_base == blas_one_base)
y -= incy;
for (int i=0; i<nz; i++)
y[index[i]*incy] = x[i];
}
/* --------------------------- */
/* Level 2&3 generic precision */
/* --------------------------- */
template <class T>
int BLAS_xuscr_insert_entry(blas_sparse_matrix A, const T& val, int i, int j)
{
return ((TSp_mat<T> *)Table[A])->insert_entry(val, i, j);
}
template <class T>
int BLAS_xuscr_insert_entries(blas_sparse_matrix A, int nz, const T* Val,
const int* I, const int *J)
{
return ((TSp_mat<T>*) Table[A])->insert_entries(nz, Val, I, J);
}
template <class T>
int BLAS_xuscr_insert_col(blas_sparse_matrix A, int j, int nz, const T* Val,
const int* indx)
{
return ((TSp_mat<T>*) Table[A])->insert_col(j, nz, Val, indx);
}
template <class T>
int BLAS_xuscr_insert_row(blas_sparse_matrix A, int i, int nz, const T* Val,
const int* indx)
{
return ((TSp_mat<T>*) Table[A])->insert_row(i, nz, Val, indx);
}
template <class T>
int BLAS_xuscr_insert_clique(blas_sparse_matrix A, int k, int l, const T* Val,
const int row_stride, const int col_stride, const int *indx,
const int *jndx)
{
return ((TSp_mat<T>*) Table[A])->insert_clique(k, l, Val, row_stride,
col_stride, indx, jndx);
}
template <class T>
int BLAS_xuscr_insert_block(blas_sparse_matrix A, const T* Val,
const int row_stride, const int col_stride, int bi, int bj )
{
return ((TSp_mat<T>*) Table[A])->insert_block(Val,
row_stride, col_stride, bi, bj);
}
inline int BLAS_xuscr_end(blas_sparse_matrix A)
{
return (Table[A])->end_construction();
}
template <class T>
int BLAS_xusmv(enum blas_trans_type transa, const T& alpha,
blas_sparse_matrix A, const T *x, int incx, T *y, int incy )
{
TSp_mat<T> *M = (TSp_mat<T> *) Table[A];
ASSERT_RETURN(M->is_valid(), 1);
return M->usmv(transa, alpha, x, incx, y, incy);
}
template <class T>
int BLAS_xusmm(enum blas_order_type ordera, enum blas_trans_type transa,
int nrhs, const T& alpha, blas_sparse_matrix A,
const T *B, int ldB, T* C, int ldC)
{
TSp_mat<T> *M = (TSp_mat<T> *) Table[A];
ASSERT_RETURN(M->is_valid(), 1);
return M->usmm(ordera, transa, nrhs, alpha, B, ldB, C, ldC);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -