4

很长一段时间以来,我一直试图弄清楚这一点。

我在使用 CUDA 的 matlab(Linux 64 位)中使用 MEX 文件。代码编译并执行得很好,但是当我想卸载 mex 时(例如重新编译它或 matlab 退出时),matlab 立即崩溃,没有任何消息并且转储为空。

我能够将其简化为一个最小的工作示例:

墨西哥 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);
}

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

4

2 回答 2

1

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

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

于 2012-11-30T15:30:59.763 回答
0

嗯,可能是您忘记释放的内存问题。

一些建议可能有用:

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

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

  • 如下调试您的功能

跑:

clear your_mex_function

MATLAB 会调用 your_mex_function 的 clearfunction(这个函数是一个 mexatexit 注册函数,见上面的步骤),你会发现你的 mex 函数有什么问题。

于 2012-11-19T14:50:51.270 回答