我注意到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文件,但它没有帮助。
我将不胜感激。
答案 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没有立即释放内存,但它也没有永远保留它:
如果使A
更大,您也会发现不同的行为。我的GPU有大约6GB的RAM,如果我做A = gpuArray.rand(16000)
,那么我看到内存似乎是立即释放的。
顺便说一句,你提到的错误报告实际上是在谈论主机内存无法挽回泄露,而不是设备内存。
您的算法实际上是否耗尽了设备内存?