【问题标题】:Sparse Matrix Vector Product on Multiple GPUs多个 GPU 上的稀疏矩阵向量积
【发布时间】:2015-12-10 17:55:12
【问题描述】:

我想知道在多个(假设为 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 上执行矩阵向量乘法要慢。

【问题讨论】:

  • 我认为这个问题没有一个普遍的答案,它的范围很广。对于分布式内存系统(包括 GPU)的稀疏矩阵向量积,已经进行了很多的研究。您最好阅读其中的一些内容,而不是在Stack Overflow 上提出这样的问题
  • 你是对的。我想我正在寻找的是一种廉价/简单的实现(重用对 cuSPARSE 的调用),它在多个 GPU 上执行良好。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 分布矩阵的图分解将是我认为的另一种标准方法。
猜你喜欢
  • 1970-01-01
  • 2012-11-06
  • 2021-08-28
  • 2016-08-15
  • 2017-03-26
  • 2017-07-20
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多