释放堆分配指针后与Intel MKL_Sparse库交互触发段错误
指针释放与Intel MKL_Sparse库交互的段错误问题
我正在更新一段用于时间演化循环的代码,遇到了指针分配、释放与Intel MKL_Sparse库交互的问题:
- 已实现生成大型矩阵并存储为二进制文件的算法,以及
load_sparse_matrix()函数,该函数读取二进制文件并返回sparse_matrix_t格式的稀疏矩阵 - 为避免栈溢出,用堆分配的3个指针临时存储矩阵数据;最小示例中注释了
fread读取部分,改用代码生成单位矩阵(对应代码第55、67行) - 稀疏矩阵能成功创建并返回,但返回前释放这3个指针数组(第96-97行)后,执行矩阵-向量乘法(单位矩阵×零向量,第30行)会触发段错误;若不释放指针,乘法正常但存在内存泄漏
希望熟悉指针与稀疏矩阵库的人士帮忙排查问题。
#include <complex.h> #include <math.h> #include <mkl_types.h> #include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define MKL_Complex16 complex #include "mkl_spblas.h" #define L 4 #define N 16 // void loadCRS_int(char *desc, char *rowcolumn, int num_values, MKL_INT *read); // void loadCRS_float(char *desc, int num_values, double complex *read); sparse_matrix_t load_sparse_matrix(char *observable_name); int main() { char *observable_name = "s^z_4"; sparse_matrix_t A = load_sparse_matrix(observable_name); struct matrix_descr descr_matrix = {SPARSE_MATRIX_TYPE_HERMITIAN, SPARSE_FILL_MODE_UPPER, SPARSE_DIAG_NON_UNIT}; double complex *A_init_state = calloc(N, sizeof(double complex)); double complex *phi = calloc(N, sizeof(double complex)); double complex alpha = 1.0 + I * 0.0, beta = 0.0 + I * 0.0; mkl_sparse_z_mv(SPARSE_OPERATION_NON_TRANSPOSE, alpha, A, descr_matrix, phi, beta, A_init_state); free(A_init_state); free(phi); mkl_sparse_destroy(A); return 0; } sparse_matrix_t load_sparse_matrix(char *observable_name) { MKL_INT *observable_rowPtr = calloc(N + 1, sizeof(MKL_INT)); // char matrix_CRS_buffer[512]; // sprintf(matrix_CRS_buffer, "CRS_files/matrix_CRS_L=%02d_%s_row.dat", L, // observable_name); // builds variable dependend file names for observable // FILE *file = fopen(matrix_CRS_buffer, "r"); // if (file == NULL) { // printf("file does not exist\n"); // printf("filename %s\n", matrix_CRS_buffer); // } // fread(observable_rowPtr, sizeof(MKL_INT), N+1, file); // fclose(file); // loadCRS_int(observable_name, "row", N + 1 , observable_rowPtr); for (int i = 0; i <= N; i++) { observable_rowPtr[i] = i; } int num_values = observable_rowPtr[N]; double complex *observable_val = calloc(num_values, sizeof(double complex)); MKL_INT *observable_colInd = calloc(num_values, sizeof(MKL_INT)); // loadCRS_int(observable_name, "column", num_values , observable_colInd); // loadCRS_float(observable_name, num_values, observable_val); for (int i = 0; i < num_values; i++) { observable_colInd[i] = i; observable_val[i] = 1.0 * i; } // init sparse matrix sparse_matrix_t A; sparse_status_t status; int exit_status = 0; status = mkl_sparse_z_create_csr( &A, SPARSE_INDEX_BASE_ZERO, N, N, observable_rowPtr, observable_rowPtr + 1, observable_colInd, observable_val); // Create handle with matrix stored in CSR format if (status != SPARSE_STATUS_SUCCESS) { printf(" Error in mkl_sparse_d_create_csr: %d \n", status); exit_status = 1; return NULL; } status = mkl_sparse_optimize(A); // Analyze sparse matrix; choose proper // kernels and workload balancing strategy if (status != SPARSE_STATUS_SUCCESS) { printf(" Error in mkl_sparse_optimize: %d \n", status); exit_status = 1; return NULL; } free(observable_val); free(observable_colInd); free(observable_rowPtr); return A; } // void loadCRS_int(char *desc, char *rowcolumn, int num_values, MKL_INT *read) // { // char matrix_CRS_buffer[512]; // sprintf(matrix_CRS_buffer, "CRS_files/matrix_CRS_L=%02d_%s_%s.dat", L, // desc, // rowcolumn); // builds variable dependend file names for observable // FILE *file = fopen(matrix_CRS_buffer, "r"); // if (file == NULL) { // printf("file does not exist\n"); // printf("filename %s\n", matrix_CRS_buffer); // return; // } // fread(read, sizeof(int), num_values, file); // fclose(file); // return; // } // void loadCRS_float(char *desc, int num_values, double complex *read) { // char matrix_CRS_buffer[512]; // sprintf(matrix_CRS_buffer, "CRS_files/matrix_CRS_L=%02d_%s_row.dat", L, // desc); // builds variable dependend file names for observable // FILE *file = fopen(matrix_CRS_buffer, "r"); // if (file == NULL) { // printf("file does not exist\n"); // printf("filename %s\n", matrix_CRS_buffer); // return; // } // fread(read, sizeof(double complex), num_values, file); // fclose(file); // return; // }
内容的提问来源于stack exchange,提问作者Peter Sanctus
相关产品推荐
相关产品推荐

