1

処理に使用されるランクのみを保持する新しいコミュニケーターを作成したいと考えています。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 でエラーが発生しました [cluster-srv2:24701] *コミュニケーター MPI_COMM_WORLD [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 を与えています。だから、なぜこれが起こっているのか分かりません。

4

1 に答える 1

5

のドキュメントをMPI_Comm_createざっと見てみると、次のように書かれています。

groupプロセスが、たとえば に属さない で呼び出した場合MPI_GROUP_EMPTY、 thenMPI_COMM_NULLは として返されnewcommます。

したがって、MPI_Comm_create()呼び出しが で返されたとしてもMPI_SUCCESS、プロセス 11 ~ 24 は で受信MPI_COMM_NULLdefault_commます。

を呼び出した後、MPI_Comm_createプロセスが新しいコミュニケーターにあるかどうかに応じて分岐する必要がありますdefault_comm == MPI_COMM_NULL

于 2013-11-02T19:47:24.980 に答える