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

问题描述:

我一直在试图弄清楚这段时间。卸载已使用CUDA内存的mex文件时,MATLAB崩溃

我在使用CUDA的matlab(Linux 64bit)中使用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(); 
} 

CUDA文件,NVCC编译:

void cudaTest() { 

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

    cudaFree(d_test); 
} 

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

+0

如何经常做这个测试程序会崩溃吗?你可以改变测试程序,使其100%的时间失败? – slayton

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

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

嗯,它可能是你忘记自由的记忆问题。

一些建议可能有用:

  • 不要使用MATLAB的内存管理功能:mxalloc ......,外面mexfunction或Matlab包裹,你MEX功能可能会遇到一些进程的背景,并可能导致崩溃MATLAB,当mex函数调用与matlab同时存储管理函数。 (请参阅MATLAB帮助:mexAtExit)清除您的mex内存和线程,这些线程不是由MATLAB进行管理的,也就是说,这里是cudaMalloc。当mex函数卸载或matlab退出时,MATLAB会自动清除mexfunction。所以如果你的momery管理功能不是MATLAB内存管理功能,MATLAB不会知道如何处理你的mex程序。

  • 调试功能如下

运行:

clear your_mex_function 

MATLAB会调用clearfunction(此功能是一个mexatexit寄存器功能看上攻步骤)your_mex_function的,你会发现你的mex功能有什么问题。