我想创建一个新的通信器,它只保留处理中使用的等级,如果我有 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 }
[群集-srv2:24701] * MPI_Comm_rank中出错 [集群-SRV2:24701] * 在通信器MPI_COMM_WORLD上 [群集-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。所以我不知道为什么会发生这种情况。
快速浏览一下MPI_Comm_create
的文档说:
如果进程使用它不属于的
group
调用,例如MPI_GROUP_EMPTY
,则MPI_COMM_NULL
作为newcomm
返回。
因此,即使MPI_Comm_create()
调用返回MPI_SUCCESS
,进程 11-24 也会在 default_comm
中接收MPI_COMM_NULL
,这当然在任何类型的操作中使用都是非法的。
调用MPI_Comm_create
后,您应该根据进程是否在新通信器中进行分支,理想情况下是通过检查是否default_comm == MPI_COMM_NULL
。