多GPU上的稀疏矩阵向量积

时间:2015-09-14 16:40:27

标签: cuda gpu gpgpu sparse-matrix multi-gpu

我想知道在多个(比如说n)GPU上计算稀疏矩阵矢量积y = Ax的最快方法是什么。

我天真的方法是将矢量x和y分成n个块,每个GPU上有1个块。然后还将矩阵A分成较小的n ^ 2个块A_ij和计算

y_i = \sum_j A_{i,j} x_j, // GPU j stores A_{i,j} and x_j, result is copied 
                          // to and summed up on GPU i 

在不同的GPU j = 1..n上,让我们说cuSPARSE。这会有用吗?使用统一内存架构,原则上所有GPU都应该能够访问全局内存。

GPU之间的内存传输是否会非常慢?我不期望大幅加速,但我想知道它是否会慢于在单个GPU上进行矩阵向量乘法。

1 个答案:

答案 0 :(得分:2)

我建议采用不同的方法。不要将向量x分解成块。将x转移到所有GPU。

根据行分解A矩阵。因此,例如,如果A有9行,并且您有3个GPU,则将A的第1-3行传输到第一个GPU,将A的4-6传输到第二个GPU GPU,以及A到第三GPU的7-9。

然后在3个GPU上计算y的3个单独部分:

y[1-3] = A[1-3]*x
y[4-6] = A[4-6]*x
y[7-9] = A[7-9]*x

这3个操作中的每一个都可以使用cusparse<T>csrmv完成,例如(或者CUB现在也有spmv例程)。

重新组装y向量应该是微不足道的(连接)。 在计算过程中不需要进行GPU间数据传输,只需要传输结果(y)。

可能的&#34;优化&#34;将基于&#34; work&#34;分区A。而不是天真的行。但这样做的好处将取决于A的结构,因此需要进行分析。这种优化的简单方法可能是基于(近似)均衡每个块中NZ元素的数量来分解A