我有以下代码,这会导致内存泄漏:
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 矩阵作为第三个输入传递给该代码,该矩阵的大小应为输出应为的大小。其余的输入是要处理的矩阵。
我所有解决此问题的尝试都失败了。我试过了:
删除
const
, 并获取rhs[2]
' 指向数据 (mxGetData
/mxGetPr
) 的指针,将其传递为outPtr
(使用 talonmies 的 gpuErrchk 时会出现未知错误)创建一个新的数值数组并将指针设置为 prhs[2] 的指针 - 也不起作用。
以及其他一些小事,都惨遭失败。
关于为什么不起作用以及什么会起作用的任何想法?基本上我需要一种不分配更多内存的方法。我不知道如何修改prhs[2]
或plhs[0]
使用prhs[2]
's 指针...我正在使用 MATLAB 2013