Matlab 2013 GPU内存泄漏
1视图(30天)
显示旧的评论
我一直在运行一些很长的循环(数以百万计的迭代),在每个迭代中,我叫几个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
2013年6月4日
谢谢你迈克尔,你的确是对的,这似乎是一个bug引入R2013a。没有现实的办法解决我现在可以提供,但我会在这里发布一个更新一次我一些有用的建议。
内存不泄漏的原因与某些电话是他们强迫同步事件(在第一个例子中,大概可以误差等误差是否也被击中;在第二个标量参数“n”必须转移回主机内存,也会导致同步)。你可以通过插入一个实现相同的每次调用后“等(gpu)”:
gpu = gpuDevice ();
为2 = 1:1e8
= gpuArray.rand (1 e3, 1,“单一”);
等待(gpu);
disp(我)
结束
但这也拖了后腿,很难说是一个实用的解决方案。