如何解决是否有MPI_Comm_create_group的非阻塞版本?
假设我们要为等级为0、1和2的三个进程创建3个通信器,并且通信器的组为{0,1},{0,2}和{1,2}。
似乎(请参见下面的示例代码)如果每个进程按以下顺序调用MPI_Comm_create_group()
,则会出现阻塞。
进程0
为组{0,1}创建通信器
为组{0,2}创建通信器
过程1
为组{1,2}创建通信器
为组{0,1}创建通信器
过程2
为组{0,2}创建通信器
为组{1,2}创建通信器
有什么解决方案?一种解决方案显然是更改对MPI_Comm_create_group()
的调用顺序。
示例代码:
#include <mpi.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
MPI_Init(NULL,NULL);
int worldsize,worldrank;
MPI_Comm_size(MPI_COMM_WORLD,&worldsize);
MPI_Comm_rank(MPI_COMM_WORLD,&worldrank);
if (worldsize < 3)
{
if (worldrank==0) printf("Please launch at least 3 processes!\n");
MPI_Finalize();
return 0;
}
MPI_Group worldgroup,newgroup;
MPI_Comm newcomm1,newcomm2;
MPI_Comm_group(MPI_COMM_WORLD,&worldgroup);
int set01[2] = {0,1};
int set02[2] = {0,2};
int set12[2] = {1,2};
switch (worldrank)
{
case 0:
MPI_Group_incl(worldgroup,2,set01,&newgroup);
MPI_Comm_create_group(MPI_COMM_WORLD,newgroup,&newcomm1);
MPI_Group_incl(worldgroup,set02,1,&newcomm2);
break;
case 1:
MPI_Group_incl(worldgroup,set12,&newcomm2);
break;
case 2:
MPI_Group_incl(worldgroup,&newcomm2);
break;
}
MPI_Finalize();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。