Matlab 2013 GPU内存泄漏

1视图(30天)
迈克尔
迈克尔 2013年5月27日
我一直在运行一些很长的循环(数以百万计的迭代),在每个迭代中,我叫几个CUDA内核通过函数宏指令使用预先分配固定大小的数组。我注意到主机内存增长线性迭代的数量,最后用matlab崩溃。当我试图隔离问题我发现以下几点:使用函数宏指令调用CUDA内核,你必须有所有函数的参数已经扮演gpuArray,即使你通过标量变量。这也适用于如gpuArray功能。兰特或randn:
n = 1 e4;
i = 1:1e6
= gpuArray.rand (n, 1,“单一”);
结束
上面的代码会导致主机内存增长期间执行每250 k的迭代(大约100 mb)如果不是n = 1 e4;你写n = gpuArray e4 (1);随后的循环不会导致内存增加。我也发现上述循环执行更快当n是在主机内存与n是一个gpuArray(约3倍)。
甚至更令人费解的是下面的例子:
x = gpuArray.rand (1 e4, 1“单一”);
i = 1:1e6
= sqrt (x);
结束
上述循环不会引起MATLAB的内存占用。然而,如果我们改变sqrt (x)与sqrt (1. / x),那么我们得到的记忆再次崩溃。我用MATLAB 2013 64位windows 7专业。我的视频卡是一个gtx 650 2 gb。提前感谢任何见解。
3评论
本Tordoff
本Tordoff 2013年6月4日
谢谢你迈克尔,你的确是对的,这似乎是一个bug引入R2013a。没有现实的办法解决我现在可以提供,但我会在这里发布一个更新一次我一些有用的建议。
内存不泄漏的原因与某些电话是他们强迫同步事件(在第一个例子中,大概可以误差等误差是否也被击中;在第二个标量参数“n”必须转移回主机内存,也会导致同步)。你可以通过插入一个实现相同的每次调用后“等(gpu)”:
gpu = gpuDevice ();
2 = 1:1e8
= gpuArray.rand (1 e3, 1,“单一”);
等待(gpu);
disp(我)
结束
但这也拖了后腿,很难说是一个实用的解决方案。

登录置评。

接受的答案

本Tordoff
本Tordoff 2013年6月18日
嗨,迈克尔,你可以阅读下面的错误报告,它所包含的方法(对倒车一步小心了!):
如果这样不能解决问题,请尽快让我知道。
1评论
迈克尔
迈克尔 2013年6月21日
嗨,本,我尝试了一段代码,我一直在努力;没有补丁,MATLAB最终消费7 gb的RAM(4毫升的迭代之后)。与补丁MATLAB最终消费1.3 gb。在循环的起点MATLAB使用0.5 gb。对于简单的代码片断我(像我上传到我的问题的)没有内存增长。谢谢你的补丁,这对我来说基本上完全解决这个问题。
迈克尔

登录置评。

更多的答案(0)

类别

找到更多的在创建和连接矩阵帮助中心文件交换

社区寻宝

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

开始狩猎!