【问题标题】:Releasing CUDA memory Matlab释放 CUDA 内存 Matlab
【发布时间】:2014-11-17 17:22:26
【问题描述】:

我注意到在 GPU 中分配的内存没有释放。 我使用了以下命令:

A=gpuArray.randn(1e4);
gpuDevice

空闲内存:3.3336e+09

A=A*2

空闲内存:2.5336e+09

看起来 MATLAB 为 A*2 分配了内存,但没有为 A 释放内存。我不知道如何释放不再使用的内存。 A=A*A' 的问题更严重,因为似乎 MATLAB 分配了更多内存(可能是 A')并且没有释放它。 我在互联网上发现,这是在 MATLAB 2013b 中解决的已知错误(或类似错误?)(请参阅http://www.mathworks.com/support/bugreports/954239),但我使用的是 MATLAB 2014a。我还安装了链接中的 zip 文件,但没有帮助。

我将不胜感激。

【问题讨论】:

  • 您确定您看到的是可用内存的相关小数吗?
  • 是的。顺便说一句,当您重复两次(重复 A=A*2)时,可用内存量不会减少并且表现良好。

标签: matlab memory memory-leaks cuda gpgpu


【解决方案1】:

通过运行如下代码:

d = gpuDevice;
A = gpuArray.rand(1e4);
freeMem = NaN(1, 11);
freeMem(1) = d.FreeMemory;
for idx = 2:11
    A = A * 2;
    wait(d);
    freeMem(idx) = d.FreeMemory;
end
plot(1:11, freeMem / 1e9, 'b-', ...
     [1 11], [d.TotalMemory, d.TotalMemory]/1e9, 'r-');
legend({'Free Memory', 'Total Memory'});
xlabel('Iteration');
ylabel('Memory (GB)');

您可以看到 MATLAB 不会立即释放内存,但也不会永远保留它:

如果您将A 变大,您还会发现不同的行为。我的 GPU 有大约 6GB 的 RAM,如果我创建 A = gpuArray.rand(16000),那么我看到内存似乎会立即释放。

顺便说一句,您提到的错误报告实际上是在谈论主机内存被不可挽回地泄漏,而不是设备内存。

您的算法是否真的耗尽了设备内存?

【讨论】:

  • 在你的例子中,内存没有释放。我知道如果您多次执行 A=A*2 ,那么(在第一次之后)它不会分配额外的内存,但即使在您的示例中,A 的内存也没有被释放。我的内存不足,但出现的错误有所不同,并迫使我重新启动 MATLAB。这发生在运行在 Windows 和 Linux 上的多个 GPU 上。
  • 是的,内存确实释放了,否则图表将继续显示随着循环的进行而不断增加的内存消耗(这就是我在任何情况下都试图展示的内容)。此外,如果您在循环后清除A,GPU 将取回其所有内存。我可以建议您发布一个显示您实际问题的问题吗? (您在这里看到的基本上是内存管理方案的产物)。
  • 我同意一些内存已被释放,但它仍然拥有两倍于需要的内存。另一个例子,如果做: A=gpuArray.randn(5000); B=A*2;清除 A;你会看到没有内存被释放,因为 B 在某种程度上与 A 相关。
猜你喜欢
  • 2011-01-10
  • 1970-01-01
  • 2018-05-29
  • 2010-11-29
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
相关资源
最近更新 更多