Parallel processing 用MPI隐藏矩阵向量积中的通信

Parallel processing 用MPI隐藏矩阵向量积中的通信,parallel-processing,mpi,Parallel Processing,Mpi,我必须为多个右侧解一个巨大的线性方程(比如20到200)。矩阵以稀疏格式存储,并分布在多个MPI节点上(比如16到64个)。我在秩0节点上运行CG解算器。不可能直接求解线性方程,因为系统矩阵是稠密的(Sys=A^T*s*A) 基本矩阵向量乘法的实现方式如下: broadcast x y = A_part * x reduce y 虽然集合操作相当快(OpenMPI似乎使用类似于二叉树的通信模式+Infiniband),但它仍然占运行时的很大一部分。出于性能原因,我们已经计算了每个迭代的8个右侧

我必须为多个右侧解一个巨大的线性方程(比如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通信,尽管我还没有衡量缩放是否会有问题


欢迎提出任何建议

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


“多重rhs”优化至少得到SuperLU和腮腺炎的支持(还没有检查其他的,但如果他们不支持的话,我会非常惊讶!),因为他们解决了AX=B,其中X和B是可能大于1列的矩阵。也就是说,每个“rhs”作为列向量存储在B中。

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

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


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

不幸的是,这不是一种选择。实际上,与系统矩阵的乘法涉及与A的2次乘法,因为我们不计算系统矩阵。这将涉及SpM*SpM产品。另外,这些库中的大多数都是直接求解器和/或不提供多个RH的优化。@ebo:我对你的术语有点不确定。系统矩阵==A?如果是这样的话,你不能预先计算它吗?至于“多rhs”优化,请参见我的编辑。类似于^T*S*A。矩阵A是稀疏的,不适合单个节点,没有可利用的结构,^T*S*A将是密集的。这将是1:n通信。使用“简单”的直接通信将意味着失去有效的广播并减少操作。MPI目前正在努力推出MPI-3。有了这个标准,你就有了MPI_IBcast。但这还不可用。如果您不完全致力于使用MPI,那么在Charm++或其他更具动态性的环境中,这将非常容易。