gpuArray和内存管理

10视图(30天)
贡纳Lathen
贡纳Lathen 2012年5月7日
你好,
我有一个循环中,我创建了一个gpuArrays的数量。保持在内存限制我清楚一些gpuArrays中间结果。在Matlab R2011b一切都清理好,但R2012a循环崩溃的内存不足异常(运行相同的代码)。我明白我不能完全信任gpuDevice FreeMemory报道,虽然我看到内存被释放在R2011b R2012a它不是。有一些方法来迫使R2012a释放内存(没有重置)?
谢谢!
2的评论
贡纳Lathen
贡纳Lathen 2012年5月21日
再次回到这个问题上,我遇到问题在运行代码的全套(相对于下面的例子在评论)。总的来说,感觉就像内存管理在R2012a R2011b相比是相当脆弱的。我把完整的代码在http://www.itn.liu.se/ ~ gunjo38 / mem_test.zip如果你愿意试一试。

登录置评。

答案(1)

本Tordoff
本Tordoff 2012年5月8日
嗨贡纳,
这是一个变通方法多于一个答案,但是试着插入“等(gpu)”后释放内存。例如:
gpu = gpuDevice ();
bigData = parallel.gpu.GPUArray.rand (2000);
%做大量的计算
清晰的bigData;
等待(gpu);
R2012a和GPU上面可能仍在运行,当你到达“清晰”命令它可能需要保存到内存中。使用“等待”,确保所有的计算已经完成了安全允许的内存被释放。
然而,这不该是必要的。如果内存运行低,MATLAB应该等待并自动释放一些内存。你可以发布一个代码片段,展示了如何冲击问题,这样我可以看到为什么这不是发生在你身上?特别是,哪个函数耗尽内存,这是一个创建函数(0,1,兰德等)或一个操作(fft、乘等)?
谢谢
1评论
贡纳Lathen
贡纳Lathen 2012年5月8日
我试图减少代码管理的东西。我删除了内核执行,取而代之的是纯粹的内存分配和一些虚假的计算。代码没有意义,但繁殖问题,至少在我的机器上。似乎添加一个wait()循环的最终修复的事情,但也许可以使用的例子你!
在R2012a得到输出(没有wait ()):
1.4222 e + 09年
384090112
CUDA_ERROR_OUT_OF_MEMORY
我在R2011b输出:
1.4221 e + 009
572706816
572706816
572706816
…和so on...
% %
重置(gpuDevice);
g = gpuDevice;
disp (g.FreeMemory);
昏暗的= (288 320 256);
data = parallel.gpu.GPUArray。0(黯淡下来,“单”);
V = parallel.gpu.GPUArray.zeros(大小(数据),“单”);
eig1 = parallel.gpu.GPUArray.zeros(大小(数据),“单”);
eig2 = parallel.gpu.GPUArray.zeros(大小(数据),“单”);
eig3 = parallel.gpu.GPUArray.zeros(大小(数据),“单”);
印第安纳州= 1:10
fxx = parallel.gpu.GPUArray.zeros(大小(数据),“单”);
fxy = parallel.gpu.GPUArray.zeros(大小(数据),“单”);
fxz = parallel.gpu.GPUArray.zeros(大小(数据),“单”);
fyy = parallel.gpu.GPUArray.zeros(大小(数据),“单”);
fyz = parallel.gpu.GPUArray.zeros(大小(数据),“单”);
fzz = parallel.gpu.GPUArray.zeros(大小(数据),“单”);
eig1 = fxx + fyy;
eig2 = fxy。* fyz;
eig3 = fxz - fzz;
明确的fxx;
清楚fxy;
清楚fxz;
清楚fyy;
清楚fyz;
清楚fzz;
v = parallel.gpu.GPUArray.zeros(大小(数据),“单”);
v = eig1。* eig2。* eig3;
V = V;
清楚v;
% (g)等;
disp (g.FreeMemory);
结束

登录置评。

类别

找到更多的在调试和分析帮助中心文件交换

标签

下载188bet金宝搏

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!