Matlab 释放CUDA内存

Matlab 释放CUDA内存,matlab,memory,memory-leaks,cuda,gpgpu,Matlab,Memory,Memory Leaks,Cuda,Gpgpu,我注意到GPU中分配的内存没有释放。 我使用了以下命令: A=gpuArray.randn(1e4); gpuDevice 自由内存:3.3336e+09 A=A*2 自由内存:2.5336e+09 看起来MATLAB为A*2分配了内存,但没有释放A的内存。我不知道如何释放不再使用的内存。对于A=A*A',问题更为严重,因为MATLAB似乎分配了更多的内存(可能是A'),而没有释放它。 我在互联网上发现,这是一个已知的错误(或类似的错误?),已在Matlab2013b中解决(请参阅),但我使

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

A=gpuArray.randn(1e4);
gpuDevice
自由内存:3.3336e+09

A=A*2
自由内存:2.5336e+09

看起来MATLAB为A*2分配了内存,但没有释放A的内存。我不知道如何释放不再使用的内存。对于
A=A*A'
,问题更为严重,因为MATLAB似乎分配了更多的内存(可能是A'),而没有释放它。 我在互联网上发现,这是一个已知的错误(或类似的错误?),已在Matlab2013b中解决(请参阅),但我使用的是Matlab2014a。我也从链接中安装了zip文件,但没有帮助


如果有任何帮助,我将不胜感激。

请运行以下代码:

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)
,那么我看到内存似乎立即被释放

顺便说一句,您提到的bug报告实际上是关于主机内存无可挽回地泄漏,而不是设备内存


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

是否确实看到了可用内存的相关小数?是的。顺便说一句,当你重复两次(重复A=A*2)时,可用内存量不会减少,并且表现良好。在你的例子中,内存没有释放。我知道,如果您多次执行A=A*2,那么(在第一次之后)它将不会分配额外的内存,但即使在您的示例中,A的内存也没有释放。我的内存不足,但出现的错误不同,迫使我重新启动MATLAB。这发生在运行在Windows和Linux上的几个GPU上。是的,内存确实释放了,否则随着循环的进行,图形将继续显示消耗的内存不断增加(这就是我在任何情况下试图显示的)。此外,如果在循环后清除
A
,GPU将收回其所有内存。我可以建议你发布一个问题来说明你的实际问题吗?(你在这里看到的基本上是一个内存管理方案的人工制品)我同意一些内存被释放了,但它仍然保存着两倍于需要的内存。另一个例子,如果do:A=gpuArray.randn(5000);B=A*2;清除A;您将看到没有释放内存,因为B与A有某种关联。