我写了一个 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);
如果我把这段代码放在一个循环中,我所有的记忆最终都会消失,我会得到一个“内存不足”的错误。这很简单。我分配内存,我销毁我创建的内存,除了 plhs[0] = mxGPUCreateMxArrayOnGPU(out);
那些不是,也不应该被销毁的内存。由于我正在覆盖dumdum
(唯一的lhs
论点),我假设 Matlab 足够聪明,可以覆盖这些值,或者释放它们并为dumdum
. 使用clear dumdum
也不起作用(如果这是解决方案,我会担心如何保持返回的信息......)。
我错过了什么吗?
编译器可能是问题的根源(Visual Studio 2010)吗?也许它不适用于 Matlab(我使用的是 Matlab 2013a)?