我基本上想做的是将8个处理器的组划分为4个子组,因此将4个子通信器划分为每个通信器中的处理器将具有ID 0和1。这是我得到的输出


  等级= 0新等级= 0
  
  等级= 2新等级= 0
  
  等级= 6 newrank = 0
  
  等级= 4 newrank = -32766
  
  等级= 7 newrank = 1
  
  等级= 5 newrank = -32766
  
  等级= 3新等级= 1
  
  等级= 1新等级= 1


预期的输出是


  等级= 0新等级= 0
  
  等级= 2新等级= 0
  
  等级= 6 newrank = 0
  
  等级= 4 newrank = 0
  
  等级= 7 newrank = 1
  
  等级= 5 newrank = 1
  
  等级= 3新等级= 1
  
  等级= 1新等级= 1


如您所见,它正在达到预期的结果,但我无法确定是什么导致负值。似乎在打印未初始化的变量或未在此处设置数据。任何帮助表示赞赏吗?

    #include "mpi.h"
    #include <stdio.h>
    #include <stdlib.h>

    int NPROCS = 8; //trying on 8 processors

    main(int argc, char *argv[])  {


    int rank, new_rank, numtasks;

    MPI_Group  orig_group, new_group;
    MPI_Comm   new_comm;

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

    /* Extract the original group handle */
    MPI_Comm_group(MPI_COMM_WORLD, &orig_group);


    int i;

//need two iterations to split the blocks into 8 sub blocks...
//first iteration ranks assignment   0 1 2 3   0 1 2 3
//second iteration ranks assignment  0 1  0 1  0 1  0 1
    for(i=0; i<2; i++){


        /* Divide tasks into two distinct groups based upon rank */
        if (rank < NPROCS/2) {

            int j;

            int ranks[8] = {0};

                //list of ranks for that sub group
                for(j=0;j<NPROCS/2;j++){
                ranks[j] = j;
            }



            MPI_Group_incl(orig_group, NPROCS/2, ranks, &new_group);

        }
        else {

            int j;

            int ranks[8] = {0};

                //list of ranks for that sub group
            for(j=NPROCS/2;j<NPROCS;j++){
                ranks[j-NPROCS/2] = j;
            }


            MPI_Group_incl(orig_group, NPROCS/2, ranks, &new_group);
        }


        /* Create new new communicator and then perform collective communications */
        MPI_Comm_create(MPI_COMM_WORLD, new_group, &new_comm);


        MPI_Group_rank (new_group, &new_rank);

        //here i assign the new_group identifier to orig_group so that in next iteration
        //MPI_Group_incl(orig_group, NPROCS/2 ... can use the new_group as orig_group
        orig_group = new_group;
        NPROCS = NPROCS / 2;   // divides NPROCS to half
        rank = new_rank;

    }


    printf("rank= %d newrank= %d \n",rank,new_rank);

    MPI_Finalize();


    }

最佳答案

在第二次迭代中,初始等级为0和1的进程属于if的第一个分支(可以),所有其他进程进入else分支(不是)。

因此,初始等级为0和1的进程将成功地获得其组。初始等级为2、3、6、7的进程具有组等级2和3,并在第二次迭代时获得其组;但是初始等级为4和5的进程在第二次迭代中的等级为0和1,并且不包含在任何组中。因此,负面排名。

如果在循环内使用new_rank而不是rank(在循环前分配new_rank = rank;),则代码可能会起作用。

尽管我建议更简单地创建组:计算边界然后创建组(除非您确实需要分层的组结构)。

关于c - 试图在MPI中将通讯世界拆分为多个通讯世界或块?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22622820/

10-11 19:03