我想复制一个 (nxn) 矩阵,该矩阵分布在 (pxq) 进程网格上到所有进程,以便每个进程都有整个 (nxn) 矩阵,类似于来自 mpi 的 allgather 操作。
我知道 scalapacks pdgemr2d 例程是要走的路,但是示例和文档并没有帮助我弄清楚。我的想法是引入第二个 blacs 上下文,它只包含一个进程,它也是 mpi_root。pdgemr2d 将所有信息复制到这个 1x1 网格。mpi_root 然后广播到所有其他进程。
我正在使用 scalapack/blacs 的 fortran 接口。
这里有一堆问题:
- 我上面的想法是理智的还是有更好的性能的(规范的)方法?
- 在这个上下文中有很多上下文,我不完全理解,如果我正确地将它们分开:我所有的 pxq 进程都在 MPI_WORLD_COMMUNICATOR 中,这个通信器也用作网格的 blacs 上下文。然后根是 MPI_WORLD、网格上下文和 1x1 上下文的一部分。所以它有一大块数据,也应该以某种方式从 pxq-context 发送到 1x1-context。这是正确的,这甚至有效吗?
- pdegemr2d 的最后一个参数是 ictxt,它应该是所有参与进程的上下文统一,这是 MPI_WORLD 吗?
- 我需要对 pxq-grid 的成员和 1x1-grid 的一个成员进行不同的调用吗?如果是这样,有什么区别?