I am using the MKL library to perform the sparse matrix vector multiplication using diagonal format, When I use the MKL mkl_sdiagemv function I get a "MKL ERROR: Parameter 4 was incorrect on entry to MKL_SDIAGEMV. " error.
void mm_read(char* filename, int *m, int *n, int *nnz, int **rowptrs, int **colinds, float **vals, float **adia, int **distance, int idiag, int ndiag) { // open file FILE* mmfile = fopen(filename, "r"); assert(mmfile != NULL && "Read matrix file."); // read MatrixMarket header int status; MM_typecode matcode; status = mm_read_banner(mmfile, &matcode); assert(status == 0 && "Parsed banner."); status = mm_read_mtx_crd_size(mmfile, m, n, nnz); assert(status == 0 && "Parsed matrix m, n, and nnz."); printf("- matrix is %d-by-%d with %d nnz.\n", *m, *n, *nnz); int *coo_rows = (int*) malloc(*nnz * sizeof(int)); int *coo_cols = (int*) malloc(*nnz * sizeof(int)); float *coo_vals = (float*) malloc(*nnz * sizeof(float)); // read COO values int i = 0; for ( i = 0; i < *nnz; i++) status = fscanf(mmfile, "%d %d %g\n",&coo_rows[i], &coo_cols[i], &coo_vals[i]); *rowptrs = (int*) malloc((*m+1)*sizeof(int)); *colinds = (int*) malloc(*nnz*sizeof(int)); *vals = (float*) malloc(*nnz*sizeof(int)); // convert to CSR matrix int info; int job[] = { 2, // job(1)=2 (coo->csr with sorting) 1, // job(2)=1 (one-based indexing for csr matrix) 1, // job(3)=1 (one-based indexing for coo matrix) 0, // empty *nnz, // job(5)=nnz (sets nnz for csr matrix) 0 // job(6)=0 (all output arrays filled) }; mkl_scsrcoo( job, m, *vals, *colinds, *rowptrs, nnz, coo_vals, coo_rows, coo_cols, &info); assert(info == 0 && "Converted COO->CSR"); // DIA matrix dimensions and values ndiag = 4; idiag = 3; *adia = (float*) malloc(*nnz * idiag * sizeof(int)); *distance = (int* ) malloc(idiag * sizeof(int)); int job1[] = { 0, // job(0)=2 1, // job(1)=1 1, // job(2)=1 2, // empty3 *nnz, // empty4 10, // job(5)=nnz }; mkl_scsrdia (job1, m, *vals, *colinds, *rowptrs, *adia, &ndiag, *distance, &idiag, *vals, *colinds, *rowptrs, &info); assert(info == 0 && "Converted CSR->DIA"); // free COO matrix free(coo_rows); free(coo_cols); free(coo_vals); } float * randvec(int n) { float *v = (float*) malloc(n * sizeof(float)); int i = 0; for (i = 0; i < n; i++) v[i] = rand() / (float) RAND_MAX; return v; } int main(int argc, char* argv[]) { // require filename for matrix to test if (argc != 2) { fprintf(stderr, "Usage: %s MATRIX.mm\n", argv[0]); exit(1); } int m, n, nnz; int *rowptrs, *colinds; float *vals; float *adia; int *distance; int idiag, ndiag; // read matrix from file mm_read(argv[1], &m, &n, &nnz, &rowptrs, &colinds, &vals, &adia, &distance, &idiag, &ndiag); // allocate vectors for computation float *v = randvec(n); float *cpu_answer = (float*) malloc(m*sizeof(float)); struct timeval start, end; printf (" Running Intel(R) MKL from 1 to %i threads \n\n", mkl_get_max_threads()); mkl_sdiagemv ((char*)"N", &m, adia, &idiag, distance, &ndiag, v, cpu_answer); // release memory free(rowptrs); free(colinds); free(vals); free(cpu_answer); free(v); free(adia); free(distance); return 0; }