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

问题描述 投票:11回答:4

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

mpirun -n 8 -npernode 2 <prg>

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

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

int myrank;
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);

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

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

mpi parallel-processing openmpi
4个回答
9
投票

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

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

有关OpenMPI中的(简短)变量列表,请参阅this

我不知道相应的“节点号”。


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);

2
投票

Markus Wittmann的博客MPI Node-Local Rank determination讨论了这个确切的问题。

在那里,提出了三种策略:

  1. 一个天真的便携式解决方案使用MPI_Get_processor_name或gethostname为节点创建唯一标识符并对其执行MPI_Alltoall。 [...]
  2. [方法2]依赖于MPI_Comm_split,它提供了一种将通信器分成子组(子通信器)的简便方法。 [...]
  3. 如果可用,可以使用共享内存。 [...]

对于一些工作代码(可能是LGPL许可?),Wittmann链接到MpiNodeRank.cppAPSM library


0
投票

或者你可以使用

int MPI_Get_processor_name( char *name, int *resultlen )

检索节点名称,然后将其用作颜色

int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *newcomm)

这并不像MPI_Comm_split_type那么简单,但是它提供了更多的自由来按照你想要的方式分割你的comunicator。

© www.soinside.com 2019 - 2024. All rights reserved.