卸载使用CUDA内存的mex文件时,MATLAB崩溃

时间:2012-11-16 11:03:23

标签: matlab cuda mex

我一直试图解决这个问题很长一段时间。

我在matlab(Linux 64bit)中使用了一个使用CUDA的MEX文件。代码编译并执行正常,但是当我想卸载mex时(例如重新编译它或者当matlab退出时),matlab立即崩溃而没有任何消息和空转储。

我能够将它减少到一个最小的工作示例:

MEX cpp文件:

#include <stdint.h>
#include "mex.h"

extern "C" void cudaTest();

void mexFunction(
                int nlhs, mxArray *plhs[],
                int nrhs, const mxArray *prhs[])
{
    cudaTest();
}

使用NVCC编译的CUDA文件:

void cudaTest() {

    float* d_test = NULL;
    cudaMalloc((void**) &d_test, 10000 * sizeof(float));

    cudaFree(d_test);
}

虽然我的真实程序总是会崩溃,但是这个最小的例子并不总是可以重现的。有时它有时会崩溃..

2 个答案:

答案 0 :(得分:1)

我认为这解决了我的问题:

http://www.mathworks.de/matlabcentral/answers/45307

答案 1 :(得分:0)

嗯,这可能是你忘记释放的记忆问题。

一些建议可能有用:

  • 不要使用MATLAB内存管理功能:mxalloc ...,在mexfunction或matlab外包,你的mex函数可能运行一些进程后台并可能导致MATLAB崩溃,当mex函数调用内存管理函数与matlab同时

  • 注册mexAtExit(clearfunction)函数(参见MATLAB帮助:mexAtExit)清除你的mex内存和线程,它不是由MATLAB无法管理的,即cudaMalloc。当mex函数卸载或matlab退出时,MATLAB会自动清除mexfunction。因此,如果您的momery管理功能不是MATLAB内存管理功能,MATLAB将不知道如何处理您的mex程序。

  • 调试您的功能如下

运行:

clear your_mex_function

MATLAB会调用your_mex_function的clearfunction(此函数是mexatexit寄存器函数见上行步骤),你会发现你的mex函数有什么问题。