MPIのコミュニケータについて

MPIのコミュニケータについて、日本語の資料は基礎的なものしか見当たらなかったので 、少し発展的な内容についてメモしておく。この 発表資料 、およびMPICHのドキュメントを参考にしている。

用語

MPIにおけるコミュニケータ、グループ、プロセスについて整理する。

  • プロセス
    • MPIはプロセス間の通信を抽象化して記述するライブラリである。
    • プロセスは複数のマシンで分散して並列に動作する。1つのマシンで複数のプロセスが 動作することもできる。
  • グループ
    • グループは、複数のプロセスの順序付けられた集合である。
    • グループに所属する全てのプロセスは、0から始まるIDが振られている。この IDのことをランクという。
    • グループは積、和、差などの演算で自由に操作できる。
  • コミュニケータ
    • コミュニケータは、MPIの通信を行うランク空間を表現するものである。
    • コミュニケータは、いずれかのグループにひも付けられている。
    • MPI上の全ての通信は、いずれかのコミュニケータを指定して行われる。
    • デフォルトで、全てのプロセスを含んだMPI_COMM_WORLDと 自プロセスのみを含んだMPI_COMM_SELFが存在する。

コミュニケータとグループはm:nの関係、グループとプロセスもm:nの関係にある。 ここで意識したいのが、コミュニケータとグループの違いである。多くの資料で コミュニケータとグループを等価なものであるかのように扱っている。しかし実際は、 1つのグループに対して複数のコミュニケータを割り当てることができる。

コミュニケータに関連する関数

  • MPI_Comm_size: あるコミュニケータに含まれるプロセスの数を得る。
  • MPI_Comm_rank: あるコミュニケータの自プロセスのランクを得る。
  • MPI_Comm_dup: 既存のコミュニケータと同じグループにひも付けられた、新しい コミュニケータを作成する。
  • MPI_Comm_create: 与えられたグループにひも付けらた新しいコミュニケータを 作成する。
  • MPI_Comm_split: 既存のコミュニケータのグループを、複数のグループに分割し、 それぞれのグループに対して新しいコミュニケータを作成する。
  • MPI_Comm_group: コミュニケータをにひも付けられたグループを得る。

グループに関連する関数

  • MPI_Group_union: グループの和集合を得る。
  • MPI_Group_intersection: グループの積集合を得る。
  • MPI_Group_difference: グループの差集合を得る。
  • MPI_Group_incl, MPI_Group_excl, MPI_Group_range_incl, MPI_Group_range_excl: グループの一部から新しいグループを作成する。
  • MPI_Group_translate_ranks: あるグループにおけるランクを、別のグループに おけるランクに変換する。

イントラコミュニケータとインターコミュニケータ

コミュニケータは、2種類に分類できる。1つ目がイントラコミュニケータである。 イントラコミュニケータは1つのグループにひも付けられたコミュニケータで、通信を そのグループ内のみに限定する。2つ目はインターコミュニケータである。 インターコミュニケータは、通信を2つの互いに素なグループ (=両方のグループに所属するプロセスが 存在しない) 間のみに限定する。

以下ではインターコミュニケータの説明を行う。自プロセスが所属するグループを ローカルグループ、もう片方のグループをリモートグループと呼ぶ。送受信の相手と なるプロセスは常にリモートグループに所属していることになる。下記に インターコミュニケータに特有な関数の一部を示す:

  • MPI_Comm_test_inter: コミュニケータがインターコミュニケータであるか判定する。
  • MPI_Comm_remote_size: リモートグループのプロセス数を得る。
  • MPI_Comm_remote_group: リモートグループを得る。
  • MPI_Intercomm_create: 2つのコミュニケータからインターコミュニケータを作成する。
  • MPI_Intercomm_merge: インターコミュニケータのローカルグループとリモートグループ をマージし、新しいイントラコミュニケータを作成する。

MPI_Comm_create, MPI_Comm_dup, MPI_Comm_splitなどの関数は、 インターコミュニケータでも動作する。また、集合通信の大半もインターコミュニケータで 動作する。詳しい説明は、MPIのドキュメント を参照すると良いと思う。