00001
00006 #if !defined(INC_SPMV_ROW_SEG_DIAG_H)
00007 #define INC_SPMV_ROW_SEG_DIAG_H
00008
00009 #if !defined(INC_SPMV_H)
00010 typedef struct tagSparseMatrixCSR SparseMatrixCSR;
00011 #endif
00012
00013 typedef struct tagSparseMatrixSegDiag
00014 {
00015 int start_pos, end_pos;
00016 int block_size;
00017 int n_diags;
00018
00019
00020 int n_full;
00021 int n_left;
00022
00023 int *ind;
00024 double *val;
00025
00026 int *ind_left;
00027 double *val_left;
00028 } SparseMatrixSegDiag;
00029
00030 typedef struct tagSparseMatrixRowSegDiag
00031 {
00032 int m, n;
00033 int nnz;
00034
00035 int n_segs;
00036 SparseMatrixSegDiag *Segs;
00037
00038 } SparseMatrixRowSegDiag;
00039
00040
00041 typedef void (*SPMV_DIAG_FP) (int, int, const int *,
00042 const double *, const double *, double *);
00043
00044 #define MAX_DIAGS 32
00045 extern SPMV_DIAG_FP spmvRSegDiagRoutines[MAX_DIAGS];
00046
00047
00048 extern void spmv_identify_rsegdiags (const SparseMatrixCSR * A,
00049 double min_threshold,
00050 double max_threshold, int *p_n_diags,
00051 int **p_diag_inds);
00052
00053 extern void spmv_convert_csr2rsegdiag (const SparseMatrixCSR * A,
00054 int n_diags, const int *diag_inds,
00055 int max_block_size,
00056 SparseMatrixRowSegDiag * D);
00057
00058 extern void spmv_convert_csr2rsegdiag_runs (const SparseMatrixCSR * A,
00059 int min_run_len,
00060 int max_block_size,
00061 SparseMatrixRowSegDiag * D,
00062 SparseMatrixCSR * A_left);
00063
00064 extern void spmv_alloc_segdiag (SparseMatrixSegDiag * S,
00065 int i_start, int num_rows, int b,
00066 int n_diags);
00067
00068 extern void spmv_alloc_rsegdiag (SparseMatrixRowSegDiag * D,
00069 int m, int n, int n_segs);
00070 extern void spmv_destroy_rsegdiag (SparseMatrixRowSegDiag * D);
00071
00072 extern void spmv_rsegdiag (const SparseMatrixRowSegDiag * D,
00073 const double *x, double *y);
00074
00075 #endif
00076
00077
00078
00079
00080
00081
00082
00083
00084