我一直试图解决这个问题很长一段时间。
我在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);
}
虽然我的真实程序总是会崩溃,但是这个最小的例子并不总是可以重现的。有时它有时会崩溃..
答案 0 :(得分:1)
我认为这解决了我的问题:
答案 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函数有什么问题。