2014-09-23 30 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