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

副プ ログラム境界でのデータマッピ ング

この章では 、「 呼出し 元は...し なければ ならない」という言い回し は 、実装(すなわち 、コン パ イラに より 生成され るコ ード)に 対する制約を 表すもので 、プ ログ ラマの 記述するソース コード に 対するものでない 。

4.1 はじ めに

この節では 、マッピング 指示文が 、副プ ログ ラムへ受け 渡され る引数とど のように 関連する のかに ついての概要を 示す。ただし 、ここで 用いられ る言葉は 、完全なものではない 。厳密 な規則はこの節に 続くいくつか の節において 説明する。

第3章で述べたデ ータマッピング 機能に 加えて 、HPFでは 仮引数のマッピングに 関し て 多くのオプ ションが 用意されている。

各々の仮引数のマッピングは 、それを呼び 出す主プ ログ ラム又は 手続(\呼出し 元")での 対応する実引数と 、いくつかの異な った方法で 関連づけられ る。このために 、仮引数に 対す るマッピング 指示文は 、3通りの異なる構文的な形をとることができる。すなわちそれは 、指 令的 、記述的 、転写的の3つである。

HPFの提供するこれら3つの記法は 、プ ログ ラマが 、デ ータをそのままの場所に 置いて おくのか 、あるいは 呼出し の間だけ 、新し い 、そし ておそら くは 呼ばれ た側の副プ ログ ラム の実行が より効率よく行なえ るよ うな マッピングに 、デ ータを 自動的に 再マップ するのかを 指定できるように する。

これらの記法の意味は 次の通りである。

指令的 指令的な指示文は 、仮引数のマッピングについて 指定する。ただし 、実引数はそれと 同じ マッピングを持たなくても構わない。同じ マッピングを持たない場合 、指定された 通りに 引数を再マップ するコード を生成し 、副プ ログラムの出口で元のマッピングに戻 すコード を生成することは 、コンパ イラの責任となる。このコード は 、呼出し 元に 生成 され る場合もあれば 、呼ばれた側の副プ ログ ラム中に 生成され ることもあるだろう。第

4.6節で 説明する明示的引用仕様の必要性により、マッピングをど ちらの側で 行な うに し ても 、必要な 情報はコン パ イル時に 得ることが 可能である。

指令的な指示文は 、構文的にはプ ログ ラムの他の部分に 現われ る指示文と同じ である。

例えば 、Aが 仮引数だとすると 、

!HPF$ DISTRIBUTE A (BLOCK, CYCLIC)

は 、指令的な指示文となる。

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

記述的 記述的な指示文は 、指令的な構文と全く同じ 意味を持つ。違うのは 、記述的な指示文 は 、実引数が 再マッピングを必要とし ないというプ ログラマによる弱い表明になるとい うことである。

この表明が 、\弱い"と表され るのは 、もし その表明が 偽であっても 、プ ログ ラムは依然 とし て標準規格合致であるからである。そのような場合 、コンパ イラは 、適切な再マッ ピング を生成し なければ ならない。

もし コンパイラが 、その表明が 偽だと判定できた時、あるいはその表明が 真であるかど うか 確定できない時は 、警告か 、診断情報 メッセージを出力できる。

【 利用者への助言 】 指令的な指示文に対し て記述的な指示文があることの目的は 、 プ ログ ラムの 開発及びデ バッグ のために 有用な 情報を 、コン パ イラがプ ログ ラマ に 報告する手段を 、単に 提供し ているに すぎ ない。記述的な 指示文の使用に 対し て いかな る診断 メッセージを 出すことも 、この言語の移植性のあ る機能ではない ことに注意されたい。特に 、再マッピングの必要性がないにもかかわらず、コンパ イラがこのこと 実を 確かめるのが 不可能か 又は 自明でない場合が あることに 注意 が 必要である。コン パ イラが 異なれば 、違った状況で メッセージを 出力する場合 もある。さらに 、そのよ うな メッセージを 出力し なければ ならないという要求も 全くない。【 以上 】

記述的な指示文は 、マッピングの記述の前にアスタリスクが 付くことを除いては 、指令 的な指示文と同じ 形をし ている 。

!HPF$ DISTRIBUTE A *(BLOCK, CYCLIC)

は 、記述的な指示文である。

転写的 マッピングは 、指定されない。呼ばれた側の副プ ログラムは 、渡ってきた引数がど の ように マップ されていてもそれを受け入れ る必要がある。もちろんこのことは 、呼出し 元(の実装)が マッピングに 関する情報を実行時に 渡すことを意味する。

転写的な指示文は 、分散形式及びプ ロセッサ構成を指定するところに 単にアスタリスク を 書くことで記述できる。

!HPF$ DISTRIBUTE A *

!HPF$ DISTRIBUTE B * ONTO *

は 、転写的な指示文である。転写的な整列を指定するのには 、INHERIT指示文(第4.4.2

項を参照)が 用いられ る。

分散形式と 、プ ロセッサ構成の両方に 、指令的 、記述的 、複写的の指示ができる 。整列 は 、より複雑である。なぜなら 、仮引数が 整列すべきテンプレ ートが 必要だからである。こ のテンプレ ートは 、指定し なくても構わない(この場合もちろんALIGN指示文は存在し ない)。 この時 、仮引数のテンプレ ートは 、自然テンプレ ート になる。(\自然テンプレ ート"は 、この

後の第4.4.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

テンプレ ートは 、指令的なALIGN指示文により明示的に 指定され る

テンプレ ートは 、記述的なALIGN指示文により明示的に 指定され る

テンプレ ート は 、継承され る。これは 、仮引数にINHERIT属性(この後の第4.4.2項で 説明され ている)を与えることで指定され る。これは 、テンプレ ートが 、対応する実引 数が 最終的に 整列されているテンプレ ート のコピ ーとなることを暗黙に 指定する。さら に 、仮引数のそのテンプレ ート への整列は 、対応する実引数のそれと同じ になる。これ は 結局 、整列の転写的な形式と 同じ 効果を持つ。

これについては 、この後の第4.4.1項でより正確に 説明されている。

【 利用者への助言 】 例えば 、一部分が 指令的で 、一部分が 転写的であるような 混合し たマッピング 指示文を記述することは 可能だが 、そうすることにはおそら く何の メリッ ト もないだ ろう。これらの指示文のポ イントは 、コンパ イラが 、必要な再マッピングを すべて正し く、効率的に処理できるようにするところにある。再マッピングは 、次のよ うな理由が 原因で起こることが ある。

実引数と仮引数の整列状態を合わせるため

実引数と仮引数の分散状態を合わせるため

実引数と仮引数が 分散され るプ ロセッサ構成を一致させるため

ほとんど のマシンにとって 、これらのど の理由による再マッピング の間にも 、実質的な コ ストの差はない。それ ゆえ 、マッピング 指示を純粋に 転写的な指示にする 、純粋に指 令的な指示にする 、あるいは 純粋に 記述的な指示にするほ うが 、よい選択といえ るであ ろう(少なくともそのほ うが 読みやすくなる )。

転写的な指示によるマッピングは 、ライブ ラリを書く場合に 有用かもしれないが 、副プ ログラム中でランタイムコ ストを発生することになる。それゆえ 、通常のユーザーコー ド 中でこれらを 使用することは 避け るべきである。【 以上 】

4.2 ど のような再マッピ ングが 必要とされ 、誰が それを行なうのか

呼び 出され る副プ ログ ラムに 対する明示的引用仕様が 宣言され ており、その 引用仕様が 仮引 数に 対する指令的又は 記述的な マッピング 指示文を 含み 、か つ対応する実引数の再マッピン グが 必要な 場合 、その副プ ログ ラムの呼出し は 、デ ータが 、明示され た引用仕様で 指示され た仮引数のマッピングに マッチするよ うなテンポラ リの変数に 、あたかもコピ ーされたかの ようにし て行なわれ る。仮引数のテンプレ ートは 、引用仕様に 記述された通りにな る。

明示的引用仕様が 存在し な い場合は 、再マッピング は 必要ない 。これは 、第4.6節で 示 され る要求の結果である。

簡単のため 、この章で 示され るコード 片には 、そのよ うに 必要とされ る明示的引用仕様 が 全て含まれているわけではないことに 注意され たい。

基本となる原理は 、引数の再マッピングは 、呼出し 元からは 見えないということである。

つまり、副プ ログ ラムからの戻り時や 、呼出し 元の実行が 再開され た時には 、その呼出し 後 に 呼出し 元が ア クセスできる全ての実体は 、呼出し 前と 全く同様に マップ され ているという

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

ことである。手続は 、それ を 呼び 出し た側からも見え るようないかな る実体のマッピング を 変更することもできな い。

【 利用者への助言 】 いくつかの公認拡張では 、この制約が 緩和され る。例えば 、第8.6 +

節や第8.8節を参照し てほし い。【 以上 】

4.3 分散とプ ロセッサ構成

全てのdistributeeが 仮引数であるようなDISTRIBUTE指示文では 、dist-format-lauseか

dist-targetあるいは その両方を 、ア スタリスクで 始めたり、ア スタリスクだけから 構成し たりで

きる 。

ア スタリスクがな い場合 、dist-format-lause又はdist-targetは 、指令的にな る。この 節は分散を記述し 、言語処理系にその分散に 従うよう要求する。これによって 、要求さ れた仮引数の分散を実現するために 、実行時に 実引数の再マッピング 又はコピ ーが 、呼 出し 元か 呼ばれ た側の副プ ログ ラム(の実装)で行なわれ る可能性が ある。

アスタリスクで始めると 、dist-format-lause又はdist-targetは 、記述的になる。この指 示文は 、次の点を 除いて 、指令的な 指示文と全ての点に おいて 同等である。すなわ ち 、 コンパ イラが 、実引数の再マッピングが 必要ないと いうことが 判定できなか った場合 、 そのことについての診断 メッセージを出力できるということである。この点についての 詳し い説明は 、第4.1節を参照し てほし い。

アスタリスクのみからなると 、dist-format-lause又はdist-targetは 、転写的になる。こ の節は 、分散については 何も述べないが 、言語処理系に対し て 、実引数の分散をコピ ー することを 要求する。(この意図は 、引数が 参照渡し の場合 、実行時にデ ータの移動が 不要になるとい うことである。)

一つのDISTRIBUTE指示文の中で 、dist-format-lauseがアスタリスクを持ち、dist-target

が 持たな くてもよく、またその逆も可能である。

4.3.1 例

以下の仮引数用のDISTRIBUTE指示文の例は 、いろいろな 組合せに ついて説明し ている 。

!HPF$ DISTRIBUTE URANIA (CYCLIC) ONTO GALILEO

言語処理系は 、プ ロセッサ構成GALILEOへURANIAをCYCLIC分散するために 必要なことをし なければ ならない 。

!HPF$ DISTRIBUTE POLYHYMNIA * ONTO ELVIS

言語処理系は 、POLYHYMNIAを 、その現在の分散形式(それが 何であれ)に 従って 、プ ロセッ サ構成ELVISへ分散するために 必要なことをし なければ ならない 。(POLYHYMNIAは 他のプ ロ セッサ構成の可能性もある。)

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