- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello everybody,
I ran into wrong results when I was trying to use mkl_sparse_d_mm() to multiply a symmetric sparse matrix A [12 x 12] (CSR packed, lower triangular) by a dense rectangular matrix B [12 x 3] (full), that is:
C = A * B
Both matrices A and B have column wise layout, while the A matrix's CSR indeces arrays are all 0-based.
Here the example code:
int main()
{
// sparse matrix A[12x12] (lower triangular, column wise layout, 0-based indexing)
struct matrix_descr A_descr;
A_descr.type = SPARSE_MATRIX_TYPE_TRIANGULAR;
A_descr.mode = SPARSE_FILL_MODE_LOWER;
A_descr.diag = SPARSE_DIAG_NON_UNIT;
// A rows_start
MKL_INT A_ptrb[12] = { 0, 3, 8, 12, 14, 17, 20, 22, 25, 27, 28, 29 };
// A rows_end
MKL_INT A_ptre[12] = { 3, 8, 12, 14, 17, 20, 22, 25, 27, 28, 29, 30 };
// A column_indeces
MKL_INT A_col_index[30] = { 0, 4, 6, 1, 3, 5, 7, 11, 2, 4, 8, 10, 3, 9, 4, 8, 10, 5, 7, 11, 6, 10, 7, 9, 11, 8, 10, 9, 10, 11 };
// A values
double A_values[30] = { 3.60394e+06, -2.27463e+07, -3.14901e+06, 462747, 2.27463e+07, -1.56399e+06, -7819.96, -1.56399e+06, 1.26039e+07, 1.56399e+06, -7819.96, 1.56399e+06, 1.63638e+09, -7.91937e+07, 1.97495e+09, -1.56399e+06, 2.07831e+08, 7.3454e+08, 1.56399e+06, 2.07831e+08, 3.60394e+06, -2.27463e+07, 462747, 2.27463e+07, 1.56399e+06, 1.26039e+07, -1.56399e+06, 1.63638e+09, 1.97495e+09, 7.3454e+08 };
// handle to A matrix
sparse_matrix_t A_handle;
sparse_status_t outcome = mkl_sparse_d_create_csr(&A_handle, SPARSE_INDEX_BASE_ZERO, 12, 12, A_ptrb, A_ptre, A_col_index, A_values);
// dense matrix B [12x3] values (full, column wise layout)
double B[36] = { 0.447212, 0, -0.00115627, 0, 0.00466197, 0, 0.447212, 0, 0.00115627, 0, 0.00466197, 0, 3.77898e-21, 0, -0.447214, 0, 5.05844e-22, 0, 6.67055e-22, 0, -0.447214, 0, -4.18026e-22, 0, 0, 0.447214, 0, -0.00653261, 0, -3.29415e-20, 0, 0.447214, 0, -0.00653261, 0, -3.44084e-21 };
// C = A * B double C[36];
mkl_sparse_d_mm(SPARSE_OPERATION_NON_TRANSPOSE, 1.0, A_handle, A_descr, SPARSE_LAYOUT_COLUMN_MAJOR, B, 3, 12, 0.0, C, 12);
// print C
for (size_t r = 0; r != 12; r++)
{
for (size_t c = 0; c != 3; c++)
std::cout << C[r + 12*c] << " ";
std::cout << std::endl;
}
return 0;
}
Could it be a problem with the triangular form assigned to the CSR matrix? Does the routine need the full CSR matrix maybe? The results seem to be correct if the sparse matrix has no off-diagonal terms (i.e. it it's diagonal).
Link Copied
0 Replies

Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page