我有以下代码,这会导致内存泄漏:
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]
的指针。。。我正在使用MATLAB 2013
MEXCuda编程的文档很难。经过大量搜索,我发现了一个解决了一个主要问题的函数:mxGPUCreateMxArrayOnGPU
帮助我处理了将从mxArray获得的指针传递到内核的问题(这会导致问题,因为指针需要从mxGPUArray或我提到的函数创建的对象中获得。例如,将其复制粘贴到MATLAB:中
edit([matlabroot '/extern/examples/mx/mxcalcsinglesubscript.c']);
提供了一个变通方法
这解决了我的问题。希望这对其他人也有帮助,直到他们解决问题。