C 试图在MPI中将通信世界拆分为多个通信世界或块?

C 试图在MPI中将通信世界拆分为多个通信世界或块?,c,parallel-processing,multiprocessing,mpi,C,Parallel Processing,Multiprocessing,Mpi,我试图做的基本上是将一组8个处理器划分为4个子组,从而划分为4个子通信器,这样每个通信器中的处理器将具有id 0和1。这是我得到的输出 排名=0新排名=0 秩=2新秩=0 排名=6新排名=0 排名=4新排名=-32766 秩=7新秩=1 排名=5新排名=-32766 秩=3新秩=1 排名=1新排名=1 预期产量为 排名=0新排名=0 秩=2新秩=0 排名=6新排名=0 秩=4新秩=0 秩=7新秩=1 排名=5新排名=1 秩=3新秩=1 排名=1新排名=1 正如您所看到的,它正在达到预期的结果,但

我试图做的基本上是将一组8个处理器划分为4个子组,从而划分为4个子通信器,这样每个通信器中的处理器将具有id 0和1。这是我得到的输出

排名=0新排名=0

秩=2新秩=0

排名=6新排名=0

排名=4新排名=-32766

秩=7新秩=1

排名=5新排名=-32766

秩=3新秩=1

排名=1新排名=1

预期产量为

排名=0新排名=0

秩=2新秩=0

排名=6新排名=0

秩=4新秩=0

秩=7新秩=1

排名=5新排名=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();


    }
#包括“mpi.h”
#包括
#包括
int NPROCS=8//在8个处理器上试用
main(int argc,char*argv[]){
int秩、new_秩、numtasks;
MPI_组原始组、新组;
MPI_通信新通信;
MPI_Init(&argc,&argv);
MPI通信等级(MPI通信世界和等级);
MPI通信大小(MPI通信世界和numtasks);
/*提取原始组句柄*/
MPI_Comm_group(MPI_Comm_WORLD和orig_group);
int i;
//需要两次迭代才能将块分割为8个子块。。。
//第一次迭代对赋值0 1 2 3 0 1 2 3进行排序
//第二次迭代对赋值0 1 0 1 0 1进行排序

对于(i=0;i,在第二次迭代时,初始秩为0和1的过程落入
的第一个分支,如果
(这是正常的),所有其他过程进入
的其他
分支(这不是正常的)

因此,具有初始秩0和1的进程成功地得到了它们的组;具有初始秩2、3、6、7的进程有组秩2和3,并且在第二次迭代时也得到了它们的组;但是具有初始秩4和5的进程在第二次迭代时有组秩0和1,并且不包括在任何组中。因此,负秩

如果在循环中使用
new\u-rank
而不是
rank
(在循环之前分配
new\u-rank=rank;
),则代码可能会工作

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