这篇文章与之前的帖子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)?
感谢。
答案 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
分隔的命令):
: