我想复制一个(nxn)矩阵,它通过(pxq)进程网格分布到所有进程,这样每个进程都有整个(nxn)矩阵,类似于mpi的allgather操作。
我知道scalapacks pdgemr2d例程是可行的方法,但是示例和文档并没有帮助我弄明白。我的想法是引入第二个blacs上下文,它只包含一个进程,也就是mpi_root。 pdgemr2d将所有信息复制到此1x1网格。 mpi_root然后bcast到所有其他进程。
我正在使用scalapack / blacs的fortran接口。
以下是一堆问题:
答案 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