Matrix CUDA中二维阵列的有效缩减?

Matrix CUDA中二维阵列的有效缩减?,matrix,cuda,reduce,Matrix,Cuda,Reduce,在CUDA SDK中,有用于高效一维缩减的示例代码和演示幻灯片。我还看过几篇关于CUDA中一维缩减和前缀扫描的文章和实现 是否有有效的CUDA代码可用于减少密集的二维阵列?如能提供代码或相关论文的参考,将不胜感激。矩阵缩减可能更容易实现,因为向量的行/列缩减可以独立完成。您可以让每个线程处理列/行(取决于矩阵主维度方向)并合并内存读取。我怀疑,如果不使用纹理/常量缓存,您就无法获得更高的性能,因为局部性可能变得非常重要我不知道您试图解决的问题到底是什么,但实际上,您可以简单地将2D数组看作一个长

在CUDA SDK中,有用于高效一维缩减的示例代码和演示幻灯片。我还看过几篇关于CUDA中一维缩减和前缀扫描的文章和实现


是否有有效的CUDA代码可用于减少密集的二维阵列?如能提供代码或相关论文的参考,将不胜感激。

矩阵缩减可能更容易实现,因为向量的行/列缩减可以独立完成。您可以让每个线程处理列/行(取决于矩阵主维度方向)并合并内存读取。我怀疑,如果不使用纹理/常量缓存,您就无法获得更高的性能,因为局部性可能变得非常重要

我不知道您试图解决的问题到底是什么,但实际上,您可以简单地将2D数组看作一个长的1D数组,并使用SDK代码来减少操作。CUDA中的简单阵列只是具有特殊寻址规则的1D内存块-为什么您不利用这个机会呢。

所以您建议我使用1D线程块,首先减少阵列的一维,然后减少生成的1D阵列?一个主要的效率问题是二维阵列中的两个维度都可能小于一维阵列的长度,例如4096x4096 vs~16M。使用您所描述的方案,与1D缩减相比,您的线程块更少,每个线程的工作更少,GPU的整体利用率更低。@Bradford Larsen 64线程线程块是最佳大小。4096大小问题需要64个64X线程块,每个线程在不同步的情况下减少4096个元素。这应该足以充分利用gpu,并提供足够的覆盖来覆盖内存流量。对不起,但会有同步问题,因为会减少块中线程和网格中块之间的操作。而且,如果使用这种简单的缩减操作(如sum或min…)的技术,内核将无法利用整个GPU和带宽。必须有更多的块和更小的线程。