- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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, &coo_cols, &coo_vals);
*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 = 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; }
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Rather than contend with a 10,000 X 10,000 matrix as the first test case, perhaps we should start with a simple, short example. Since I could not find an example in the files distributed in examples_core.zip in the MKL/examples directory, I made one up.
The diagonal-storage matrix from the MKL Ref. Man. (https://software.intel.com/en-us/node/522243#MKL_APPA_SMSF_6 ) is multiplied with a vector with the following code.
// MECEJ4 10/14/2014
#include <stdio.h>
#define N 5
#define NDIAG 5
int main(){
int dist = { -3,-1, 0, 1, 2 };
float u = 1e37;
float val[N*NDIAG] = { u, u, u,-4, 8,
u,-2, 0, 2, 0,
1, 5, 4, 7,-5,
-1, 0, 6, 0, u,
-3, 0, 4, u, u };
float x = { 1, 2, 3, 4, 5 }, y;
char transa = 'N';
int n=N, ndiag=NDIAG;
mkl_sdiagemv(&transa, &n, val, &n, dist, &ndiag, x, y);
printf(" %12.4e %12.4e %12.4e %12.4e %12.4e\n",y[0],y[1],y[2],y[3],y[4]);
}
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I am not familiar with the Matrix Market conventions, and you have not shown the #include statements in your program, so it is not possible for me to verify if the arguments being passed to mkl_sdiagemv() are correct.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Sorry about that here are the included header files:
#include <math.h> #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <float.h> #include <sys/time.h> #include "mmio.h" #include "mmio.c" #include <mkl_spblas.h>
and you can find the "mmio.c" and "mmio.h" files from this site:
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Did you have a specific test matrix to input to the program -- one that gave you the MKL runtime error?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I used the following matrix https://docs.google.com/file/d/0B828bj6uvoMVcEdjaTFfNUdyYmM/edit
which has three diagonals and consists of 2,999,997 non zero elements in a 1,000,000*1,000,000 sparse matrix
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
I can't build your reproducer:
test.cpp(102): error: argument of type "int *" is incompatible with parameter of type "int"
mm_read(argv[1], &m, &n, &nnz, &rowptrs, &colinds, &vals, &adia, &distance, &idiag, &ndiag);
^
test.cpp(102): error: argument of type "int *" is incompatible with parameter of type "int"
mm_read(argv[1], &m, &n, &nnz, &rowptrs, &colinds, &vals, &adia, &distance, &idiag, &ndiag);
^
Parameters are declared in the function as
int idiag, int ndiag)
But in the call you try to use pointers:
&idiag, &ndiag);
Regards,
Sergey
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Rather than contend with a 10,000 X 10,000 matrix as the first test case, perhaps we should start with a simple, short example. Since I could not find an example in the files distributed in examples_core.zip in the MKL/examples directory, I made one up.
The diagonal-storage matrix from the MKL Ref. Man. (https://software.intel.com/en-us/node/522243#MKL_APPA_SMSF_6 ) is multiplied with a vector with the following code.
// MECEJ4 10/14/2014
#include <stdio.h>
#define N 5
#define NDIAG 5
int main(){
int dist = { -3,-1, 0, 1, 2 };
float u = 1e37;
float val[N*NDIAG] = { u, u, u,-4, 8,
u,-2, 0, 2, 0,
1, 5, 4, 7,-5,
-1, 0, 6, 0, u,
-3, 0, 4, u, u };
float x = { 1, 2, 3, 4, 5 }, y;
char transa = 'N';
int n=N, ndiag=NDIAG;
mkl_sdiagemv(&transa, &n, val, &n, dist, &ndiag, x, y);
printf(" %12.4e %12.4e %12.4e %12.4e %12.4e\n",y[0],y[1],y[2],y[3],y[4]);
}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thank you very much mecej4 as my error says I had a wrong value passed to the fourth parameter in the mkl_sdiagemv. Your example hinted me to what should I pass instead.
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page