【问题标题】:Can't find a way to return matrix in MEX without causing memory leak in GPU找不到在 MEX 中返回矩阵而不导致 GPU 内存泄漏的方法
【发布时间】:2013-08-27 21:59:21
【问题描述】:

我有以下代码,导致内存泄漏:

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

    const mxGPUArray * inp=mxGPUCreateFromMxArray(prhs[0]);
    const mxGPUArray * ms=mxGPUCreateFromMxArray(prhs[1]);
    const double * inpPtr=(const double*) mxGPUGetDataReadOnly(inp);
    const double * msPtr=(const double*) mxGPUGetDataReadOnly(ms);
    mxGPUArray * out=mxGPUCopyFromMxArray(prhs[2]);
    double * outPtr=(double* ) mxGPUGetData(out);
    func<<<blocksN,threadsN,ShreadMemSize,stream1>>>(outPtr, inpPtr, msPtr, inpSize[0],0);
    plhs[0] = mxGPUCreateMxArrayOnGPU(out);
mxGPUDestroyGPUArray(inp);
mxGPUDestroyGPUArray(ms);
mxGPUDestroyGPUArray(out);
}

此代码有效,但会导致 GPU 上的内存泄漏,可能是因为plhs[0] = mxGPUCreateMxArrayOnGPU(out); 导致分配更多内存而没有释放先前分配的内存。我将一个 0-s 的 GPUArray 矩阵作为第三个输入传递给此代码,该矩阵的大小应为输出应为的大小。其余的输入是要处理的矩阵。

我所有解决此问题的尝试都失败了。我试过了:

  1. 删除const,并获取rhs[2]指向数据的指针(mxGetData/mxGetPr),将其作为outPtr传递(使用talonmies的gpuErrchk时会出现未知错误)

  2. Creating a new numeric arraysetting the pointer 成为 prhs[2] 的指针 - 也不起作用。

还有一些小事,都惨败。

关于为什么没有工作以及什么会工作的任何想法?基本上我需要一种不分配更多内存的方法。我不知道如何修改prhs[2] 或让plhs[0] 使用prhs[2] 的指针... 我正在使用 MATLAB 2013

【问题讨论】:

    标签: matlab memory-leaks cuda gpgpu mex


    【解决方案1】:

    MEX cuda 编程的文档很难。经过一番搜索,我找到了一个解决了一个主要问题的函数:mxGPUCreateMxArrayOnGPU 帮助我处理了将从 mxArray 获取的指针传递给内核的问题(这会导致问题,因为指针需要从 mxGPUArray 获取,或者来自我提到的函数创建的对象。 例如,将其复制粘贴到 MATLAB 中:

    edit([matlabroot '/extern/examples/mx/mxcalcsinglesubscript.c']);
    

    【讨论】:

      【解决方案2】:

      已提供解决方法here

      这解决了我的问题。希望它对其他人也有帮助,直到他们解决问题为止。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-18
        • 2018-04-07
        • 1970-01-01
        • 2014-09-21
        相关资源
        最近更新 更多