卸载已使用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);
}
虽然与我的真正的程序总是崩溃,这个最小的例子并不总是可重复的。有时它确实有时不会崩溃..
答
嗯,它可能是你忘记自由的记忆问题。
一些建议可能有用:
不要使用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功能有什么问题。
如何经常做这个测试程序会崩溃吗?你可以改变测试程序,使其100%的时间失败? – slayton