1

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

4

2 回答 2

1

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

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

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

如果有人碰巧测试了这个理论,请告诉我你发现了什么。

于 2013-08-15T17:36:39.607 回答
0

在几个帖子中

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

Matlab 2013a GPU 内存泄漏

认识到:

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

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

于 2013-10-08T21:05:37.420 回答