5.4
コミュニケータ管理
この節では、 MPI におけるコミュニケータの操作について説明する。コミュニケータを参照す る操作はローカルであり、 実行のためにプロセス間通信を必要としない。コミュニケータを生 成する操作は集団操作であり、プロセス間通信を必要とする場合がある。
実装者へのアドバイス
高品質な実装では複数回にわたる(同じグループ、 またはそのサブセットの)コミュニ ケータの生成に関連するオーバーヘッドを1つの集団通信で複数のコンテキストを割り当 てることにより低減しなければならない。
(実装者へのアドバイスの終わり)
5.4.1 コミュニケータ・アクセッサ
次のものはすべてローカル通信操作である。
MPI COMM SIZE(comm, size)
入力 comm コミュニケータ(ハンドル)
出力 size commのグループ中のプロセス数(整数型)
int MPI Comm size(MPI Comm comm, int *size)
MPI COMM SIZE(COMM, SIZE, IERROR)
INTEGER COMM, SIZE, IERROR
根拠
この関数は、 後述するようにMPI COMM GROUPでコミュニケータのグループをアク セスし、 MPI GROUP SIZEを使用してサイズを計算し、MPI GROUP FREEによって 一時的なグループを解放する操作と等価である。しかし、 この関数は非常によく使用され るのでショートカットが導入された。
(根拠の終わり)
ユーザへのアドバイス
この関数は、 コミュニケータに関わるプロセスの個数を返す。MPI COMMWORLDの場 合、 これは利用可能なプロセスの総数を示している(MPI の本レポートのバージョンで は、 初期化後にプロセスの個数を変更する標準的な手段は用意されていない)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
この関数は、 特定のライブラリやプログラムで利用可能な並列度を決定するために次の
MPI COMM RANK とともに使用されることが多い。関数MPI COMM RANK は、0か らsize01の範囲で呼び出したプロセスのランクを示す。ただし、sizeはMPI COMM SIZE の返却値である。
(ユーザへのアドバイスの終わり)
MPI COMM RANK(comm, rank)
入力 comm コミュニケータ(ハンドル)
出力 rank グループcommにおける呼び出しプロセスのランク (整 数型)
int MPI Comm rank(MPI Comm comm, int *rank)
MPI COMM RANK(COMM, RANK, IERROR)
INTEGER COMM, RANK, IERROR
根拠
この関数は、MPI COMM GROUPでコミュニケータのグループをアクセスし(上記参照)、
MPI GROUP RANKを使用してランクを計算し、 MPI GROUP FREEによって一時的な グループを解放する操作と等価である。しかし、 この関数は非常によく使用されるので ショートカットが導入された。
(根拠の終わり)
ユーザへのアドバイス
この関数は、 特定のコミュニケータ・グループの中の自プロセスのランクを与える。上述 のように、MPI COMM SIZEとともに使用すると便利である。
多くのプログラムは、 マスタ・スレーブ・モデルに基づいて作成される。つまり、 一つ のプロセス(ランク0のプロセスなど)の管理下に、他のプロセス群が計算ノードとして サービスするのである。このモデルでは、 前出の2つの関数がコミュニケータの個々のプ ロセスの役割を決定するために使用される。
(ユーザへのアドバイスの終わり)
入力comm1 第一コミュニケータ (ハンドル)入力 comm2 第二コミュニケータ(ハンドル) 出力result 結果(整数型)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
5.4. コミュニケータ管理 183
MPI COMM COMPARE(comm1,comm2, result)
入力 comm1 第一コミュニケータ(ハンドル)
入力 comm2 第二コミュニケータ(ハンドル)
出力 result 結果(整数型)
int MPI Comm compare(MPI Comm comm1,MPI Comm comm2, int *result)
MPI COMM COMPARE(COMM1, COMM2, RESULT, IERROR)
INTEGER COMM1, COMM2, RESULT, IERROR
comm1とcomm2が同じオブジェクト(同一グループ、 同一コンテキスト)のハンドルである
場合、 かつその場合にかぎりMPIIDENTが返される。対応するグループのメンバおよびランク 順序が同一の場合にはMPICONGRUENTが返される。この場合二つのコミュニケータはコンテキス トのみが異なる。両方のコミュニケータのグループのメンバは同一であるが、ランク順が異なる場合に
MPISIMILARとなる。これら以外の場合は、MPI UNEQUALとなる。
5.4.2 コミュニケータコンストラクタ
次に示す関数は、 コミュニケータcommに付随するグループ内のすべてのプロセスにより呼び 出される集団操作関数である。
根拠
MPI では新しいコミュニケータを生成する場合にコミュニケータが必要とされるという点 で、鶏が先か卵が先かという議論があり得ることに注意されたい。すべてのMPIコミュニ ケータを生成するための基本コミュニケータはMPIの外であらかじめMPI COMMWORLD として定義されている。
このモデルは、 多くの議論の後にMPI で書いたプログラムの「安全性」を高めるために 選択された。
(根拠の終わり)
入力commコミュニケータ (ハンドル)出力newcommcommの複製(ハンドル)
MPI COMM DUP(comm, newcomm)
入力 comm コミュニケータ(ハンドル)
出力 newcomm commの複製(ハンドル)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
MPI COMM DUP(COMM, NEWCOMM, IERROR)
INTEGER COMM, NEWCOMM, IERROR
MPI COMM DUPは、 付随するキーとともに既存のコミュニケータcommを複製する。
付随する各々のキーに対応する複製コールバック関数は新しいコミュニケータに付随する属性値 を決定する。複製コールバック関数の利用方法として新規コミュニケータから属性を削除する操 作があげられる。返り値newcommには同じグループ、 コピーされたキャッシュ情報を持つ新 しいコンテキストの新規コミュニケータが与えられる。(5.7.1 節を参照のこと)。
ユーザへのアドバイス
この操作は、 元のコミュニケータと同じ特性を持つ複製された通信空間を使用する並列ラ イブラリ関数を提供するためにある。この特性には、 属性(下記参照)とトポロジー(第
6章参照)が含まれる。この呼び出しは、 コミュニケータcommに保留された1対1通信 がある場合でも有効である。典型的な呼び出しでは、 並列関数のはじめにMPI COMM DUP が呼ばれそれによって複製されたコミュニケータは関数の終わりでMPI COMM FREEに よって解放されるだろう。他のコミュニケータ管理の方法も可能である。この呼び出しは、
グループ内とグループ間コミュニケータの両方に適用される。
(ユーザへのアドバイスの終わり)
実装者へのアドバイス
実際にはグループ情報をコピーする必要はなく、 新しい参照を追加し、 参照カウントを インクリメントすればよい。コピーオンライトの手法をキャッシュ情報に使用することも できる。
(実装者へのアドバイスの終わり)
MPI COMM CREATE(comm,group, newcomm)
入力 comm コミュニケータ(ハンドル)
入力 group commのサブセットであるグループ(ハンドル)
出力 newcomm 新しいコミュニケータ(ハンドル)
int MPI Comm create(MPI Comm comm, MPI Group group, MPI Comm *newcomm)
MPI COMM CREATE(COMM, GROUP, NEWCOMM, IERROR)
INTEGER COMM, GROUP, NEWCOMM, IERROR
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
5.4. コミュニケータ管理 185 この関数は、groupによって定義された通信グループと新しいコンテキストを持つ新規コミュニ
ケータnewcommを生成する。キャッシュ情報はcommから newcommへは継承されない。こ
の関数は、 groupに属さないプロセスにMPICOMMNULLを返す。この関数の呼び出しに置い
て全てのgroup引数が同じ値を持たない場合やgroupがcommのグループのサブセットでない
場合にはエラーとなる。この呼び出しは、 新規グループに属す属さないにかかわらずcommの すべてのプロセスによって実行されるべきであることに注意されたい。この呼び出しはグループ 内コミュニケータにのみ適用される。
根拠
commのグループ全体が呼び出しを行うという要求条件は次の考察から生じた。
通常の集団通信を使用してMPI COMM CREATEを実装可能とする。
特に一部重なり合うグループ同士が新規コミュニケータを生成する場合を含め、 さ らなる安全性を提供する。
コンテキスト生成時に、 可能な場合には通信を避ける実装を許容する。
(根拠の終わり)
ユーザへのアドバイス
MPI COMM CREATEは、別の通信空間で別のMIMD計算を行うためにプロセスグルー
プのサブセットを提供するための手段を提供する。MPI COMM CREATEで得られたコ ミュニケータnewcommにさらにMPI COMM CREATE(または他のコミュニケータコン ストラクタ)を適用し、計算を並列化された副計算に再分割することができる。より一般 的なサービスは後述のMPI COMM SPLITが提供する。
(ユーザへのアドバイスの終わり)
実装者へのアドバイス
MPI COMM DUPまたはMPI COMM CREATEを呼び出すプロセスはすべて同じgroup 引数を持つので、 理論的には通信なしでグループ固有のコンテキストを提供することが可 能である。しかし、 これらの関数をローカルに実行するにはコンテキスト名を保持するた めに大きな空間が必要となりまたエラー検査の機会を減らすことにもなる。実装に際して はこれらの矛盾する目標に対して1つの集団通信で複数のコンテキストを一括して割り当 てるなどの種々の妥協案を打つことができる。
重要:関与するプロセスと同期せずに新しいコミュニケータを生成する場合、 通信システ ムは受信側プロセスでまだ割り当てられていないコンテキストに到達するメッセージに対 処できなければならない。
(実装者へのアドバイスの終わり)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48