【发布时间】: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 矩阵作为第三个输入传递给此代码,该矩阵的大小应为输出应为的大小。其余的输入是要处理的矩阵。
我所有解决此问题的尝试都失败了。我试过了:
删除
const,并获取rhs[2]指向数据的指针(mxGetData/mxGetPr),将其作为outPtr传递(使用talonmies的gpuErrchk时会出现未知错误)Creating a new numeric array 和 setting the pointer 成为 prhs[2] 的指针 - 也不起作用。
还有一些小事,都惨败。
关于为什么没有工作以及什么会工作的任何想法?基本上我需要一种不分配更多内存的方法。我不知道如何修改prhs[2] 或让plhs[0] 使用prhs[2] 的指针...
我正在使用 MATLAB 2013
【问题讨论】:
标签: matlab memory-leaks cuda gpgpu mex