发布CUDA内存Matlab

时间:2014-09-23 13:18:55

标签: matlab memory memory-leaks cuda gpgpu

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

A=gpuArray.randn(1e4);
gpuDevice

FreeMemory:3.3336e + 09

A=A*2

FreeMemory:2.5336e + 09

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

我将不胜感激。

1 个答案:

答案 0 :(得分:2)

通过运行以下代码:

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没有立即释放内存,但它也没有永远保留它:

Plot of free memory against iteration

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

顺便说一句,你提到的错误报告实际上是在谈论主机内存无法挽回泄露,而不是设备内存。

您的算法实际上是否耗尽了设备内存?