有什么方法可以使用 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”。
如何判断同一个节点上设置了多少个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”。