gpt4 book ai didi

c - 尝试将通信世界拆分为 MPI 中的多个通信世界或 block ?

转载 作者:行者123 更新时间:2023-11-30 17:36:36 25 4
gpt4 key购买 nike

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

rank = 0 newrank = 0

rank = 2 newrank = 0

rank = 6 newrank = 0

rank = 4 newrank = -32766

rank = 7 newrank = 1

rank = 5 newrank = -32766

rank = 3 newrank = 1

rank = 1 newrank = 1

预期输出是

rank = 0 newrank = 0

rank = 2 newrank = 0

rank = 6 newrank = 0

rank = 4 newrank = 0

rank = 7 newrank = 1

rank = 5 newrank = 1

rank = 3 newrank = 1

rank = 1 newrank = 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 中的多个通信世界或 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22622820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com