0

我正在编写一个图像注册程序,我发现使用 mkl_free() 时出现一个奇怪的错误。我使用 MKL 函数从 MATLAB 编写了矩阵指数函数的实现 - expm()。我已经单独对其进行了测试,它可以正常工作而不会遇到任何错误。

代码可以在这里找到:https ://github.com/poliu2s/MKL/blob/master/matrix_exponential.cpp

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

调用 mkl_free_buffers(); 和 mkl_thread_free_buffers(); 没有产生我可以观察到的效果。我曾尝试在程序执行开始时以速度为代价使用 mkl_disable_fast_mm() 关闭英特尔内存管理器,但也无济于事。

我已经检查了进入函数本身的输入,并且矩阵完全有效 - 就像我在测试期间使用的一样。

当我在某些循环中调用 mkl_free(array) 时,为什么我的程序会崩溃?

4

1 回答 1

1

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

  • dcopy 签名是:

    void cblas_dcopy (const MKL_INT N, const double *X, const MKL_INT incX, double *Y, const MKL_INT incY);

假设您使用 mkls 函数,将地址 &one, &sxtn 传递给 dcopy 是错误的。您最终可以写入进程内存的任何位置。

关于风格的另外两条评论:

  • 我建议对阶乘的输入和输出变量使用相同的类型,例如 unsigned long 或 unsigned double 但不是递归函数的混合签名。
  • 作为该函数的用户,我希望我负责为 m_exp 分配内存。所以我会把它放到函数签名中。将您的函数调用与 mkl 进行比较,用户应该处理的所有内存都必须由他处理,并且所有内部内存分配都是在内部完成而不向用户公开,但在您的情况下,m_exp 的内部内存分配是公开的给用户。这可能会导致用户代码中的内存泄漏。
于 2013-06-30T21:56:56.833 回答