Created
March 15, 2018 17:13
-
-
Save sgolestane/a24265a0d0c04db3d31ec2c4b6e6b672 to your computer and use it in GitHub Desktop.
mkl_sparse_spmm Internal memory allocation failed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
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