如何使用pdgemr2d将分布式矩阵复制到所有进程?

时间:2015-05-11 12:31:26

标签: fortran mpi scalapack

我想复制一个(nxn)矩阵,它通过(pxq)进程网格分布到所有进程,这样每个进程都有整个(nxn)矩阵,类似于mpi的allgather操作。

我知道scalapacks pdgemr2d例程是可行的方法,但是示例和文档并没有帮助我弄明白。我的想法是引入第二个blacs上下文,它只包含一个进程,也就是mpi_root。 pdgemr2d将所有信息复制到此1x1网格。 mpi_root然后bcast到所有其他进程。

我正在使用scalapack / blacs的fortran接口。

以下是一堆问题:

  1. 我的观点是否理智,或者是否有(规范)方式表现更好?
  2. 在这种情况下有很多背景,如果我把它们正确分开,我不完全理解: 我的所有pxq进程都在MPI_WORLD_COMMUNICATOR中,这个通信器也用作网格的blacs上下文。 Root是MPI_WORLD的一部分,即网格上下文和1x1上下文。所以它有一大块数据也应该以某种方式从pxq-context发送到1x1-context。这是正确的,这甚至可以工作吗?
  3. pdegemr2d的最后一个参数是ictxt,它应该是所有参与进程的上下文统一,是MPI_WORLD吗?
  4. 我是否需要为pxq-grid的成员和1x1-grid的一个成员进行不同的调用?如果是这样,会有什么区别?

1 个答案:

答案 0 :(得分:1)

查看本教程,我发现在开始使用ScaLAPACK时非常有用: https://www.sharcnet.ca/help/index.php/LAPACK_and_ScaLAPACK_Examples

此外,当使用pdgemr2d用于超过2 ^ 31个元素的矩阵时,最终会遇到32位整数问题 - 它会在警告" xxmr2d:内存不足的情况下崩溃"。这是由于全局数组索引声明为C int,因此当数组大于2 ** 31时它会爆炸。修复是用您自己的分散替换pdgemr2d并收集符合scalapack使用的块循环矩阵分布的例程。我根据a C example编写了自己的Fortran代码,这是我在网上找到的。到目前为止,我已经测试了scalapack密集矩阵乘法(pdsyrk)的100,000 x 100,000矩阵并且它运行良好。在与QDR InfiniBand连接的320个核心上耗时约520秒。

-Kerry