Hi all,
I have a new question about sparse matrix addition routine mkl_sparse_s_add, it return a strange result. And when I using double precision routine ml_sparse_d_add, everything is ok.
Following is the example program.
#include "mkl_spblas.h"
#include <stdio.h>
void print_csr_sparse_s(const sparse_matrix_t csrA)
{
// Read Matrix Data and Print it
int row, col;
sparse_index_base_t indextype;
int * bi, *ei;
int * j;
float *rv;
sparse_status_t status = mkl_sparse_s_export_csr(csrA, &indextype, &row, &col, &bi, &ei, &j, &rv);
if (status==SPARSE_STATUS_SUCCESS)
{
printf("SparseMatrix(%d x %d) [base:%d]\n", row, col, indextype);
for (int r = 0; r<row; ++r)
{
for (int idx = bi[r]; idx<ei[r]; ++idx)
{
printf("<%d, %d> \t %f\n", r, j[idx], rv[idx]);
}
}
}
return;
}
void print_csr_sparse_d(const sparse_matrix_t csrA)
{
// Read Matrix Data and Print it
int row, col;
sparse_index_base_t indextype;
int * bi, *ei;
int * j;
double *rv;
sparse_status_t status = mkl_sparse_d_export_csr(csrA, &indextype, &row, &col, &bi, &ei, &j, &rv);
if (status==SPARSE_STATUS_SUCCESS)
{
printf("SparseMatrix(%d x %d) [base:%d]\n", row, col, indextype);
for (int r = 0; r<row; ++r)
{
for (int idx = bi[r]; idx<ei[r]; ++idx)
{
printf("<%d, %d> \t %f\n", r, j[idx], rv[idx]);
}
}
}
return;
}
// test addition of sparse matrix
void test_add_s()
{
// Define sparse-matrix M
int mi[5] = {0, 2, 5, 8, 10};
int mj[10] = {0, 1, 0, 1, 2, 1, 2, 3, 2, 3};
float mv[10] = {2.0f, 1.0f, 1.0f, 2.0f, 1.0f, 1.0f, 2.0f, 1.0f, 1.0f, 2.0f};
sparse_matrix_t M;
// Define sparse-matrix N
int ni[5] = {0, 1, 2, 3, 4};
int nj[4] = {0, 1, 2, 3};
float nv[4] = {3.0f, 2.0f, 1.0f, -1.0f};
sparse_matrix_t N;
// create csr matrix
mkl_sparse_s_create_csr(&M, SPARSE_INDEX_BASE_ZERO, 4, 4, mi, mi+1, mj, mv);
mkl_sparse_s_create_csr(&N, SPARSE_INDEX_BASE_ZERO, 4, 4, ni, ni+1, nj, nv);
// output matrix
print_csr_sparse_s(M);
print_csr_sparse_s(N);
// do addition
sparse_matrix_t C;
mkl_sparse_s_add(SPARSE_OPERATION_NON_TRANSPOSE ,M, 2, N, &C);
// output result
print_csr_sparse_s(C);
// free memory
mkl_sparse_destroy(M);
mkl_sparse_destroy(N);
mkl_sparse_destroy(C);
}
void test_add_d()
{
// Define sparse-matrix M
int mi[5] = {0, 2, 5, 8, 10};
int mj[10] = {0, 1, 0, 1, 2, 1, 2, 3, 2, 3};
double mv[10] = {2.0f, 1.0f, 1.0f, 2.0f, 1.0f, 1.0f, 2.0f, 1.0f, 1.0f, 2.0f};
sparse_matrix_t M;
// Define sparse-matrix N
int ni[5] = {0, 1, 2, 3, 4};
int nj[4] = {0, 1, 2, 3};
double nv[4] = {3.0f, 2.0f, 1.0f, -1.0f};
sparse_matrix_t N;
// create csr matrix
mkl_sparse_d_create_csr(&M, SPARSE_INDEX_BASE_ZERO, 4, 4, mi, mi+1, mj, mv);
mkl_sparse_d_create_csr(&N, SPARSE_INDEX_BASE_ZERO, 4, 4, ni, ni+1, nj, nv);
// output matrix
print_csr_sparse_d(M);
print_csr_sparse_d(N);
// do addition
sparse_matrix_t C;
mkl_sparse_d_add(SPARSE_OPERATION_NON_TRANSPOSE ,M, 2, N, &C);
// output result
print_csr_sparse_d(C);
// free memory
mkl_sparse_destroy(M);
mkl_sparse_destroy(N);
mkl_sparse_destroy(C);
}
int main()
{
test_add_d();
test_add_s();
return 1;
}
I got results twice, the first is correct, and the second is wrong.
SparseMatrix(4 x 4) [base:0]
<0, 0> 2.000000
<0, 1> 1.000000
<1, 0> 1.000000
<1, 1> 2.000000
<1, 2> 1.000000
<2, 1> 1.000000
<2, 2> 2.000000
<2, 3> 1.000000
<3, 2> 1.000000
<3, 3> 2.000000
SparseMatrix(4 x 4) [base:0]
<0, 0> 3.000000
<1, 1> 2.000000
<2, 2> 1.000000
<3, 3> -1.000000
SparseMatrix(4 x 4) [base:0]
<0, 0> 7.000000
<0, 1> 2.000000
<1, 0> 2.000000
<1, 1> 6.000000
<1, 2> 2.000000
<2, 1> 2.000000
<2, 2> 5.000000
<2, 3> 2.000000
<3, 2> 2.000000
<3, 3> 3.000000
SparseMatrix(4 x 4) [base:0]
<0, 0> 2.000000
<0, 1> 1.000000
<1, 0> 1.000000
<1, 1> 2.000000
<1, 2> 1.000000
<2, 1> 1.000000
<2, 2> 2.000000
<2, 3> 1.000000
<3, 2> 1.000000
<3, 3> 2.000000
SparseMatrix(4 x 4) [base:0]
<0, 0> 3.000000
<1, 1> 2.000000
<2, 2> 1.000000
<3, 3> -1.000000
SparseMatrix(4 x 4) [base:0]
<0, 0> 3.000000
<0, 1> 0.000000
<1, 0> 0.000000
<1, 1> 2.000000
<1, 2> 0.000000
<2, 1> 0.000000
<2, 2> 1.000000
<2, 3> 0.000000
<3, 2> 0.000000
<3, 3> -1.000000
Best regrads,
Tianxiong Lu