有什么方法可以使用 MPI 推断同一节点上有多少工作人员?

Is there any way to infer how many workers are on the same node using MPI?

如何判断同一个节点上设置了多少个worker?我可以获得总体 COMM_WORLD 大小,甚至可以使用 PMI 对节点上的进程进行排名。我如何知道每个节点上启动了多少个进程?

给你。使用MPI_Comm_split_type找到节点对应的subcommunicators,然后统计有多少个,以及它们的大小。

  int main( int argc,char **argv ) {
  MPI_Init(&argc,&argv);
  MPI_Comm comm = MPI_COMM_WORLD;
  int procno,nprocs;
  MPI_Comm_size( comm,&nprocs );
  MPI_Comm_rank( comm,&procno );

  MPI_Comm node_comm;
  MPI_Comm_split_type( comm,MPI_COMM_TYPE_SHARED,procno,MPI_INFO_NULL,&node_comm);
  int rank_on_node,size_of_node;
  MPI_Comm_rank( node_comm,&rank_on_node );
  MPI_Comm_size( node_comm,&size_of_node );
  int head_node = (rank_on_node==0);
  int number_of_nodes;
  MPI_Reduce( &head_node,&number_of_nodes,1,MPI_INT,MPI_SUM,0,comm);
  if (procno==0)
    printf("There are %d nodes\n",number_of_nodes);

  MPI_Comm node_heads;
  MPI_Comm_split( comm,head_node,procno,&node_heads );
  int node_sizes[number_of_nodes];
  MPI_Gather( &size_of_node,1,MPI_INT, node_sizes,1,MPI_INT, 0,node_heads );
  if (procno==0) {
    printf("Node sizes:");
    for (int inode=0; inode<number_of_nodes; inode++)
      printf(" %d",node_sizes[inode]);
    printf("\n");
  }

  MPI_Finalize();
  return 0;
}

例如在我的系统上,如果我请求 3 个节点,总共有 10 个进程,我得到:

There are 3 nodes
Node sizes: 4 3 3

不错。我有点期待“4 4 2”。