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

+0

Да. Кстати, когда вы повторяете его дважды (повторите A = A * 2), тогда количество свободной памяти не уменьшится, и это будет хорошо. – Gil

ответ

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 имеет ~ 6 ГБ оперативной памяти, и если я сделаю A = gpuArray.rand(16000), то я вижу, что память, кажется, будет выпущена немедленно.

Кстати, отчет об ошибке, на который вы ссылаетесь, на самом деле говорит о том, что память хоста безвозвратно просочилась, а не память устройства.

Вы на самом деле исчерпали память устройства в своем алгоритме?

+0

В вашем примере память не была выпущена. Я знаю, что если вы делаете A = A * 2 несколько раз, то (после первого раза) он не будет выделять дополнительную память, но даже в вашем примере память A не была выпущена. Я теряю память, но появляется ошибка, и мне приходится перезапускать MATLAB. Это произошло на нескольких графических процессорах, работающих под управлением Windows и Linux. – Gil

+0

Да, память освободилась, иначе график будет продолжать увеличивать память, потребляемую по мере продвижения цикла (это то, что я пытался показать в любом случае). Кроме того, если вы очистите «A» после цикла, GPU вернет всю память. Могу ли я предложить вам опубликовать вопрос, который показывает вашу фактическую проблему? (То, что вы видите здесь, в основном, является артефактом схемы управления памятью). – Edric

+0

Я согласен с тем, что часть памяти была выпущена, но она по-прежнему хранит память в два раза по мере необходимости. Другой пример: if = gpuArray.randn (5000); В = А * 2; очистить A; вы увидите, что память не была выпущена, потому что B как-то связано с A. – Gil

Смежные вопросы