HPFのデ ータ整列とデ ータ分散の指示文は 、ど のように 配列要素をプ ロセッサ メモリへ割り 当て るかを 、プ ログ ラマがコン パ イラに 対し て 助言することを 可能に する 。本章では 、利用 可能なデ ータマッピング 機能の中で基本的なもの 、特に 一つの 有効域内で 意味を 持つ機能に ついて論じ る。第4 章では 、マップ され た変数が 手続の引数に 現れ た場合に 適用され る機能 について 論じ る。
3.1 モデル
HPFは 、いくつか の 指示文を Fortran に 追加し て いる 。それ は 、デ ータ実体を 複数のプ ロ セッサ メモリへ割り当てる方法を 、利用者がコンパ イラに対し 助言するためのものである。こ のモデ ルではデ ータ実体から メモ リ領域すなわ ち「 抽象プ ロセッサ 」へのマッピングに 二つ の段階が 存在する。デ ータ実体(一般には 配列要素)は 、まず 最初に 、他のデ ータ実体に 対し て整列し 、次に 、この配列グループ は 抽象プ ロセッサの矩形構成へ分散され る。(実装におい ては 、これらの抽象プ ロセッサを 実現するために 同じ 数かもっと少ない数の物理プ ロセッサ が 使われ る。この抽象プ ロセッサの 物理プ ロセッサへのマッピングは 実装依存である。)
次の図は 、このモデルを図示し たものである。
"!
#
"!
#
"!
#
"!
#
- -
-配列または 他の実体
整列し た 実体のグループ
利用者が 配列の形状に
宣言し た 抽象プ ロセッサ
物理 プ ロセッサ
ALIGN DISTRIBUTE
随意の 実装依存の
指示文
ここには 、二つの 潜在的な 仮定が ある。一つは 、2個もし くはそれ 以上のデ ータ実体に 対する一つの 演算は 、それらのデ ータ実体すべてが 同一のプ ロセッサに 存在し た場合に 、よ り速く実行され るというものであり、も う一つは 、そのよ うな演算が 多い場合は 、個々の演 算が 別 々のプ ロセッサで 実行可能ならば 、複数の演算が 同時に 実行され る可能性が あるとい うものである。
配列記述に 代表され る 、多くの演算を 同時に 実行させるかど うかをコンパ イラが 決定し やすくする機能を 、Fortranはいくつも提供し ている。HPF指示文はデ ータ実体同士が 同じ
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
プ ロセッサ上に 存在すべきであるという推奨をコンパイラに知らせる手段を提供し ている: も し 二つのデ ータ実体が 同じ 抽象プ ロセッサに(整列と分散の2段階のマッピングを経て)マッ プ され ていれば 、それらは 同じ 物理プ ロセッサに 存在するべきであると い う、実装に 対し て の強力な 推奨にな る。また 、一つのデ ータ実体を 複数の場所に 置くよ うに推奨することもで きる 。これはデ ータ実体の更新処理を複雑に するかもし れないが 、そのデ ータ実体を 複数の プ ロセッサで 読み込む場合の処理を 速くする。
宣言文とし て機能する指示文と(Fortran規格の意味に おけ る)実行文とし て機能する指 示文には明確な区別がある。宣言文はプ ログラム単位に 入るときに 実行され(それらはみな一 度に 同時に 実行され るかのようであるが)、その後で実行文が 実行され る。(宣言文は翻訳時に 処理され るものと 考え ると 都合が 良いことが 多いが 、それらのいくつかは 、仮引数のような 実行時に 決まる量に 依存することが 許され ている宣言式を 含んでいる 。し たが って 、それら の式は 実行時 、具体的にはプ ログ ラムの制御が その有効域に 入った瞬間 、にならないと 利用 できないかもしれない 。)
基本的な概念とし て 、すべての配列(それど ころか 、すべてのデ ータ実体)は 、ある言語 要素への何らかの整列をもって生成され る。そし て 、その言語要素は 、抽象プ ロセッサの 何 らかの構成への何らかの分散をもつ 。もし 、配列Aの整列を 他の配列Bに 関連させて 指定し た明示的な宣言指示文がある場合には 、Aの分散はBの分散によって規定され る。そうでない 場合には 、Aの分散が 明示的に 示されているかも知れない。ど ちらの場合でも 、このような明 示的に 宣言され た情報は 配列が 生成され るときに 使用され る。
【 実装者への助言 】 このモデ ルは「 配列はある暗黙の配置で 作成され 、明示的な 指示 文がある場合に 再整列や再分散され る 」というようなモデルよりも 、必要とされ る仕事 量においてより良い状況をもたらす。ALIGNとDISTRIBUTEという宣言指示文を使用し ても 、実装上の暗黙配置を用いるよりも 、実行時においてより多くの仕事を発生させる 必要はない 。【 以上 】
割付け 実体の場合は 、実体は 割り付けられ るときに 生成され ると 言え る。割付け 実体へ の宣言指示文は 、プ ログ ラム単位の宣言部に 現れ るかも知れないが 、効果をもつのは 実体が 生成され るときであり、制御が 有効域に 入るときではない 。
整列はデ ータ実体の(Fortranの意味に おけ る)属性である。実体Aが 、既に 実体Cに 整 列し ている実体Bに整列し ている場合 、AはCに直接に 整列し ているとみなされ る。Bは宣言 時に 単な る媒介の役割を 果たすだけである。このとき 、AはBには 直接的に 整列し てい ると 言い 、AはCには最終的に整列し てい ると言う。もし ある実体が 他の実体に明示的に整列し て いな い場合には 、自分自身に 最終的に 整列し ていると 言う。整列関係は 木構造を 形作る。そ れは 、根の実体に 最終的に 整列し ているすべての実体から 成る。し かし 、その木は いつも直 ちに「 縮退 」し ているため 、すべての実体は 根へ直接の関係をもっている。
整列木の根であるすべての実体は 、関連するテンプレ ート または インデックス空間をもっ ている 。通常 、このテンプレ ート はそれに 関連する実体と 同じ 次元数であり、各次元で 同じ 大きさを もって いる 。(こ の 規則の 最も 重 要な 例外は INHERIT属性を もった 仮引数で あ る 。
INHERITに ついては4.4.2項で 解説され て いる 。) 「 配列のテンプ レ ート 」と い う言い回し は 、よく使われ る。これは 配列が 最終的に 整列し た実体のテンプレ ート を意味する。(明示的 なTEMPLATE(3.7節 参照)が 使われているとき 、単純にこのテンプレ ートが 、配列が 明示的に 整列し ているテンプレ ート にな るかもし れない 。)
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
HPFモデルの分散ステップは 、テクニカルには配列のテンプレ ートに対し て適用され る。
し かし 、既に 述べた密接な 関係に より、厳密ではないが 、配列の分散とし て 述べていること が 多い。分散は 、与えられ たパターンに 従って抽象プ ロセッサの集合に 対し テンプレ ート を 分割する。(配列からテンプレ ート への)整列と(テンプレ ートからプ ロセッサへの)分散の連 携は 、し たが って 、配列のプ ロセッサへの関係を 決定する。この関係を 配列のマッピ ング と 呼ぶ 。(これは 、スカラに 対し ても同様に 適用され る。それは 、添字リストが 空であることに よって示され る単一の点のみの インデ ックス空間をもつものとみなせるからである。)
すべての実体は 、完全な 宣言指示文のセットが 存在するかのようにし て 生成され る。も しプ ログ ラムが ある実体のマッピング のための完全な 宣言を 含んでいない場合には 、コン パ イラは 暗黙の宣言を 提供する。暗黙の宣言に よってある実体が 他のいかな る実体とも整列し ないとき 、それは 自分自身に 最終的に 整列し ている。暗黙の分散は 実装依存であるが 、明示 的な 指示文とし て 表現可能でな くてはならない。宣言が 同じ 複数の実体に 対し て 、同じ 暗黙 の分散宣言を 提供する必要はない。例えば 、コン パ イラはその 実体が 実行コード で 使われて いる文脈を考慮に 入れてもよい。宣言が 同じ 実体同士が 同じ 分散をもつようにし たいならば 、 プ ログ ラマは 暗黙に 提供され るよ うな分散を明示的に 指定すれば よい。(一方 、宣言が 同じプ ロセッサ構成同士は 、「 同じプ ロセッサ群を 同じ ように 構成する 」 ことを 表現することが 保 証されている 。これに ついては3.6節で 細か く論じ る。)
ある場合には 、一つの 配列で 全体の インデ ックス空間に 渡る宣言は 無いが 、いくつかの 小さな 配列が 整列し ている一つの 大きな インデ ックス空間を考え ることが 望まし いことが あ る。HPFでは 、テンプレ ートを宣言することができる。テンプレ ートは分散することができ 、 配列を 整列することができる単なる抽象 インデ ックス空間である。これは 、内容をもたない 要素から 成る配列のよ うなものであるため 、記憶領域を 使用し ない。
実体は 、その実体が 宣言されている有効域にあるHPFのマッピング 指示文に 現れた場合 に 、明示的にマップ されてい るとみな され 、さもなければ 暗黙的にマップ されてい るとみな され る。マッピング 指示文とは 、ALIGN、DISTRIBUTE、INHERIT指示文 、それに 、整列や分 散または INHERIT属性を 与え る指示文である。
実体の動的な再分散と再マッピングを許すために 、第 8章でこのモデルを 拡張すること に 注意され たい。
3.2 デ ータ整列とデ ータ分散指示文の構文
HPFにおける宣言指示文は二つの形式をもっている。FortranのDIMENSION文やALLOCATABLE
文に 似た文形式と 、Fortranにおけ る\::"区切りを 使った型宣言文に 似た属性形式である。
属性形式は 、一つの指示文に 一つ以上の属性を記述することを許し ている。HPFは最初 の属性や 、もちろん すべての属性に 対し て 、型指定子でなければ ならないと いう制約がない ことで 、柔軟性に おいてFortranを超えている。
H301 ombined-diretive is ombined-attribute-list :: ombined-del-list 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
or DISTRIBUTE dist-attribute-stuff
or INHERIT
or TEMPLATE
or PROCESSORS
or DIMENSION ( expliit-shape-spe-list )
H303 ombined-del is hpf-entity [ ( expliit-shape-spe-list ) ℄
or objet-name
H304 hpf-entity is proessors-name
or template-name
INHERIT属性は 、サブ ルーチン 呼出し 規約に関連するものであり、第4章で論じ る。
制約: 同じ 種類のombined-attributeを 、一つのombined-diretive中で2回以上指定し ては ならない 。
制約: DIMENSION属性が ombined-diretiveに 現れ た場合 、それが 適用され るすべての言語 要素は 、HPFの TEMPLATEやPROCESSORS型指定子で宣言され なけば ならない。
以下に 述べる規約は 、分かれた指示文にあるか ombined-diretiveにあるかに 関わらず 、 種々の属性の宣言を制約する。
DISTRIBUTE属性がある場合は 、ombined-del-listに 宣言され たすべての名前は 、 dis-tributeeとみなされ る。そし て 、それは3.3節で 述べられている制約を 受け る。
ALIGN属性が ある場合は 、デ ータ要素宣言並び(entity-del-list) に 宣言され たすべての 名前は 、aligneeとみな され る。そし て 、それは3.4節で述べられている制約を 受け る。
HPFのキ ーワード であるPROCESSORSとTEMPLATEは 、プ ロセッサ構成やテンプレ ート の宣言に おけ る型指定子の役割を 果たす。HPFのキ ーワード であるALIGN、DISTRIBUTEお
よびINHERITは 、属性の役割を果たす。プ ロセッサ構成、テンプレ ート、および 他の型(例え
ばREAL)の 言語要素に 関する属性の指定は 、型指定子を 伴わずにHPF指示文と 組み合わせ
ることができる。
一つの言語要素には 、ある属性を2回以上指定し てはならない。
次元の情報は 、hpf-entityの直後や 、DIMENSION属性の中に指定できる。両方が 指定され た場合には 、実体名(objet-name)の 直後に 指定され たものが 、DIMENSION属性に 指定され たものをくつが えす。(これは 、Fortran規格での取り扱いと 一致し ている 。) 例えば 、この ようにな る:
!HPF$ TEMPLATE,DIMENSION(64,64) :: A,B,C(32,32),D
A、B、およびDは 6464 のテンプレ ート である。Cは 3232のテンプレ ート である。
変数をマップ する指示文は 、変数が 宣言され た有効域になければ ならない。
宣言式が 同じ 宣言部の中で宣言され た配列要素の値を引用する場合 、その 配列に 対する 明示的なマッピング や INHERIT属性は 、先行する宣言指示文で完全に 宣言されていなければ ならない 。(この制約は 、次に 示す Fortran規格の F95:7.1.6.2 に より示唆され 、また 、それ
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