我正在尝试使用 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.