0

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

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]'s 指针...我正在使用 MATLAB 2013

4

2 回答 2

1

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

edit([matlabroot '/extern/examples/mx/mxcalcsinglesubscript.c']);
于 2013-08-25T10:39:43.727 回答
0

此处提供了一种解决方法

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

于 2013-09-09T06:22:06.980 回答