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)
(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)