1

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

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

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

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

注意:鉴于我将多次执行此计算(论文中没有提出限制),理想情况下,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.
4

2 回答 2

1

如果您只打算在矩阵中使用值 -1、0 和 1,则可以使用带符号的 8 位整数类型 int8 使用一个字节的内存,它允许数字 -128 到 127。(使用只有 -1,0 和 1 的选项,从技术上讲,您可以将四个值放入一个字节中,每个字节有 2 位,但您可能只需要在内存不足的情况下这样做)。

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

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

其大小应小于 500MB。

于 2014-09-25T00:04:04.580 回答
1

只是一句话,在处理gpuArray. 你应该这样安排时间

tic;CUM = cumsum(W,2);wait(gpuDevice());toc

否则,MATLAB不计算实际计算,因为 CPU 计时功能不需要toc执行。

只是对你的时间的评论。

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

W = gpuArray(rand(22000,22000,'uint8'));

这适用于cumsumGPU 设备。

于 2016-03-23T15:23:16.100 回答