【发布时间】:2013-08-17 12:57:48
【问题描述】:
我写了一个 mex 函数,发现每次运行它时,我的 GPU 中都会有越来越多的内存消失,尽管我每次都覆盖了之前的结果。
在我试图找到问题根源的过程中,我编写了以下代码(文件名为MexMemoryTrack):
#include "mex.h"
#include "gpu/mxGPUArray.h"
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, mxArray const *prhs[])
{
mxInitGPU();
const mxGPUArray * inp=mxGPUCreateFromMxArray(prhs[0]);
const mxGPUArray * ms=mxGPUCreateFromMxArray(prhs[1]);
const double * inpPtr=(const double*) mxGPUGetDataReadOnly(inp);
const double * masksPtr=(const double*) mxGPUGetDataReadOnly(ms);
mxGPUArray * out=mxGPUCopyFromMxArray(prhs[2]);
double * outPtr=(double* ) mxGPUGetData(out);
plhs[0] = mxGPUCreateMxArrayOnGPU(out);
mxGPUDestroyGPUArray(inp);
mxGPUDestroyGPUArray(ms);
mxGPUDestroyGPUArray(out);
}
我使用:
foo=gpuArray.zeros([3 3 10000 18]);
foo2=gpuArray.randn([7 7 10000 20]);
foo3=gpuArray.randn([5 5 18 20]);
dumdum=MexMemoryTrack(foo2,foo3,foo);
如果我把这段代码放在一个循环中,我所有的内存最终都会消失,我会得到一个“内存不足”的错误。
这很简单。我分配内存,我销毁我创建的内存 except plhs[0] = mxGPUCreateMxArrayOnGPU(out); 不是,也不应该被销毁。由于我正在覆盖dumdum(唯一的lhs 参数),我认为Matlab 足够聪明,可以覆盖这些值,或者释放它们并为dumdum 重新分配空间。
使用clear dumdum 也不起作用(如果这是解决方案,我会担心如何保留返回的信息......)。
我错过了什么吗?
编译器会不会是问题的根源(Visual Studio 2010)?也许它不适用于 Matlab(我使用的是 Matlab 2013a)?
【问题讨论】:
标签: matlab memory-leaks cuda gpgpu mex