2

我想复制一个 (nxn) 矩阵,该矩阵分布在 (pxq) 进程网格上到所有进程,以便每个进程都有整个 (nxn) 矩阵,类似于来自 mpi 的 allgather 操作。

我知道 scalapacks pdgemr2d 例程是要走的路,但是示例和文档并没有帮助我弄清楚。我的想法是引入第二个 blacs 上下文,它只包含一个进程,它也是 mpi_root。pdgemr2d 将所有信息复制到这个 1x1 网格。mpi_root 然后广播到所有其他进程。

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

这里有一堆问题:

  1. 我上面的想法是理智的还是有更好的性能的(规范的)方法?
  2. 在这个上下文中有很多上下文,我不完全理解,如果我正确地将它们分开:我所有的 pxq 进程都在 MPI_WORLD_COMMUNICATOR 中,这个通信器也用作网格的 blacs 上下文。然后根是 MPI_WORLD、网格上下文和 1x1 上下文的一部分。所以它有一大块数据,也应该以某种方式从 pxq-context 发送到 1x1-context。这是正确的,这甚至有效吗?
  3. pdegemr2d 的最后一个参数是 ictxt,它应该是所有参与进程的上下文统一,这是 MPI_WORLD 吗?
  4. 我需要对 pxq-grid 的成员和 1x1-grid 的一个成员进行不同的调用吗?如果是这样,有什么区别?
4

1 回答 1

2

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

此外,当将 pdgemr2d 用于具有超过 2^31 个元素的矩阵时,您最终会遇到 32 位整数问题 - 它会因警告“xxmr2d:内存不足”而崩溃。这是由于声明为 C int 的全局数组索引,因此当数组大于 2**31 时它会爆炸。修复方法是用您自己的分散和收集例程替换 pdgemr2d,这些例程尊重 scalapack 使用的块循环矩阵分布。我根据在网上找到的 C 示例编写了自己的 Fortran 代码。到目前为止,我已经针对 100,000 x 100,000 矩阵的 scalapack 密集矩阵乘法 (pdsyrk) 对其进行了测试,并且效果很好。在与 QDR InfiniBand 连接的 320 个内核上花费了大约 520 秒。

-克里

于 2015-05-20T19:07:54.837 回答