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

时间:2012-01-26 17:30:09

标签: mpi parallel-processing openmpi

说,我使用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之间的编号)?

4 个答案:

答案 0 :(得分:9)

我相信你可以用这种方式实现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);

答案 1 :(得分:8)

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

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

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

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

答案 2 :(得分:2)

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

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

  1. 一个天真的便携式解决方案使用MPI_Get_processor_name或gethostname为节点创建唯一标识符,并在其上执行MPI_Alltoall。 [...]
  2. [方法2] 依赖于MPI_Comm_split,它提供了一种将通信器分成子组(子通信器)的简便方法。 [...]
  3. 如果可以,可以使用共享内存。 [...]
  4. 对于某些工作代码(可能是LGPL许可?),Wittmann从MpiNodeRank.cpp链接到APSM library

答案 3 :(得分: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。