如何确定套接字/节点本地的MPI等级/进程号

rit*_*ter 11 parallel-processing mpi openmpi

说,我使用MPI运行并行程序.执行命令

mpirun -n 8 -npernode 2 <prg>
Run Code Online (Sandbox Code Playgroud)

总共启动了8个流程.这是每个节点2个进程和总共4个节点.(OpenMPI 1.5).节点包含1个CPU(双核),节点之间的网络互连是InfiniBand.

现在,可以确定等级编号(或过程编号)

int myrank;
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
Run Code Online (Sandbox Code Playgroud)

这将返回0到7之间的数字.

但是,如何确定节点编号(在本例中为0到3之间的数字)和节点内的进程编号(0到1之间的编号)?

小智 11

我相信你可以用这种方式用MPI-3实现这个目标:

MPI_Comm shmcomm;
MPI_Comm_split_type(MPI_COMM_WORLD, MPI_COMM_TYPE_SHARED, 0,
                    MPI_INFO_NULL, &shmcomm);
int shmrank;
MPI_Comm_rank(shmcomm, &shmrank);
Run Code Online (Sandbox Code Playgroud)


Dav*_*id 9

这取决于MPI实现 - 并且没有针对此特定问题的标准.

Open MPI有一些可以提供帮助的环境变量.OMPI_COMM_WORLD_LOCAL_RANK将为您提供节点内的本地排名 - 即.这是您正在寻找的流程编号.因此,对getenv的调用将解决您的问题 - 但这不能移植到其他MPI实现.

有关Open MPI中(短)变量的列表,请参见http://icl.cs.utk.edu/open-mpi/faq/?category=running#mpi-environmental-variables.

我不知道相应的"节点号".

  • 这不应该是公认的答案。使用“MPI_Comm_split_type”,您可以毫无问题地分析节点上的分布。也许在写这个答案时还不存在,但现在这个答案还不够。 (2认同)