MPMD MPI执行中的通信

时间:2016-12-28 08:19:49

标签: multithreading mpi openmp openmpi

这篇文章与之前的帖子binding threads to certain MPI processes有关。在这里,有人询问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>

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

感谢。

1 个答案:

答案 0 :(得分:3)

由于该命令而启动的所有进程形成单个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

只需在MPI_COMM_WORLD中发送消息即可进行通信。单独的可执行文件不会自动形成通信组。这就是使用MPI_Comm_spawn区分MPMD与启动子作业的区别 - 子作业有自己的世界通信器,而一个使用内部通信器与它们交谈,而MIMD / MPMD作业中的单独子作业则没有。

通过查询MPI_APPNUM的{​​{1}}属性,排名仍有可能找出它所属的应用程序上下文。通过使用 appnum 值作为颜色执行拆分,可以为每个上下文创建单独的子通信器(不同的上下文是由MPI_COMM_WORLD分隔的命令):

: