繁体   English   中英

MATLAB MEX导致GPU上的内存丢失

[英]MATLAB MEX causes memory loss on GPU

我编写了一个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)?

经过许多Google搜索,我最终找到了一个(可能的)解决方案,在这里找到

据此,lhs不会在何时被覆盖,因此当多次调用该代码时,先前结果的副本仍保留在内存中-因此lhs[0]可能应在代码开头处销毁(尽管首先我们需要检查一下如果有什么东西要销毁,因为可能尚未分配)

我无法验证这是否确实可以解决问题,因为我目前无法使用带有MATLAB和图形卡的计算机。 基本上,(可能的)问题是lhs没有被覆盖,而是被重新分配了(实际上我并不感到惊讶,但是我不会猜到,因为我对MATLAB究竟如何处理数据了解得很少。 )。

如果有人碰巧验证了这一理论,请告诉我您发现了什么。

在几篇文章中

在并行计算工具箱2013a中使用gpuArray时发生内存泄漏

Matlab 2013a GPU内存泄漏

人们认识到:

MATLAB R2013a使用gpuArray数据调用函数时,MATLAB的内存使用量会增加。 大量的GPU函数调用可能会耗尽可用内存,从而导致Out of MemoryJava heap space error

在此错误报告页面上发布了一个补丁,可以解决该问题。 MATLAB R2013b起已修复此错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM