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

矩阵规模超阈值时Valgrind检测到MKL/LAPACK STEVR函数内存泄漏

问题:Intel MKL LAPACKE_dstevr函数在矩阵规模n≥65时触发Valgrind内存泄漏报告

问题背景

我开发的软件基于Intel MKL实现的LAPACK函数处理特征值问题,使用Valgrind做内存检查时发现,仅在调用LAPACKE_dstevr函数时会出现内存泄漏报告。为排查问题根源,我编写了独立测试程序复现该现象。

测试代码

#include <mkl/mkl.h>
#include <random>

int main() {

    // 容差设置
    double absTol = 1e-12;

    // 矩阵规模
    lapack_int n = 64;

    // 生成随机对称三对角矩阵
    std::mt19937 randomGen;
    std::normal_distribution<double> normal(1., 1.);
    double *mainDiagonal = new double[n];
    double *subDiagonal = new double[n-1];
    for (int i=0; i<n-1; i++) {
        mainDiagonal[i] = normal(randomGen);
        subDiagonal[i] = normal(randomGen);
    }
    mainDiagonal[n-1] = normal(randomGen);

    // 为结果分配内存
    double *eigenValues = new double[n];
    double *eigenVectors = new double[n*n];

    // 按MKL/LAPACK文档要求分配初始化整数数组与前导维度
    lapack_int *isuppz = new lapack_int[2*n]();
    lapack_int ldz = n;

    // 计算特征向量
    char job = 'V';

    // 计算全部特征值与特征向量
    char range = 'A';

    // 当range='A'时以下参数无需初始化
    lapack_int lowerIndex, upperIndex, upperBound, lowerBound;

    // 输出参数:找到的特征值数量
    lapack_int m;

    // 调用MKL/LAPACK求解函数
    LAPACKE_dstevr(LAPACK_ROW_MAJOR, job, range, n, mainDiagonal, subDiagonal,
            lowerBound, upperBound, lowerIndex, upperIndex, absTol, &m, 
            eigenValues, eigenVectors, ldz, isuppz);

    // 释放内存
    delete[] mainDiagonal;
    delete[] subDiagonal;
    delete[] eigenValues;
    delete[] eigenVectors;
    delete[] isuppz;
    
    return 0;
}

编译与运行命令

编译命令

g++ -fopenmp -ggdb3 -Wall -Wextra test_dstevr.cpp -lmkl_intel_lp64 -lmkl_core -lmkl_gnu_thread -lpthread -lm -ldl -lmkl_rt -o test_dstevr

Valgrind运行命令

valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --verbose --log-file=valgrind.out ./test_dstevr

复现现象

  • 当矩阵规模n=64(2的幂次)时,Valgrind未报告任何错误
  • 当n≥65时,Valgrind报告内存泄漏:
ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

具体泄漏记录:

==48382== 960 bytes in 3 blocks are possibly lost in loss record 10 of 12
==48382==    at 0x483DD99: calloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==48382==    by 0x40149DA: allocate_dtv (dl-tls.c:286)
==48382==    by 0x40149DA: _dl_allocate_tls (dl-tls.c:532)
==48382==    by 0xB549322: allocate_stack (allocatestack.c:622)
==48382==    by 0xB549322: pthread_create@@GLIBC_2.2.5 (pthread_create.c:660)
==48382==    by 0xB320DEA: ??? (in /usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0)
==48382==    by 0xA08AA10: mkl_trans_mkl_domatcopy2_par (in /usr/lib/x86_64-linux-gnu/libmkl_gnu_thread.so)
==48382==    by 0xCF5D5F4: mkl_trans_avx2_mkl_domatcopy (in /usr/lib/x86_64-linux-gnu/libmkl_avx2.so)
==48382==    by 0x4D76FBC: LAPACKE_dge_trans (in /usr/lib/x86_64-linux-gnu/libmkl_intel_lp64.so)
==48382==    by 0x4DB57DB: LAPACKE_dstevr_work (in /usr/lib/x86_64-linux-gnu/libmkl_intel_lp64.so)
==48382==    by 0x4DB5430: LAPACKE_dstevr (in /usr/lib/x86_64-linux-gnu/libmkl_intel_lp64.so)
==48382==    by 0x10951C: main (test_dstevr.cpp:45)

运行环境

  • Ubuntu 20.04 LTS
  • GCC 9.4.0

内容的提问来源于stack exchange,提问作者BernieD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:05:25