You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

释放堆分配指针后与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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 15:02:34