C++ 与mkl_free()有关的问题

C++ 与mkl_free()有关的问题,c++,intel-mkl,C++,Intel Mkl,我正在编写一个图像注册程序,在使用mkl_free()时发现一个奇怪的错误。我使用MKL函数从MATLAB编写了矩阵指数函数-expm()的实现。我已经单独测试了它,它工作时没有遇到任何错误 代码可在此处找到: 当我从其他需要它进行计算的函数调用它时,问题就出现了。我的程序目前在调用第一个mkl_free()之前崩溃,因此我怀疑这是某种形式的内存泄漏。但是函数中使用的矩阵不应该是自包含的吗?我不认为释放它们会导致我的整个程序崩溃 调用mkl_free_buffers();和mkl_线程自由缓冲区

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

代码可在此处找到:

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

调用mkl_free_buffers();和mkl_线程自由缓冲区();没有我能观察到的效果。我曾尝试使用mkl_disable_fast_mm()关闭“英特尔内存管理器”,但在程序开始执行时以牺牲速度为代价,但也无济于事

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


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

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

  • dcopy签名是:

    无效cblas\u数据副本(常数MKL\u INT N,常数double*X,常数MKL\u INT 增量,双*Y,常数MKL_INT incY)
假设您使用mkls函数,将地址&one,&sxtn传递给dcopy是错误的。您可以在进程内存的任何地方进行写入

关于风格,还有两条评论:

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

谢谢你,波特!我已经解决了你提到的关于我的职能的问题。然而,它仍然在
//mkl_-free(M_-power)上崩溃
//mkl\u free(M\u power1)我已经注释掉了。你知道为什么会这样吗?我在生产代码中使用的矩阵大约是7500x3个元素。代码仍然在我的Github上:sxtn在不编译的情况下是未定义的。很抱歉,我现在修复了这个问题(我从我的开发版本复制并粘贴了它)。