C 理解MPI组通信

C 理解MPI组通信,c,mpi,C,Mpi,我试图通过以下示例理解MPI组通信的概念: int new_rank, rank, size, ranks1[4]={0,1,2,3}, ranks2[4]={4,5,6,7}; MPI_Group Original_Group, New_Group; MPI_Comm comm1; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &

我试图通过以下示例理解MPI组通信的概念:

int new_rank, rank, size, ranks1[4]={0,1,2,3}, ranks2[4]={4,5,6,7};
MPI_Group Original_Group, New_Group;
MPI_Comm comm1;

MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
MPI_Comm_size(MPI_COMM_WORLD, &size);

MPI_Comm_group(MPI_COMM_WORLD, &Original_Group);

    if (rank < 4) {
      MPI_Group_incl(Original_Group, 4, ranks1, &New_Group);
      }
    else {
      MPI_Group_incl(Original_Group, 4, ranks2, &New_Group);
      }

MPI_Comm_create(MPI_COMM_WORLD, New_Group, &comm1);

MPI_Group_rank(New_Group, &new_rank);

printf("rank= %d newrank= %d \n",rank,new_rank);
int new_rank,rank,size,ranks1[4]={0,1,2,3},ranks2[4]={4,5,6,7};
MPI_组原始_组、新_组;
MPI_通信1;
MPI_Init(&argc,&argv);
MPI通信等级(MPI通信世界和等级);
MPI_通信大小(MPI_通信世界和大小);
MPI_Comm_group(MPI_Comm_WORLD和Original_group);
如果(排名<4){
MPI组(包括原组、4组、等级1组和新组);
}
否则{
MPI组(包括原组、4组、ranks2组和新组);
}
MPI通信创建(MPI通信世界、新通信集团和通信1);
MPI组排名(新组和新排名);
printf(“rank=%d newrank=%d\n”,rank,new\u rank);
事实上,我想将
n*n
矩阵划分为一组处理器,比如说9个处理器,这样每行被划分为3个块,并发送到一组中的3个处理器以执行一些计算。例如:下图显示
n*n
矩阵被划分为
sqrt(n)
块,并分配给不同的处理器,使每一行形成一个组,即P1、P2、P3为组1,P4、P5、P6为组2,依此类推

|P1 | P2 | P3|

|P4 | P5 | P6|

|P7 | P8 | P9|


我试图通过创建3个组(每组对应每行处理器)来处理前面的代码,但我的程序崩溃了。这是否意味着我不需要分成3组?如果是这样,举例来说,P1是如何知道其组中的相邻处理器的?

在您的示例中,您可以使用更简单的MPI_Comm_split。web()中有几个示例。如果您需要专门使用MPI_comm_group,请详细说明您的代码是如何崩溃的,出现了什么错误?谢谢您的回复。如果我使用MPI_Comm_split,我看不出这里的组是如何执行的。这是否意味着每次拆分都对应一个组?实际上,这不是崩溃。它会导致冻结屏幕,没有来自手册页的输出:“为每个子组创建一个新的通信器,并在NewCom中返回。”请看这里的完整解释:我在一篇旧文章中找到了关于MPI_Comm_split的详尽答案,在您的示例中,您可以使用更简单的MPI_Comm_split。web()中有几个示例。如果您需要专门使用MPI_comm_group,请详细说明您的代码是如何崩溃的,出现了什么错误?谢谢您的回复。如果我使用MPI_Comm_split,我看不出这里的组是如何执行的。这是否意味着每次拆分都对应一个组?实际上,这不是崩溃。它会导致冻结屏幕,没有来自手册页的输出:“为每个子组创建一个新的通信器,并在NewCom中返回。”请看这里的完整解释:我在一篇较旧的帖子中找到了关于MPI_Comm_split的详尽答案