在CUDA中高效地降维二维数组?

4
在CUDA SDK中,有一个高效的一维归约示例代码和演示幻灯片。我还看到了几篇关于在CUDA中进行一维归约和前缀扫描的论文和实现。
是否有适用于密集二维数组归约的高效CUDA代码?欢迎提供代码或相关论文的指针。
2个回答

4
我不知道你想解决的具体问题,但实际上您可以将二维数组简单地视为长的一维数组,并使用SDK代码来减少操作。在CUDA中,简单的数组只是带有特殊寻址规则的1D内存块 - 为什么不利用这个机会呢?

1

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


所以你建议我使用一维线程块,首先减少数组的一个维度,然后再减少结果为一维数组?一个主要的效率问题是,2D数组中的两个维度很可能比1D数组的长度小,例如4096x4096与约16M。像你描述的这种方案,最终会导致较少的线程块,每个线程的工作量减少,并且与1D减少相比,GPU的整体利用率大大降低。 - Brad Larsen
@Bradford Larsen,64个线程的线程块是最佳大小。4096大小的问题需要64个64x线程块,每个线程在没有同步的情况下减少4096个元素。这应该足以完全利用GPU并提供足够的重叠来覆盖内存流量。 - Anycorn
不好意思,但是由于块内和网格内的线程之间的减少操作,会出现同步问题。如果使用这样的技术进行简单的减少操作(如求和或最小值...),核心无法利用整个GPU和带宽。必须有更多的块和更小的线程。 - KoppeKTop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接