Skip to content

Instantly share code, notes, and snippets.

@sgolestane
Created March 15, 2018 17:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sgolestane/a24265a0d0c04db3d31ec2c4b6e6b672 to your computer and use it in GitHub Desktop.
Save sgolestane/a24265a0d0c04db3d31ec2c4b6e6b672 to your computer and use it in GitHub Desktop.
mkl_sparse_spmm Internal memory allocation failed.
/*
source /opt/intel/bin/compilervars.sh -arch intel64 -platform mac
DYLD_LIBRARY_PATH="/opt/intel/mkl/lib"
gcc -fsanitize=address -lmkl_rt -lm -o test_mkl_sparse_spmm test_mkl_sparse_spmm.c
A:
|------------------------------------------------------------------------------------------|
| 0 | | | | | 5 | | | | | 10 | | | | | 15 | 16 |
| |---|---|---|---|---|---|---|--------------|---|---|----|----|----|----|----|----|----|
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0.2160676033 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 10 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 15 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 19 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|------------------------------------------------------------------------------------------|
B:
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 0 | | | | | 5 | | | | | 10 | | | | | 15 | | | | | 20 | | | | | 25 | 26 |
| |--------------|--------------|--------------|-------------|--------------|--------------|--------------|---|---|--------------|--------------|--------------|--------------|----|----|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|----|--------------|--------------|--------------|
| 0 | 0 | 0 | 0 | 0 | 0.2270670575 | 0 | 0 | 0 | 0 | 0 | 0 | 0.7164893616 | 0 | 0 | 0 | 0 | 0.6960181168 | 0 | 0.1719575905 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0.7670231658 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| | 0 | 0 | 0 | 0 | 0 | 0.0946182767 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0.7731809744 | 0 | 0 | 0 | 0 | 0 | 0.1169281981 | 0 | 0 | 0 | 0 | 0 |
| | 0 | 0 | 0 | 0 | 0 | 0.2326666037 | 0.0438597402 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0.6457324588 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0.100030693 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 5 | 0 | 0.4981258391 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0.7566819774 | 0 | 0 | 0 | 0 | 0.676145305 |
| | 0.0157600149 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0.0266575566 | 0 |
| | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0.5719235562 | 0.4569609261 | 0 | 0 | 0 | 0 | 0.0175593821 | 0 | 0.0696060809 | 0.0875241599 | 0 | 0.7905532661 | 0 | 0 | 0 | 0 | 0 |
| | 0 | 0 | 0 | 0 | 0 | 0 | 0.9684897302 | 0 | 0 | 0 | 0.6982137481 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 10 | 0 | 0.4387120249 | 0 | 0 | 0.0975516623 | 0 | 0.8432493542 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| | 0 | 0 | 0 | 0.164683462 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0.1745482716 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0.0389571866 | 0 | 0 | 0 | 0.9021064311 | 0 | 0 | 0 | 0 | 0.1013996911 | 0 | 0 | 0 | 0 | 0 | 0.8060033501 |
| | 0 | 0.9332810992 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0.975001897 | 0 | 0 | 0.4058346166 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0.4625421235 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0.3016980796 | 0 | 0 |
| 15 | 0 | 0 | 0.1604248694 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0.9342255712 | 0.6640907474 | 0 | 0.6706445707 | 0 | 0.5659020008 | 0 | 0 | 0 | 0.1953694547 |
| 16 | 0.0718356118 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0.1263603942 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Convering to CSR3 (for brevity, values have been rounded):
A:
-----------------------------------------------------------------------------------------------------
| Rows Indexes: | 1 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
| Columns: | 8 |
| Values: | 0.216 |
-----------------------------------------------------------------------------------------------------
B:
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Rows Indexes: | 1 | 5 | 6 | 9 | 12 | 13 | 16 | 18 | 18 | 24 | 26 | 29 | 31 | 35 | 38 | 40 | 46 | 48 |
| Columns: | 5 | 12 | 17 | 19 | 17 | 6 | 16 | 22 | 6 | 7 | 16 | 10 | 2 | 22 | 27 | 1 | 26 | 11 | 12 | 17 | 19 | 20 | 22 | 7 | 11 | 2 | 5 | 7 | 4 | 20 | 12 | 16 | 21 | 27 | 2 | 10 | 13 | 10 | 25 | 3 | 18 | 19 | 21 | 23 | 27 | 1 | 11 |
| Values: | 0.227 | 0.716 | 0.696 | 0.172 | 0.767 | 0.095 | 0.773 | 0.117 | 0.233 | 0.044 | 0.646 | 0.1 | 0.498 | 0.757 | 0.676 | 0.016 | 0.027 | 0.572 | 0.457 | 0.018 | 0.07 | 0.088 | 0.791 | 0.968 | 0.698 | 0.439 | 0.098 | 0.843 | 0.165 | 0.175 | 0.039 | 0.902 | 0.101 | 0.806 | 0.933 | 0.975 | 0.406 | 0.463 | 0.302 | 0.16 | 0.934 | 0.664 | 0.671 | 0.566 | 0.195 | 0.072 | 0.126 |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
*/
#include <stdio.h>
#include <assert.h>
#include <math.h>
#include "mkl.h"
int main() {
#define M 20
#define N 27
#define K 17
#define NNZ_A 1
#define NNZ_B 47
#define ALIGN 128
#define CALL_AND_CHECK_STATUS(function, error_message) do { \
if(function != SPARSE_STATUS_SUCCESS) \
{ \
printf( "Status: %d\n", function ); \
printf(error_message); fflush(0); \
status = 1; \
goto memory_free; \
} \
} while(0)
/* Declaration of values */
double *values_A = NULL, *values_B = NULL, *values_C = NULL;
MKL_INT *columns_A = NULL, *columns_B = NULL, *columns_C = NULL;
MKL_INT *rowIndex_A = NULL, *rowIndex_B = NULL, *pointerB_C = NULL, *pointerE_C = NULL;
double left, right, residual;
MKL_INT rows, cols, i, j, ii, status;
sparse_index_base_t indexing;
struct matrix_descr descr_type_gen;
sparse_matrix_t csrA = NULL, csrB = NULL, csrC = NULL;
/* Allocation of memory */
values_A = (double *)mkl_malloc(sizeof(double) * NNZ_A, ALIGN);
columns_A = (MKL_INT *)mkl_malloc(sizeof(MKL_INT) * NNZ_A, ALIGN);
rowIndex_A = (MKL_INT *)mkl_malloc(sizeof(MKL_INT) * (M + 1), ALIGN);
values_B = (double *)mkl_malloc(sizeof(double) * NNZ_B, ALIGN);
columns_B = (MKL_INT *)mkl_malloc(sizeof(MKL_INT) * NNZ_B, ALIGN);
rowIndex_B = (MKL_INT *)mkl_malloc(sizeof(MKL_INT) * (K + 1), ALIGN);
/* Set values of the variables*/
descr_type_gen.type = SPARSE_MATRIX_TYPE_GENERAL;
status = 0, ii = 0;
//Matrix A
values_A[0] = 0.216;
columns_A[0] = 8;
rowIndex_A[0] = 1;
rowIndex_A[1] = 1;
rowIndex_A[2] = 2;
rowIndex_A[3] = 2;
rowIndex_A[4] = 2;
rowIndex_A[5] = 2;
rowIndex_A[6] = 2;
rowIndex_A[7] = 2;
rowIndex_A[8] = 2;
rowIndex_A[9] = 2;
rowIndex_A[10] = 2;
rowIndex_A[11] = 2;
rowIndex_A[12] = 2;
rowIndex_A[13] = 2;
rowIndex_A[14] = 2;
rowIndex_A[15] = 2;
rowIndex_A[16] = 2;
rowIndex_A[17] = 2;
rowIndex_A[18] = 2;
rowIndex_A[19] = 2;
rowIndex_A[20] = 2;
//Matrix B
values_B[0] = 0.227 ;
values_B[1] = 0.716 ;
values_B[2] = 0.696 ;
values_B[3] = 0.172 ;
values_B[4] = 0.767 ;
values_B[5] = 0.095 ;
values_B[6] = 0.773 ;
values_B[7] = 0.117 ;
values_B[8] = 0.233 ;
values_B[9] = 0.044 ;
values_B[10] = 0.646 ;
values_B[11] = 0.1 ;
values_B[12] = 0.498;
values_B[13] = 0.757 ;
values_B[14] = 0.676 ;
values_B[15] = 0.016 ;
values_B[16] = 0.027 ;
values_B[17] = 0.572 ;
values_B[18] = 0.457 ;
values_B[19] = 0.018 ;
values_B[20] = 0.07 ;
values_B[21] = 0.088 ;
values_B[22] = 0.791 ;
values_B[23] = 0.968 ;
values_B[24] = 0.698 ;
values_B[25] = 0.439 ;
values_B[26] = 0.098 ;
values_B[27] = 0.843 ;
values_B[28] = 0.165 ;
values_B[29] = 0.175 ;
values_B[30] = 0.039 ;
values_B[31] = 0.902 ;
values_B[32] = 0.101 ;
values_B[33] = 0.806 ;
values_B[34] = 0.933 ;
values_B[35] = 0.975 ;
values_B[36] = 0.406 ;
values_B[37] = 0.463 ;
values_B[38] = 0.302 ;
values_B[39] = 0.16 ;
values_B[40] = 0.934 ;
values_B[41] = 0.664 ;
values_B[42] = 0.671 ;
values_B[43] = 0.566 ;
values_B[44] = 0.195 ;
values_B[45] = 0.072 ;
values_B[46] = 0.126;
columns_B[0] = 5;
columns_B[1] = 12;
columns_B[2] = 17;
columns_B[3] = 19;
columns_B[4] = 17;
columns_B[5] = 6 ;
columns_B[6] = 16;
columns_B[7] = 22;
columns_B[8] = 6 ;
columns_B[9] = 7 ;
columns_B[10] = 16;
columns_B[11] = 10 ;
columns_B[12] = 2 ;
columns_B[13] = 22;
columns_B[14] = 27;
columns_B[15] = 1 ;
columns_B[16] = 26;
columns_B[17] = 11;
columns_B[18] = 12;
columns_B[19] = 17;
columns_B[20] = 19 ;
columns_B[21] = 20;
columns_B[22] = 22;
columns_B[23] = 7 ;
columns_B[24] = 11;
columns_B[25] = 2 ;
columns_B[26] = 5 ;
columns_B[27] = 7 ;
columns_B[28] = 4 ;
columns_B[29] = 20;
columns_B[30] = 12;
columns_B[31] = 16;
columns_B[32] = 21;
columns_B[33] = 27;
columns_B[34] = 2 ;
columns_B[35] = 10 ;
columns_B[36] = 13;
columns_B[37] = 10;
columns_B[38] = 25;
columns_B[39] = 3;
columns_B[40] = 18;
columns_B[41] = 19;
columns_B[42] = 21;
columns_B[43] = 23;
columns_B[44] = 27;
columns_B[45] = 1 ;
columns_B[46] = 11 ;
rowIndex_B[0] = 1;
rowIndex_B[1] = 5;
rowIndex_B[2] = 6;
rowIndex_B[3] = 9;
rowIndex_B[4] = 12;
rowIndex_B[5] = 13;
rowIndex_B[6] = 16;
rowIndex_B[7] = 18;
rowIndex_B[8] = 18;
rowIndex_B[9] = 24;
rowIndex_B[10] = 26;
rowIndex_B[11] = 29;
rowIndex_B[12] = 31;
rowIndex_B[13] = 35;
rowIndex_B[14] = 38;
rowIndex_B[15] = 40;
rowIndex_B[16] = 46;
rowIndex_B[17] = 48;
/* Printing usable data */
printf( " COMPUTE A * B = C, where matrices are stored in CSR format\n" );
printf( "\n MATRIX A:\nrow# : (value, column)\n" );
for( i = 0; i < M; i++ )
{
printf("row#%d:", i +1 ); fflush(0);
for( j = rowIndex_A[i]; j < rowIndex_A[i+1]; j++ )
{
printf(" (%f, %d)", values_A[ii], columns_A[ii] ); fflush(0);
ii++;
}
printf( "\n" );
}
ii = 0;
printf( "\n MATRIX B:\nrow# : (value, column)\n" );
for( i = 0; i < K; i++ )
{
printf("row#%d:", i ); fflush(0);
for( j = rowIndex_B[i]; j < rowIndex_B[i+1]; j++ )
{
printf(" (%f, %d)", values_B[ii], columns_B[ii] ); fflush(0);
ii++;
}
printf( "\n" );
}
CALL_AND_CHECK_STATUS(mkl_sparse_d_create_csr( &csrA, SPARSE_INDEX_BASE_ONE, M, K, rowIndex_A, rowIndex_A+1, columns_A, values_A ),
"Error after MKL_SPARSE_D_CREATE_CSR, csrA \n");
CALL_AND_CHECK_STATUS(mkl_sparse_d_create_csr( &csrB, SPARSE_INDEX_BASE_ONE, K, N, rowIndex_B, rowIndex_B+1, columns_B, values_B ),
"Error after MKL_SPARSE_D_CREATE_CSR, csrB \n");
printf( "\n\n_______________ Compute C = A * B _________________\n\n" );
CALL_AND_CHECK_STATUS(mkl_sparse_spmm( SPARSE_OPERATION_NON_TRANSPOSE, csrA, csrB, &csrC ),
"Error after MKL_SPARSE_SPMM \n");
printf( "\n\n_______________ Compute is done _________________\n\n" );
/* Printing OUTPUT DATA */
CALL_AND_CHECK_STATUS(mkl_sparse_d_export_csr( csrC, &indexing, &rows, &cols, &pointerB_C, &pointerE_C, &columns_C, &values_C ),
"Error after MKL_SPARSE_D_EXPORT_CSR \n");
printf( "\n RESULTANT MATRIX C:\nrow# : (value, column) (value, column)\n" );
ii = 0;
for( i = 0; i < M; i++ )
{
printf("row#%d:", i + 1); fflush(0);
for( j = pointerB_C[i]; j < pointerE_C[i]; j++ )
{
printf(" (%f, %d)", values_C[ii], columns_C[ii] ); fflush(0);
ii++;
}
printf( "\n" );
}
printf( "_____________________________________________________________________ \n" );
/* Deallocate memory */
memory_free:
//Release matrix handle. Not necessary to deallocate arrays for which we don't allocate memory: values_C, columns_C, pointerB_C, and pointerE_C.
//These arrays will be deallocated together with csrC structure.
if( mkl_sparse_destroy( csrC ) != SPARSE_STATUS_SUCCESS)
{ printf(" Error after MKL_SPARSE_DESTROY, csrC \n");fflush(0); status = 1; }
//Release matrix handle and deallocate arrays for which we allocate memory ourselves.
if( mkl_sparse_destroy( csrA ) != SPARSE_STATUS_SUCCESS)
{ printf(" Error after MKL_SPARSE_DESTROY, csrA \n");fflush(0); status = 1; }
mkl_free(values_A); mkl_free(columns_A); mkl_free(rowIndex_A);
if( mkl_sparse_destroy( csrB ) != SPARSE_STATUS_SUCCESS)
{ printf(" Error after MKL_SPARSE_DESTROY, csrB \n");fflush(0); status = 1; }
mkl_free(values_B); mkl_free(columns_B); mkl_free(rowIndex_B);
return status;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment