说,我使用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之间的编号)?
答案 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讨论了这个确切的问题。
在那里,提出了三种策略:
对于某些工作代码(可能是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。