1

コミュニケーターの一部であるすべてのプロセスを知ることができるとにかくありますか?合計16個のMPIプロセスがあり、MPI_Commcommにはグループとして4個のプロセスがあるとします。コミュニケーターの通信だけを考えると、コミュニケーターの一部であるプロセスのすべてのランクを知ることができますか?

ありがとうございました

4

1 に答える 1

5

各コミュニケータには関連付けられたプロセス グループがあり、C バインディングでMPI_COMM_GROUP( )を呼び出すことによって取得できます。MPI_Comm_groupのプロセス グループcommが取得されると、 を使用して、 のグループ内のランクのリストを、 のグループ内の対応するランクにMPI_GROUP_TRANSLATE_RANKS変換できます。のグループ内では、参加プロセスのランクが から までであるため、変換プロセスを実行する必要があります。commMPI_COMM_WORLDcomm0MPI_COMM_SIZE(comm)-1

サンプル実装は次のとおりです。

void print_comm_ranks(MPI_Comm comm)
{
   MPI_Group grp, world_grp;

   MPI_Comm_group(MPI_COMM_WORLD, &world_grp);
   MPI_Comm_group(comm, &grp);

   int grp_size;

   MPI_Group_size(grp, &grp_size);

   int *ranks = malloc(grp_size * sizeof(int));
   int *world_ranks = malloc(grp_size * sizeof(int));

   for (int i = 0; i < grp_size; i++)
      ranks[i] = i;

   MPI_Group_translate_ranks(grp, grp_size, ranks, world_grp, world_ranks);

   for (int i = 0; i < grp_size; i++)
      printf("comm[%d] has world rank %d\n", i, world_ranks[i]);

   free(ranks); free(world_ranks);

   MPI_Group_free(&grp);
   MPI_Group_free(&world_grp);
}

使用例を次に示します。

int rank;
MPI_Comm comm;

MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_split(MPI_COMM_WORLD, rank % 2, rank, &comm);

if (rank == 0)
{
   printf("Rank 0 view:\n");
   print_comm_ranks(comm);
}
else if (rank == 1)
{
   printf("Rank 1 view:\n");
   print_comm_ranks(comm);
}

および 7 つのプロセスを含む対応する出力:

Rank 0 view:
comm[0] has world rank 0
comm[1] has world rank 2
comm[2] has world rank 4
comm[3] has world rank 6
Rank 1 view:
comm[0] has world rank 1
comm[1] has world rank 3
comm[2] has world rank 5

(分割後、ランク付け0され、別のコミュニケーターになります)1

コミュニケーターはハンドルによって参照され、それらは各プロセスのローカル値であるため、現在のプロセスが認識しているコミュニケーターの内容のみを列挙できることに注意してください。

于 2013-02-05T16:53:00.157 に答える