新的传播者无效的MPI

时间:2013-11-02 15:01:51

标签: mpi

我想创建一个新的通信器,只保留处理中使用的等级,如果我有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 }
  

[cluster-srv2:24701] * MPI_Comm_rank发生错误   传播者MPI_COMM_WORLD上的[cluster-srv2:24701] *   [cluster-srv2:24701] * MPI_ERR_COMM:无效的通信器   [cluster-srv2:24701] * MPI_ERRORS_ARE_FATAL(你的MPI工作现在会   中止)

它在文档中说:

  

MPI_ERR_COMM无效的通讯器。常见的错误是使用null   呼叫中的通信器(甚至不允许在MPI_Comm_rank中使用)。

但是我在调​​用Comm_rank之前创建了通信器,并且MPI_Comm_create的返回值也给了我MPI_SUCCESS。所以我不知道为什么会这样。

1 个答案:

答案 0 :(得分:5)

快速查看documentation for MPI_Comm_create说:

  

如果流程调用了group不属于的MPI_GROUP_EMPTY,例如MPI_COMM_NULL,则newcomm将返回MPI_Comm_create()

因此即使MPI_SUCCESS调用返回MPI_COMM_NULL,进程11-24也会在default_comm中收到MPI_Comm_create,这在任何类型的操作中使用都是非法的

在调用default_comm == MPI_COMM_NULL之后,您应该根据流程是否在新的沟通者中进行分支,最好是通过检查{{1}}。