1

我想知道在多个(假设为 n 个)GPU 上的 CUDA 中计算稀疏矩阵向量乘积 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之间的内存传输会非常慢吗?我不希望有很大的加速,但我想知道它是否会比在 1 个单 GPU 上进行矩阵向量乘法要慢。

4

1 回答 1

2

我会建议一种不同的方法。不要将向量x分解成块。传输x到所有 GPU。

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

然后计算 3y个 GPU 上的 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,因此需要分析。A这种优化的一种简单方法可能是基于(大约)均衡每个块中的 NZ 元素的数量来分解。

于 2015-09-14T18:06:19.673 回答