使用MPI隐藏Matrix Vector产品中的通信

时间:2011-10-05 13:56:39

标签: parallel-processing mpi

我必须为多个右边解决一个巨大的线性方程(比方说20到200)。 Matrix以稀疏格式存储并分布在多个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通信,虽然我还没有测量扩展是否会成为一个问题。

欢迎任何建议!

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

但请确保在阅读通信阵列的内容之前调用MPI_Wait,以确保您不会读取“旧”数据。

如果矩阵足够大(即计算矩阵乘积需要足够长的时间),那么使用这种方法就没有任何通信延迟。