【问题标题】:Hiding communication in Matrix Vector Product with MPI使用 MPI 隐藏矩阵向量积中的通信
【发布时间】:2011-10-05 23:21:41
【问题描述】:

我必须为多个右侧求解一个巨大的线性方程(比如说 20 到 200)。矩阵以稀疏格式存储并分布在多个 MPI 节点(比如说 16 到 64)上。我在等级 0 节点上运行 CG 求解器。无法直接求解线性方程,因为系统矩阵会很密集(Sys = A^T * S * A)。

基本的矩阵向量乘法实现为:

broadcast x
y = A_part * x
reduce y

虽然集体操作相当快(OpenMPI 似乎使用了像通信模式 + Infiniband 这样的二叉树),但它仍然占运行时的很大一部分。出于性能原因,我们已经计算了每次迭代的 8 个右侧(基本上是 SpM * DenseMatrix,只是为了完整)。

我正在尝试想出一个很好的方案来隐藏通信延迟,但我还没有一个好主意。我也尽量避免进行 1:n 通信,尽管我还没有衡量缩放是否会成为问题。

欢迎提出任何建议!

【问题讨论】:

  • 如果您不完全致力于使用 MPI,这在 Charm++ 或其他更动态的环境中会容易得多。

标签: parallel-processing mpi


【解决方案1】:

如果您的矩阵已经分布,是否可以使用分布式稀疏线性求解器而不是仅在等级 0 上运行它然后广播结果(如果我正确阅读了您的描述..)。有很多图书馆,例如SuperLU_DIST、MUMPS、PARDISO、Aztec(OO)等

至少 SuperLU 和 MUMPS 支持“多 rhs”优化(没有检查过其他的,但如果他们不支持,我会非常惊讶!),因为他们解决了 AX=B where X和 B 是可能 > 1 列的矩阵。也就是说,每个“rhs”都作为一个列向量存储在B中。

【讨论】:

  • 不幸的是,这不是一个选项。实际上,与系统矩阵的乘法涉及与 A 的 2 次乘法,因为我们不计算系统矩阵。这将涉及 SpM * SpM 产品。此外,这些库中的大多数都是直接求解器和/或不提供针对多个 rhs 的优化。
  • @ebo:我有点不确定你的术语。系统矩阵 == A?如果是这样,你不能预先计算它吗?至于“multiple rhs”优化,看我的编辑。
  • 类似于 A^T * S * A 的东西。矩阵 A 是稀疏的,不适合单个节点,没有可利用的结构,A^T * S * A 将是密集的。
【解决方案2】:

如果您不需要在开始下一次运行之前获得旧右侧的结果,您可以尝试使用非阻塞通信(ISend,IRecv)并在计算下一个右侧时传达结果 -已经在手边了。

但请确保在读取通信数组的内容之前调用 MPI_Wait,以确保您没有读取“旧”数据。

如果矩阵足够大(即计算矩阵乘积需要足够长的时间),则使用这种方法根本不会有任何通信延迟。

【讨论】:

  • 那将是 1:n 通信。使用“简单”的直接通信将意味着失去有效的广播并减少操作。
  • MPI 目前正致力于推出 MPI-3。使用该标准,您将拥有 MPI_IBcast。不过这还不可用。
猜你喜欢
  • 2016-01-23
  • 2013-02-19
  • 2015-04-23
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 2011-11-21
  • 2017-12-19
  • 2016-12-03
相关资源
最近更新 更多