找不到在不导致 GPU 内存泄漏的情况下在 MEX 中返回矩阵的方法



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

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. 创建一个新的数字数组并将指针设置为prhs[2]的指针也不起作用。

还有其他一些小事,都以惨痛的失败告终。

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

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

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

提供了一个变通方法

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

最新更新