MPMD MPI 执行中的通信

arm*_*ndo 2 multithreading mpi openmp openmpi

这篇文章与之前将线程绑定到某些 MPI 进程相关。在这里,有人询问如何为 MPI 等级分配不同数量的 OpenMP 线程。一种可能性如下

$ mpiexec <global parameters>
          -n n1 <local parameters> executable_1 <args1> :
          -n n2 <local parameters> executable_2 <args2> :
          ...
          -n nk <local parameters> executable_k <argsk>
Run Code Online (Sandbox Code Playgroud)

我不知道独立实例 executable_1、executable_2、...、executable_k 是如何相互通信的。我的意思是,如果在执行期间的某个时刻他们需要交换数据,他们是否使用内部通信器(在实例之间)和内部通信器(在同一实例中,例如可执行文件_1)?

谢谢。

Hri*_*iev 5

作为该命令的结果启动的所有进程形成单个 MIMD/MPMD MPI 作业,即它们共享同一个世界通信器。第一n1排在跑executable_1,后面的n2排在跑executable_2,以此类推。

                   rank                 |  executable
----------------------------------------+---------------
                  0 .. n1-1             |  executable_1
                 n1 .. n1+n2-1          |  executable_2
              n1+n2 .. n1+n2+n3-1       |  executable_3
                   ....                 |      ....
 n1+n2+n3+..+n(k-1) .. n1+n2+n3+..+nk-1 |  executable_k
Run Code Online (Sandbox Code Playgroud)

通信只是通过在 中发送消息而发生MPI_COMM_WORLD。单独的可执行文件不会自动形成自己的通信器组。这就是 MPMD 与使用开始子作业的区别MPI_Comm_spawn- 子作业有自己的世界通信器,并且使用内部通信器与他们交谈,而 MIMD/MPMD 作业中的单独子作业则没有。

排名仍然可以通过查询 的MPI_APPNUM属性来找出它属于哪个应用程序上下文MPI_COMM_WORLD:通过简单地使用appnum值作为颜色执行拆分,可以为每个上下文创建单独的子通信器(不同的上下文是由 分隔的命令):

                   rank                 |  executable
----------------------------------------+---------------
                  0 .. n1-1             |  executable_1
                 n1 .. n1+n2-1          |  executable_2
              n1+n2 .. n1+n2+n3-1       |  executable_3
                   ....                 |      ....
 n1+n2+n3+..+n(k-1) .. n1+n2+n3+..+nk-1 |  executable_k
Run Code Online (Sandbox Code Playgroud)