2015-09-14 49 views
1

我想知道在CUDA上多GPU(let say n)GPU中计算稀疏矩阵向量乘积y = Ax的最快方法是什么。多GPU上的稀疏矩阵矢量产品

我的幼稚方法是将矢量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

我不认为这个问题有一个普遍的答案,它是广泛的。对分布式存储器系统(包括GPU)的稀疏矩阵向量产品进行了大量的研究。你可能会比阅读这样的问题更好,因为[SO] – talonmies

+0

你说得对。我想我所寻找的是一个便宜/简单的实现(重复使用调用cuSPARSE),在多个GPU上执行ok-ish。 – yon

回答

2

我会建议一种不同的方法。不要将矢量x分成块。将x转移给所有GPU。按照行分解A矩阵。因此,举例来说,如果A有9行,并且您有3个GPU,则将A的行1-3传输到第一个GPU,将012到的4-6传输到第二个GPU,将7-9的012-传输到第三个GPU 。

然后计算在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)。

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

+1

分布矩阵的图分解将是我想到的另一种标准方法。 – talonmies