【问题标题】:MATLAB MEX causes memory loss on GPUMATLAB MEX 导致 GPU 上的内存丢失
【发布时间】: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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我目前正在使用直接用 CUDA 语言编写并在 Visual Studio 2010 下为 Matlab 2010a 编译的 mexfiles。所以,我没有gpuArrays 的经验。我同意一个可能的问题是新数组的“连续”创建。也许您应该避免使用mxGPUCreateMxArrayOnGPU。在一种天真的方法中,您能否在for 循环之外创建gpuArraydumdum,将其引用传递给MexMemoryTrack,然后将lhs[0] 等同于这样的引用?
    • 我相信我可能已经尝试过这样做但失败了,但那是在我对如何编写 mex 文件有足够的了解之前。我会再试一次。感谢您的帮助和建议(以及编辑我的问题)
    【解决方案2】:

    在几篇文章中

    Memory leak while using gpuArray in parallel computing toolbox 2013a

    Matlab 2013a GPU memory leak

    人们认识到:

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

    bug report page 发布了一个补丁可以解决这个问题。从MATLAB R2013b 开始,此错误已得到修复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-28
      • 2015-03-06
      • 2013-08-27
      • 1970-01-01
      • 2014-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多