新通信器无效的MPI

新通信器无效的MPI,mpi,Mpi,我想创建一个新的通信器,它只保留处理中使用的列组,如果我有24个可用的处理器,并且我只需要10个,那么组应该只保留这10个,否则它将保留所有处理器。出于某种原因,当我尝试创建通信器时,所有操作都会执行,但一旦我尝试获取新通信器的大小或等级,MPI就会停止,并出现错误 80 float **matrix; 81 int *ranksArr; 82 MPI_Comm default_comm; 83 MPI_Group world_grp, new_grp;

我想创建一个新的通信器,它只保留处理中使用的列组,如果我有24个可用的处理器,并且我只需要10个,那么组应该只保留这10个,否则它将保留所有处理器。出于某种原因,当我尝试创建通信器时,所有操作都会执行,但一旦我尝试获取新通信器的大小或等级,MPI就会停止,并出现错误

 80     float **matrix;
 81     int *ranksArr;
 82     MPI_Comm default_comm;
 83     MPI_Group world_grp, new_grp;
 84     MPI_Comm_rank(MPI_COMM_WORLD, &proc_rank);
 85     MPI_Comm_size(MPI_COMM_WORLD, &proc_avail);
 86     MPI_Comm_group(MPI_COMM_WORLD, &world_grp);

 91     compute_block_size(&block, proc_avail);
 92
 93     if(block.procsUsed == proc_avail)
 94     {
 95         ranksArr = alloc_ranks_arr(proc_avail);
 96     }
 97     else
 98     {
 99         ranksArr = alloc_ranks_arr(block.procsUsed);
100         proc_avail = block.procsUsed;
101     }
102
103     MPI_Group_incl(world_grp, proc_avail, ranksArr, &new_grp);
104     MPI_Comm_create(MPI_COMM_WORLD, new_grp, &default_comm);
105     //MPI_Comm_size(default_comm, &proc_avail); //ERROR, default_comm
106
107     MPI_Comm_rank(default_comm, &proc_rank);
108
111     matrix = create_matrix_sub(&block, proc_rank);
112
113
114     dealloc_matrix(matrix);

178 int* alloc_ranks_arr(int totalRanks)
179 {
180     int *ranksToGroup = malloc(totalRanks * sizeof(int));
181     int i;
182
183     for(i = 0; i < totalRanks ; i++)
184     {
185         ranksToGroup[i] = i;
186     }
187
188     return ranksToGroup;
189 }
80浮点**矩阵;
81国际*朗克萨尔;
82 MPI_通信默认_通信;
83 MPI集团世界集团、新集团;
84 MPI通信等级(MPI通信世界和过程等级);
85 MPI通信大小(MPI通信世界和过程可用性);
86 MPI_Comm_集团(MPI_Comm_WORLD和WORLD_grp);
91计算块大小(&block,proc\u avail);
92
93如果(block.procsUsed==proc\u avail)
94     {
95 ranksArr=alloc_ranks_arr(proc_avail);
96     }
97其他
98     {
99 ranksArr=alloc_ranks_arr(block.procsUsed);
100 proc_avail=block.procsUsed;
101     }
102
103 MPI集团(包括世界集团、proc集团、ranksArr集团和新集团);
104 MPI通信创建(MPI通信世界、新通信集团和默认通信);
105//MPI通信大小(默认通信和过程可用)//错误,默认\u通信
106
107 MPI通信等级(默认通信等级和过程等级);
108
111矩阵=创建矩阵子模块(&block,proc\u rank);
112
113
114 dealoc_矩阵(矩阵);
178整数*所有秩(整数总秩)
179 {
180 int*ranksToGroup=malloc(totalRanks*sizeof(int));
181国际一级;
182
183表示(i=0;i
[cluster-srv2:24701]*MPI\U Comm\U列组中发生错误 [cluster-srv2:24701]*关于通讯器MPI\u COMM\u WORLD [cluster-srv2:24701]*MPI\u ERR\u COMM:无效的通信器 [cluster-srv2:24701]*MPI错误是致命的(您的MPI作业现在将 中止)

文件中说:

MPI\u错误\u通信无效的通信器。一个常见的错误是使用空值 呼叫中的通信器(甚至在MPI_Comm_列中都不允许)

但是我在调用Comm_rank之前创建了通信器,而且MPI_Comm_create的返回值给了我MPI_成功的机会。因此,我不知道为什么会发生这种情况。

快速查看以下内容:

如果进程使用它不属于的
组调用,例如
MPI\u group\u EMPTY
,那么
MPI\u COMM\u NULL
将作为
newcomm
返回

因此,即使
MPI\u Comm\u create()
调用返回
MPI\u SUCCESS
,进程11-24在
default\u Comm
中接收
MPI\u Comm\u NULL
,这在任何类型的操作中都是非法的

调用
MPI\u Comm\u create
后,您应该根据进程是否在新的通信器中进行分支,最好是通过检查
default\u Comm==MPI\u Comm\u NULL

快速查看以下命令:

如果进程使用它不属于的
组调用,例如
MPI\u group\u EMPTY
,那么
MPI\u COMM\u NULL
将作为
newcomm
返回

因此,即使
MPI\u Comm\u create()
调用返回
MPI\u SUCCESS
,进程11-24在
default\u Comm
中接收
MPI\u Comm\u NULL
,这在任何类型的操作中都是非法的


调用
MPI\u Comm\u create
后,您应该根据进程是否在新的通信器中进行分支,最好是通过检查
default\u Comm==MPI\u Comm\u NULL

确定查看不同的示例后,我认为我理解了问题。其他13个处理器从未包含在组中,因为我只为组生成0-9,我怀疑这会使不属于组的列组调用新创建的comm无效。因为我不想使用这些处理器,所以我考虑在我不使用的每个列上调用MPI_Finalize。我不确定这种方法是否可以接受,但现在可能必须这样做。好的,在看了不同的样本后,我想我理解了这个问题。其他13个处理器从未包含在组中,因为我只为组生成0-9,我怀疑这会使不属于组的列组调用新创建的comm无效。因为我不想使用这些处理器,所以我考虑在我不使用的每个列上调用MPI_Finalize。我不确定这种方法是否可以接受,但现在可能必须这样做。