mkl_free()的问题

时间:2013-06-26 17:20:46

标签: c++ intel-mkl

我正在编写图像注册程序,使用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)时,为什么我的程序会崩溃?

1 个答案:

答案 0 :(得分: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是错误的。您最终可以在过程存储器的任何位置写入。

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

  • 我建议对factorial的输入和输出变量使用相同的类型,例如unsigned long或unsigned double,但不是递归函数的混合签名。
  • 作为此函数的用户,我希望我负责为m_exp分配内存。所以我会把它变成函数签名。将您的函数调用与mkl进行比较,用户应该关注的所有内存都必须由他来处理,并且所有内部内存分配都在内部完成而不会将其暴露给用户,但在您的情况下,m_exp的内部内存分配将被暴露给用户。这可能会导致用户代码中的内存泄漏。