• 検索結果がありません。

ブロッキング送信関数および受信関数

ドキュメント内 mpi-report-j.dvi (ページ 35-43)

MPI_Finalize();

}

この例では、プロセス0 (myrank = 0)は送信関数MPI SENDを使用して、プロセス1に メッセージを送っている。この関数では、メッセージデータを取出すための送信側のメモリ内の 送信バッファを指定する。上の例の場合、送信バッファは変数 message を含む、プロセス0の メモリ上の記憶領域である。送信バッファの位置、サイズ、型は、送信関数の先頭3つの引数に より指定される。送信されるメッセージは、13文字からなる変数 message である。またこの送 信関数は、エンベロープ(訳注:データを包む封筒,3.2.3参照)をメッセージに付加する。エンベ ロープ中には、メッセージ送信先と、受信関数が特定のメッセージを選択するときに使用出来る 区別情報がある。送信関数の最後の3つの引数によって、送信されるメッセージのエンベロープ が特定される。

プロセス1(myrank = 1)が、受信関数MPI RECVを使用して、このメッセージを受信す る。エンベロープの値に従って受信されるメッセージが選択され、メッセージ・データが受信バッ ファに格納される。上の例では、受信バッファは、プロセス1のメモリ上の変数messageを含 む記憶領域から構成される。受信関数の先頭3つの引数により受信バッファの位置、サイズ、型 が指定される。最後の引数は、受け取ったメッセージの情報の返却の為に使用される。

次の節では、ブロッキング送信関数および受信関数について説明する。送信、受信、ブロッ キング通信の意味、型一致の条件、異機種環境における型変換、一般的な通信モードについて 説明する。ノンブロッキング通信については次に説明し、そのあとにチャネル風の構成、送受信 操作などを続ける。さらにそのあと、異機種間のデータ転送や不連続データを効率的に転送する ための一般的なデータの型について考察する。最後に、メッセージの明示的なパッキング、アン パッキングの関数について説明する。

3.2

ブロッキング送信関数および受信関数

3.2.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

MPI SEND(buf, count,datatyp e,dest, tag, comm)

入力 buf 送信バッファの先頭アドレス(選択型)

入力 count 送信バッファ内の要素数(非負の整数型)

入力 datatype 送信バッファの各要素のデータ型(ハンドル)

入力 dest 送信先のランク(整数型)

入力 tag メッセージタグ(整数型)

入力 comm コミュニケータ(ハンドル)

int MPI Send(void* buf, int count, MPI Datatype datatype, int dest,

int tag, MPI Comm comm)

MPI SEND(BUF, COUNT, DATATYPE, DEST, TAG, COMM, IERROR)

<type> BUF(*)

INTEGER COUNT, DATATYPE, DEST, TAG, COMM, IERROR

この呼び出しのブロッキングの意味については、3.4節で記述する。

3.2.2 メッセージ・データ

MPI SEND関数によって指定される送信バッファは、datatyp eで示される型の、連続したcount 個のエントリによって構成される。このエントリの開始アドレスはbufである。メッセージの長 さは、バイト数ではなく要素数で指定することに注意すること。後者はマシン非依存になってお り、アプリケーション・レベルに近くなる。

メッセージのデータ部分は、datatypeで示される型の連続したcount個の値で構成される。

countの値は0でも良く、その場合、メッセージのデータ部分が空になる。メッセージのデータ

値に指定できる基本的なデータ型は、ホスト言語の基本的なデータ型に対応している。Fortran 言語で利用可能この引数の型および対応するFortran言語のデータ型を以下に示す。

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

3.2. ブロッキング送信関数および受信関数 23

MPIdatatyp e Fortrandatatyp e

MPI INTEGER INTEGER

MPI REAL REAL

MPI DOUBLE PRECISION DOUBLE PRECISION

MPI COMPLEX COMPLEX

MPI LOGICAL LOGICAL

MPI CHARACTER CHARACTER(1)

MPI BYTE

MPI PACKED

C言語で利用可能なこの引数の型および対応するC言語のデータ型を以下に示す。typ esarelisted

below.

MPIdatatype Cdatatype

MPI CHAR signed char

MPI SHORT signed short int

MPI INT signed int

MPI LONG signed long int

MPI UNSIGNEDCHAR unsigned char

MPI UNSIGNEDSHORT unsigned short int

MPI UNSIGNED unsigned int

MPI UNSIGNEDLONG unsigned long int

MPI FLOAT float

MPI DOUBLE double

MPI LONG DOUBLE long double

MPI BYTE

MPI PACKED

データ型MPI BYTEMPI PACKEDは、Fortran言語やC言語のデータ型に対応するも のがない。データ型MPI BYTEは、バイト(8桁の2進数)で構成される。バイトは解釈され ていないもので、文字とは異なるものである。異なるマシンでは異なる文字表現になることがあ り、また文字を表現するときに複数バイトを使用することもある。一方、バイトはすべてのマシ ンで同じ2進値を持つ。データ型MPI PACKEDの使用については、3.13節で説明する。

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

MPI は上に列挙した、Fortran77言語とANSI C言語の基本データ型と対応するデータ型 のサポートを要求する。ホスト言語がその他のデータ型を持つ場合、MPI データ型にも追加の ものが必要になる。つまりlonglong int型として宣言されたC言語の整数値(64ビット)に対 するMPI LONG LONG INTDOUBLE PRECISION型として宣言されたFortran言語の倍精 度複素数に対するMPI DOUBLECOMPLEXREAL*2REAL*4REAL*8型としてそれぞれ 宣言されたFortran言語の実数に対するMPI REAL2MPI REAL4MPI REAL8INTEGER*1

INTEGER*2、INTEGER*4としてそれぞれ宣言されたFortranの整数に対するMPI INTEGER1

MPI INTEGER2、MPI INTEGER4などがそれにあたる。

根拠 MPI のデザインにおける目標の1つは、追加的なプリプロセシングやコンパイルを おこなうことなく、MPI をライブラリとして実装できるようにすることである。そのた め、通信呼び出しが通信バッファに変数のデータ型についての情報を持つことを前提とす ることはできない。この情報は、明示的な引数によって提供しなければならない。このよ うなデータ型の情報の必要性は、3.3.2節で説明する。(根拠の終わり)

3.2.3 メッセージ・エンベロープ

データ部分の他に、メッセージは、メッセージを区別したり選択的に受信したりするときに使用 できる情報を伝える。この情報は、一定の数のフィールドによって構成されるもので、集合的に メッセージ・エンベロープと呼ばれる。これらのフィールドは次のようになっている。

送信元 送信先 タグ コミュニケータ

メッセージの送信元は、メッセージの送信側のIDによって暗黙的に決定される。他のフィー ルドは、送信関数の引数によって指定される。

メッセージの送信先は、dest引数で指定される。

メッセージ・タグは整数値であり、tag引数で指定される。この整数は、プログラムがメッ セージのタイプを区別する為に使用される。有効なタグの値の範囲は、0,...,UBであるが、ここ で言うUBは実装依存である。この値は、第7章で述べているように、属性MPITAGUBの値を 問い合わせることで得ることが出来る。MPI では、UBの値が32767より大きいことを要求し ている。

comm引数により、送信関数で使用されるコミュニケータが指定される。コミュニケータに ついては第5章で説明するが、以下にその使用法を簡単にまとめる。

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

3.2. ブロッキング送信関数および受信関数 25 コミュニケータは、通信操作に対応する通信コンテキストを指定する。それぞれの通信コン テキストに応じて、別々の\通信世界"が提供され、メッセージは常にそれらが送られるコンテ キストの中で受信されて、異なるコンテキストで送られたメッセージが干渉することはない。

コミュニケータはまた、この通信コンテキストを共有するプロセスの集合を特定する。この プロセス・グループ内ではプロセスは順序付けられ、グループ内でのランクで識別される。この ため、送信先を示す引数destの有効な値の範囲は、0, ... , n-1となる。ただしnはグループ内 のプロセスの数である。(コミュニケータがグループ間コミュニケータの場合、送信先はリモー ト・グループ内のランクで識別される。第5章参照のこと。)

MPIは定義済みのコミュニケータMPICOMMWORLDを提供する。これを使用すると、MPI 初期化のあとアクセスできるすべてのプロセスとの通信が可能になり、プロセスは、MPICOMMWORLD 内のランクで識別される。

ユーザへのアドバイス ユーザーが、既存のほとんどの通信ライブラリで提供されているよ うな、フラットな名前空間および1つの通信コンテキストで満足していれば、comm引数 として使用するのは定義済みの変数MPICOMMWORLDで十分である。これを使用する ことによって、すべてのプロセスとの通信が初期化時に使用できるようになる。

ユーザーは、第5章で説明するように新しいコミュニケータを定義することができる。コ ミュニケータは、ライブラリとモジュールのための有効なカプセル化メカニズムを提供す る。これらを使用することにより、モジュールは、独立の通信世界と独自のプロセス番号 体系を持つことができる。(ユーザへのアドバイスの終わり)

実装者へのアドバイス メッセージ・エンベロープは通常固定長のメッセージ・ヘッダとし て符号化される。しかしながら、実際の符号化は、実装依存である。いくつかの情報(た とえば送信元または送信先)は暗黙的にもすることができ、メッセージによって明示的に 転送される必要はない。またプロセスは、相対的なランクや、絶対的なIDなどにより識 別できる。(実装者へのアドバイスの終わり)

3.2.4 ブロッキング受信

ブロッキング受信関数の構文は、以下のようになる。

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

MPI RECV(buf, count,datatype,source,tag, comm, status)

出力 buf 受信バッファの先頭アドレス(選択型)

入力 count 受信バッファ内の要素数(整数型)

入力 datatype 受信バッファの各要素のデータ型(ハンドル)

入力 source 送信元のランク(整数型)

入力 tag メッセージタグ(整数型)

入力 comm コミュニケータ(ハンドル)

出力 status ステータスオブジェクト(ステータス)

int MPI Recv(void* buf, int count, MPI Datatype datatype, int source,

int tag, MPI Comm comm, MPI Status *status)

MPI RECV(BUF, COUNT, DATATYPE, SOURCE, TAG, COMM, STATUS, IERROR)

<type> BUF(*)

INTEGER COUNT, DATATYPE, SOURCE, TAG, COMM, STATUS(MPI STATUSSIZE),

IERROR

この呼び出しのブロッキングの意味については、3.4節で記述する。

受信バッファは、datatypeで指定される型の連続したcount個の要素を含む記憶領域によっ て構成される。この記憶領域の開始アドレスはbufである。受信されるメッセージの長さは、受 信バッファの長さ以下でなければならない。オーバーフロー・エラーは、送られてくるデータが 切り詰めなくては受信バッファに収まらない場合に発生する。

受信バッファより短いメッセージが到着した場合、(短い)メッセージに対応する範囲内の 領域のみで更新が行われる。

ユーザへのアドバイス 3.8節で説明しているMPI PROBE関数を使用すると、長さの不明 なメッセージを受信することができる。(ユーザへのアドバイスの終わり)

実装者へのアドバイス プログラムエラーの場合の特定の動作がMPI によって規定され ていない場合でも、オーバーフローの処理方法として推奨される方法は、入ってくるメッ セージの送信元とタグについての情報をstatusに入れて戻ることである。その(オーバー フローが発生した)受信関数はエラー・コードを返す。高品質の実装ではまた、受信バッ ファの範囲外のメモリは上書きされない事を保証すべきである。

メッセージが受信バッファより短い場合、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

ドキュメント内 mpi-report-j.dvi (ページ 35-43)