"设备内存不足"与cpuum在gpuArray上

时间:2014-09-24 12:12:48

标签: matlab cuda gpu-programming cumsum

我试图在填充-1s,0s和1s的22000x22000 gpuArray上使用MATLAB的cumsum函数执行累积和。我使用的是具有3GB内存的NVIDIA GeForce GTX 780 Ti。双精度gpuArray太大(3.9GB)但自然单精度适合。

尝试再次对我的单精度gpuArray执行cumsum导致达到我的内存限制,但我不确定这是由于内存类型还是计算cumsum的方法,因为它是一个MATLAB p文件。这也意味着无论我对用于计算的数据类型几乎无法控制。编辑:此外,cumsum不支持整数数据类型。编辑:进一步检查时,在简化数组上执行此操作的结果是单个,因此很可能在数组上作为输入类型运行。

所以我的问题是:有没有替代cumsum? (不是循环 - 参见注释)是否通过MATLAB或CUDA允许指定数据类型。或者有人可以概述如何矢量化(matricise?)cumsum操作,以便我自己编写它?

编辑:替代必须能够对整数类型进行操作,因为只生成CUM矩阵将超出内存限制。 2xsingle = double ...

注意:鉴于我将执行此计算很多次(在纸上没有约束),理想情况下,cumsum(gpuArray)与cumsum(double)的速度增加> 200倍。并且甚至没有提到循环,可笑地放慢速度。

tic;CUM = cumsum(W,2);toc
Elapsed time is 0.002180 seconds.

K = gather(W);
tic;CUM = cumsum(K,2);toc
Elapsed time is 0.125203 seconds.

2 个答案:

答案 0 :(得分:1)

如果你只是在矩阵中使用值-1,0和1,你可以使用带符号的8位整数类型int8使用一个字节的内存,它允许数字-128到127 。(只有-1,0和1的选项,你可以在技术上将四个值合并为一个字节,每个字节为2位,但如果你的内存不足,你可能只需要这样做。)

因此,如果你想用int8初始化你的数组,你可以这样做:

gpuArray = zeros(22000,22000,'int8');

哪个应该<500MB大小。

答案 1 :(得分:1)

只是一句话,在处理plt.hist时,这样的代码计时不正确。你应该像这样计时

gpuArray

否则,tic;CUM = cumsum(W,2);wait(gpuDevice());toc 不计算实际计算,因为执行CPU计时功能MATLAB不需要它。

请注意你的时间安排。

为减少内存消耗,您可以使用

toc

这适用于GPU设备上的W = gpuArray(rand(22000,22000,'uint8'));