HPFのINDEPENDENT指示文の目的は 、プ ログ ラマが コン パ イラに 並列化のための追加情報 を与えられ るよ うにすることである。ユーザは 、DOループ の中に 、ループ のある繰返し にお いて 定義され 、別の繰返し に おいて 使用(読み出し または 書き込み)され るようなデ ータが 存 在し ないことを表明できる。同様の情報を 、FORALL文の インデックス値の組み合わせに 対し ても与え ることができる。このような 情報は 、コン パ イラの最適化に 役立つことが ある。し かし 、このような 情報を 知るには 、プ ログ ラマにし か 解らないアプ リケーシ ョンに 対する知 識を 必要とする場合もあるだろう。そこで 、HPFでは 、ユーザがこれらの表明を行な うこと を許し 、コンパ イラは 、それらの表明に 頼ってコン パ イルを 行な うことができる 。表明が 正 し ければ 、プ ログ ラムは 意味的に 変更されない。もし 表明が 間違っている場合 、そのプ ログ ラムはHPF規格合致でな く、その意味は 不定となる。
HPF1.0と 比較すると 、HPF2.0のINDEPENDENT指示文では 、INDEPENDENTループ の中 で 集計演算を 行な うことが 許され ている 。ただし 、その集計演算子は 、組込みであり、か つ 結合則 、交換則を 満たすFortranの 演算子(例 .AND.)または 関数(例MAX)でなければ ならな い。このような演算を含むデ ータ並列計算では 、1つまたはそれ 以上の変数が 、複数のループ 繰返し に よって更新され ることが 多いために 、HPF1.0ではINDEPENDENTループ とし て表現 できな い場合がしばしば あった 。し かし 、そのような 場合でも 、変数の更新の順序が 最終的 な結果に 影響し ない場合には 、並列性が 引き出せる可能性が あり、また 、そうし たいと 望ま れ る場合もあ るだ ろう。次のようなループ で表され る総和演算はこの典型的な例である。
DO I = 1, 1000000000
X = X + COMPLICATED_FUNCTION(I)
END DO
このループ は 、共有変数Xが 、ループ のそれぞれの繰返し によって 、不可分な方法で(in
anatomimanner)更新され る限り、並列に 実行可能である。あるいは 、更新を一時的なロー
カルアキュムレ ータ変数に対し て行ない、(短い)最終フェーズでそれら変数の値をXの初期値 とマージすることで 、ループ を並列に実行することができる。ど ちらのケースにおいても 、計 算は 本質的に並列であるが 、HPF1.0でのINDEPENDENTの厳密な定義からすると許されない。
ここで 、現在のFortranがデ ータ並列計算を 表現するいくつか の手段を含んでいること について 触れ るのは 価値が あるだ ろう:
配列代入文(WHERE文を 含む)
組込み手続や利用者定義手続の要素別処理
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
FORALL文及びFORALL構文(PURE関数の要素別処理を 含む) SUMやTRANSPOSEなど の変形組込み関数
FORALLとPUREは 、HPF1.0からFortranに採用された 。これらは 全て現在Fortranの一 部となっているので 、このド キュ メント であらためてとりあげ ることはない。
5.1 INDEPENDENT指示文
INDEPENDENT指示文は 、インデ ックス付きDOループ または 、FORALL文の前に 置くことがで きる。これは 、コンパ イラに 対し 、後続のDOループ の繰返し や 、後続のFORALL文の中の演 算を 独立に(つまり、任意の順序で 、または イン ターリーブ に 、または 並列に)実行でき 、そ うし てもプ ログ ラムの意味は 変らないことを表明する。
INDEPENDENT指示文は 、DOル ープ または FORALLの 前に 置かれ 、それ ら の 動作を 表明 する 。こ のとき 、INDEPENDENT 指示文は 、そのル ープ またはFORALLへ 適用され ると 言 う。
INDEPENDENT指示文の構文は 次のとおりである。
H501 independent-diretive is INDEPENDENT [ , new-lause ℄
[ , redution-lause ℄
H502 new-lause is NEW ( variable-name-list )
H503 redution-lause is REDUCTION ( redution-variable-list )
H504 redution-variable is array-variable-name
or salar-variable-name
or struture-omponent
制約: independent-diretive の後の最初の非注釈行は 、do-stmt、forall-stmt、またはforal l-onstrutでなければ ならない。
制約: independent-diretiveの後の最初の非注釈行がdo-stmtである場合 、その文は do-vari-ableを 含むloop-ontrol オプ ションを 持たなければ ならない。
制約: NEW節またはREDUCTION節がある場合 、指示文の後の最初の非注釈行はdo-stmtでな ければ ならない。
制約: NEW節またはREDUCTION節内に 指定するvariable及び それらの成分及び 要素は 、次の ものであってはならない。
仮引数
SAVE属性またはTARGET属性を 持つもの
COMMONブ ロッ クに 現われ るもの
EQUIVALENCE文に より他の実体と記憶列結合するもの
参照結合し たもの
親子結合し たもの
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
親子結合により他の有効域でアクセスされ るもの
制約: redution-variableとし て現われ る変数は 、同じindependent-diretiveのnew-lause中 に 現われてはならず、independent-diretiveが 適用され る後続のdo-stmt、forall-stmt
及び forall-onstrut の範囲内(すなわ ち 、ソース上でのループ 本体部)のnew-lause
及びredution-lauseに 現われてはならない。
制約: redution-variable中のstruture-omponentは 、subsript-setion-listを含んではなら ない 。
制約: redution-variable 1
とし て 現 わ れ る 変 数 は 、組 込 み 型 で な け れ ば な ら な い 。ま た 、
CHARACTER型であってはならない。
【 仕様の根拠 】2番目の制約は 、INDEPENDENT指示文が 、WHILEループ や 、単純なDO
ループ(すなわち 、「 無限ループ 」)には 適用できないことを 意味し ている。そのような ケースに おけ るINDEPENDENTは 、0または1回の 繰返し からな るループ にのみ適用で きるという案もあった。し かし 、それにより生じ うる混乱のほ うが 、得られ るであろう 利益よりも 重大だと 思われ た 。【 以上 】
INDEPENDENT指示文がDOル ープ に 適用され た場合 、ル ープ の繰返し が 、直接的に も間 接的にも 、他の繰返し に 干渉する可能性がないことの 、プ ログ ラマに よる表明とな る。干渉 するとは 、次のよ うな 操作とし て定義され る。
同じ 不可分な 実体へ代入を 行な う二つの 演算は 、互いに 干渉する。(部分実体を含まな いデ ータ実体は 、不可分と 呼ばれ る。)
{ 例外: 変数がNEW節に 現われ る場合 、DOループ の異な る繰返し でのその変数に 対 する代入は 互いに 干渉し ない 。この理由は 、第5.1.2項で説明され ている。
{ 例外: 変数がREDUCTION節に 現われ る場合 、DOループ の範囲内の集計文による代 入と 、同じ ループ 内の他の集計文による代入とは 互いに 干渉し ない。この理由は 、 第5.1.3項で 説明されている 。
実体への代入という操作は 以下のものを 含む。
{ 代入文は 、左辺と 、その全ての部分実体に 対し て 代入を行な う
{ ASSIGN文は 、その整数変数に 対し て 代入を行な う
{ STAT=指定子を 伴うALLOCATEとDEALLOCATE文は 、STAT変数への代入を 行な う
{ DO文は 、その インデ ックスへの代入を行な う
{ IOSTAT=指定子を伴う入出力文は 、IOSTAT変数への代入を 行な う。また 、以下で 述べるようにその他の実体への代入を行な う場合もあ る。
{ 非同期のREAD及びWRITE文は 、(第10章で述べられているように)そのID=変数 に 代入を行な う。
1
原文はredution-var 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
{ READ文は 、その入力変数並び の全ての変数と 、NAMELISTを通し て実行時に参照さ れ る全ての変数に対する代入を行な う。SIZE=指定子を伴うREAD文は 、そのSIZE
変数に 代入を行な う。
{ INQUIRE文は 、その指定子並び の全ての変数に対する代入を行な う。ただし 、UNIT
指定子及びFILE指定子は 除く。
{ 複合文(例えばIF文)は 、それを構成する文が 実体に 対する代入を行な う場合に 、 代入を 引き起こす。
{ 副プ ログ ラムの 実行は 、その副プ ログ ラムで 実体に 対する代入が 行なわれ る場合 に 、代入を 引き起こす。
不可分な実体に 代入を行な う演算は 、その実体の値を 使用する演算と 互いに 干渉する。
{ 例外: 変数がNEW節に 現われ る場合 、DOループ のあ る繰返し でのその変数に 対す る値の代入は 、他の繰返し におけ るその変数の使用とは 干渉し ない。この理由は 、 第5.1.2項で 説明されている 。
{ 例外: 変数がREDUCTION節に 現われ る場合 、DOループ の範囲内の集計文によるそ の 変数への代入は 、同じ ループ 内の 集計文で 許可され るその変数の使用とは 干渉 し ない 。この理由は 第5.1.3項で 説明され ている。
変 数の 値を 計算する式は 、そ の 実体を 使用す る 。これ に は 、代入文の 右辺で の 使用 、 代入文の左辺の添字での使用 、条件式 、入出力文の指定子並び 、WRITE文の出力並び 、
ALLOCATE文の割付け 形状指定子 、及び これに 類する状況での使用を含む。
【 仕様の根拠 】 これらは 、並列実行を 可能にするための古典的なBernsteinの条 件である。一つの変数への「 同じ 値」の2回の代入は 互いに干渉し 合い、し たがっ てそのよ うな代入文を 含むINDEPENDENTループ はHPF規格合致でないことに 注 意されたい。これが 許されない理由は 、一部のハード ウェアではそのような重複し た 代入をサポ ート するのが 困難であることと 、上記の定義のほ うが 、概念上 、よ り明確であ ると 感じ られ たことであ る。同様に 、同じ 位置への複数の値の代入を
INDEPENDENTとし て表明することは 、たとえ 論理的にそのプ ログ ラムが 任意の可 能な値を受け 入れ る場合でも 、HPF規格合致ではない。この場合 、論拠が「 概念 上 、より明確である 」という点でも 、非決定論的な動作を避けたいという点でも 、 上記の解決策が 選択され た 。【 以上 】
ALLOCATE文 、DEALLOCATE文 、NULLIFY 文 、及び ポ イン タ代入文は 、同じ ポ イン タに 対する他の参照 、ポ イン タ代入 、ALLOCATE、DEALLOCATE及びNULLIFYと干渉し あ う。
加えて 、ALLOCATE及びDEALLOCATE文は 、ALLOCATE及びDEALLOCATEされた実体に 対 する使用または 代入と干渉し 合う。
【 仕様の根拠 】 これらの条件は 、Bernsteinの条件をポ イン タに 対し て拡張し たも のである。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