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

如何确定套接字/节点本地的MPI等级/进程号,mpi,parallel-processing,openmpi,Mpi,Parallel Processing,Openmpi,比如说,我使用MPI运行一个并行程序。执行命令 mpirun -n 8 -npernode 2 <prg> 这将返回一个介于0和7之间的数字 但是,如何确定节点编号(在本例中是介于0和3之间的编号)和节点内的进程编号(介于0和1之间的编号)?这取决于MPI实现-对于此特定问题没有标准 OpenMPI有一些环境变量可以提供帮助。OMPI_COMM_WORLD_LOCAL_RANK将为您提供节点内的本地排名-即,这是您正在查找的进程编号。因此,对getenv的调用将回答您的问题,但这不

比如说,我使用MPI运行一个并行程序。执行命令

mpirun -n 8 -npernode 2 <prg>
这将返回一个介于0和7之间的数字


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

这取决于MPI实现-对于此特定问题没有标准

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

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


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

这个确切的问题在Markus Wittmann的博客上讨论过

建议采取三种策略:

  • 一个简单的、可移植的解决方案使用MPI_Get_processor_name或gethostname为节点创建一个唯一标识符,并在其上执行MPI_Alltoall。[……]
  • [方法2]依赖于MPI_Comm_split,它提供了将通信器拆分为子组(子通信器)的简单方法。[……]
  • 如果可用,可以使用共享内存。[……]

  • 对于某些工作代码(可能是LGPL许可的?),Wittmann从链接到。

    我相信您可以通过以下方式使用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);
    

    或者,您可以使用

    int-MPI\u-Get\u处理器名称(char*name,int*resultlen)
    

    若要检索节点名称,请在中将其用作颜色

    int-MPI\u-Comm-split(MPI\u-Comm-Comm,int-color,int-key,MPI\u-Comm*newcomm)
    


    这并不像
    MPI\u Comm\u split\u type
    那么简单,但是它提供了更多的自由来按照您想要的方式拆分您的通讯器。

    很好地解释了MPI\u Comm\u split\u type的功能。谢谢您的回答。粘贴的链接已断开。我发现这个链接很有效
    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);