Issue with mkl_free()

Issue with mkl_free()

本文关键字:free with mkl Issue      更新时间:2023-10-16

我正在编写一个图像注册程序,在使用mkl_free()时发现了一个奇怪的错误。我使用MKL函数从MATLAB中编写了矩阵指数函数expm()的实现。我已经单独测试了它,它工作时没有遇到任何错误。

代码可在此处找到:https://github.com/poliu2s/MKL/blob/master/matrix_exponential.cpp

当我从其他需要它进行计算的函数调用它时,就会出现问题。我的程序在调用第一个mkl_free()之前就崩溃了,所以我怀疑这是某种形式的内存泄漏。但是函数中使用的矩阵不应该是自包含的吗?我不知道释放它们会导致我的整个程序崩溃。

调用mkl_free_buffer();和mkl_thread_free_buffer();没有产生我能观察到的效果。我曾尝试在程序执行之初用mkl_disable_fast_mm()关闭"英特尔内存管理器",但也没有成功。

我已经检查了进入函数本身的输入,矩阵是完全有效的——就像我在测试中使用的一样。

当我在某些循环中调用mkl_free(数组)时,我的程序会崩溃,这有什么原因吗?

您的代码有几个问题。也不一定,但可能会导致segfault,但您应该在调查问题时修复它们。

  • 数据副本签名为:

    void cblas_dcopy(常量MKL_INT N,常量double*X,常量MKL_INTincX,双*Y,常量MKL_INT incY)

假设您使用mkls函数,则传递地址&一,&sxtn到dcopy是错误的。您最终可能会写入进程内存的任何位置。

关于风格的两条评论:

  • 我建议对阶乘的输入和输出变量使用相同的类型,例如无符号长或无符号双精度,但对递归函数不使用混合签名
  • 作为这个函数的用户,我希望我负责为m_exp分配内存。所以我会把这个变成函数签名。将您的函数调用与mkl的调用进行比较,用户应该负责的所有内存都必须由他负责,并且所有内部内存分配都是在内部完成的,而不会将其暴露给用户,但在您的情况下,m_exp的内部内存分配是向用户公开的。这可能会导致用户代码中的内存泄漏