2014-09-23 48 views
0

我注意到,在GPU中分配的内存没有发布。 我用下面的命令:发布CUDA内存Matlab

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

你确定你看到空闲内存的相关小数? – sobek 2014-09-23 13:47:37

+0

是的。顺便说一句,当你重复两次(重复A = A * 2),那么可用内存的数量不会减少,并且表现良好。 – Gil 2014-09-23 13:54:26

回答

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的内存,如果我制作A = gpuArray.rand(16000),那么我看到内存似乎立即被释放。

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

你算法中的设备内存是否真的用完了?

+0

在你的例子中,内存没有释放。我知道如果你多次执行A = A * 2,那么(在第一次之后)它不会分配额外的内存,但即使在你的例子中,A的内存也没有被释放。我内存不足,但出现的错误是不同的,迫使我重新启动MATLAB。这发生在Windows和Linux上运行的几个GPU上。 – Gil 2014-09-24 15:33:28

+0

是的,内存确实释放,否则该图将继续显示随着循环过程消耗的内存不断增加(这正是我试图在任何情况下展示的内容)。另外,如果在循环之后清除“A”,则GPU将恢复其所有内存。我可能会建议你发布一个显示你的实际问题的问题? (你在这里看到的基本上是一个内存管理方案的人造物)。 – Edric 2014-09-24 15:53:20

+0

我同意一些内存被释放,但它仍然保留两次所需的内存。另一个例子,如果这样做:A = gpuArray.randn(5000); B = A * 2;清除A;你会看到没有释放内存,因为B与A有关。 – Gil 2014-09-24 19:23:13