山口屋~活動日誌~

私生活で主な出来事をピックアップ

MPI コミュニケータ ホスト ノード 分割 関数

2023-12-02 19:42:36 | ソフトウェア開発
MPIのプロセスのグループはコミュニケータと呼ばれるが、全プロセスを指す MPI_COMM_WORLD というコミュニケータしか紹介していないものが多い。
(MPI_COMM_WORLDは、初期化で用意されるコミュニケータのようである。)
そんな中、ようやくコミュニケータの分割に関する解説が載っている資料を見つけることができた。

●コミュニケータを分割して確保する関数

○C言語
int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *new_comm)

○Fortran
call mpi_comm_split(comm, color, key, newcomm, ierr)

comm
:元のコミュニケータ
color
:サブグループを決めるための変数で、同じ値なら同じサブグループになる。MPI_UNDEFINEDを指定した場合は元のコミュニケータのまま。(非負整数)
key
:サブグループにおける自プロセスのランクを決めるための変数で、昇順で新しいランクが決まる。同じ値の場合は元のランクの昇順で決まる。
new_comm
:サブグループのコミュニケータ(=分割後のコミュニケータ)。colorがMPI_UNDEFINEDの場合はMPI_COMM_NULL。
ierr
:エラーコード(出力)

●コミュニケータを解放する関数

MPI_Comm_split()で新しく割り当てたコミュニケータはMPI_Comm_freeで開放する必要があるらしい。
MPI_Comm_split()の内部で分割後のコミュニケータとランクのメモリを新たに確保している?

○C言語
MPI_Comm_free(MPI_Comm* comm)

○Fortran
MPI_COMM_FREE( comm, ierr )

●コミュニケータを複製して確保する関数

よくわからない。

○C言語
MPI_Comm_dup(MPI_Comm comm, MPI_Comm *newcomm)

○Fortran
MPI_COMM_DUP( comm, new, ierr )

<参考>
・RIKEN AICS Summer School:演習3・4 「MPIによる並列計算」
・Qiita - プログラマの技術情報共有サービス:MPI_Comm_split のテスト
・計算科学演習:MPI発展
・理化学研究所 AICS システムソフトウェア研究チーム 堀敦史:並列プログラミングの基本(MPI)改訂版

●ランクを取得

int MPI_Comm_size(MPI_Comm comm, int* psize)
int MPI_Comm_rank(MPI_Comm comm, int* prank)
comm
:所属するコミュニケータ
psize
:プロセス数(ランクの総数)
prank
:ランク

●ホスト名を取得する関数

使用例が少ないため、現在も調査中。
nameをMPI_Comm_split()のcolor値に対応させれば、ホスト毎にコミュニケータを分けることが可能。

int MPI_Get_processor_name(char* name, int *resultlen)
name
:MPI_MAX_PROCESSOR_NAMEマクロの要素数が最低限必要。

<参考>
@IT:並列処理を体感してみよう
Qiita:MPI_Comm_split のテスト
Yasuaki Ito:MPI覚え書き
理化学研究所 情報基盤センター 青山幸也:並列プログラミング入門 MPI版 2012年6月1日版(pp.65)

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« C++/CLI ラッパー C言語 配列... | トップ | MPI ファイル 入出力 »
最新の画像もっと見る

コメントを投稿

ソフトウェア開発」カテゴリの最新記事