第 6 章 外来プ ログラム単位
6.3.1.3 デ ータ
HPF種別を持つプ ログ ラム単位の任意の名前つき 共通ブ ロック(COMMON)は 、もし 存在すれ ば 、同じ 外来種別を持つ他の全てのプ ログラム単位の同じ 名前の共通ブ ロックと結合する。無 名共通ブ ロックも同様である。(このような共通ブ ロックの記憶領域は 該当の外来種別を持つ プ ログ ラムの中で 宣言され たデ ータ実体と 同じ 振る舞いをする。特に 、HPF LOCALなプ ログ ラムでは 、各プ ロセッサに 共通ブ ロックのコピ ーが 存在することにな るであろう。)
ど のような共通ブ ロック名も 、単一のプ ログ ラム中で異なるHPF種別を持つプ ログラム 単位内で使用されてはならない。同様に 、単一のプ ログラム中で異なるHPF種別を持つプ ロ グ ラム単位内で 、無名共通ブ ロックを使用することはできな い。
6.3.2 呼出し の効果
外来手続の呼出し は 、その引数を再マップし ない通常のHPF手続の呼出し と意味的に同じ で なければ ならない。従って 、外来手続の呼出し は 、以下のように 動作し たかの如くに(as if) 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
振る舞わなければ ならない。HPFの技術用語で如くに(as if)とは 、記述され た動作が 、あた かもそれが 指定され た順序で実際に 行なわれ たかのようにユーザには 見え る 、とい うことを 意味する。実装では 、ユーザに 正し い結果を提供するように 、任意の動作を任意の順序で行っ てか まわない 。
1.副プ ログ ラムの呼出し に 先行する呼出し 元の全ての動作は 、副プ ログ ラムの実行のいか なる動作よりも前に 完了し ていなければ ならない。また 、副プ ログ ラムの全ての動作は 、 呼出し 元の副プ ログ ラムの呼出し に 後続するいかな る動作よりも 前に 完了し ていなけれ ば ならない。
2.全ての実引数は 、必要ならば 、外来手続の引用仕様宣言の(明示的あるいは 暗黙の)指示 に従って再マップ され る。従って 、引用仕様に現れ るHPFのマッピング 指示は 拘束力が ある。コンパ イラは 、ローカル 外来手続の呼出し においてこれらの指示に 従わなければ ならない。非外来副プ ログ ラムの場合と 同様に 、実引数はど のように マップ されていて もか まわない 。もし 必要なら 、それらは 呼出し の前に 正し くマップ され た一時領域に 自 動的にコピ ーされ 、外来手続の戻りの 前に 実引数にコピ ーバ ックされ る。スカラ仮引数 やスカラ関数の戻り値は 、各プ ロセッサで複製され たかのよ うに振る舞う。これらのマッ ピングは 、引用仕様中に 明示され てもか まわないが 、それ 以外のいかな る明示的マッピ ング も 、HPF規格合致ではない。
3.IN、OUT、及び INOUTの授受特性の制約は 、守られなければ ならない。
4.HPF変数(HPF variable)は 、同じ 明示的引用仕様を持つHPF手続によって 更新され る ことはありうるが 、それ 以外は更新されない。HPF LOCALおよびHPF SERIAL手続はHPF
のグ ローバルデ ータを 参照することも更新することもできな いが 、他の種類の外来手続 はHPF手続と同程度にそれが 可能かもし れないことに 注意され たい 。
5.ある手続から 戻り、呼出し 元が 実行を 再開するとき 、呼出し の後に 呼出し 元が 使用でき る全ての実体は 呼出し 前の状態に 正確に マップ され ていなければ ならない 。特に 、必要 であれば 、引数のもとのマッピングは 復元され る。
6.副プ ログ ラムの呼出し の前後では 、HPFの実行環境から 見て厳密に 同じプ ロセッサ集合 にな る。
【 実装者への助言 】
呼出し よりも論理的に先行する動作の完了を保証するために 、複数のプ ロセッサが 呼出 し の前に 同期処理を 行う必要が あるかもしれない 。
呼び 出され た手続で使用可能な 変数のマッピングが 複製である場合 、全てのコピ ーは 、 呼出し に 先だって 、原始プ ログ ラムの逐次的な意味に従った正確な値に更新されなけれ ば ならないかもしれない。
複製され た変数が 、もし 手続の中で更新されているならば 、矛盾し ないように更新され なければ ならない。より正確には 、ある手続が 使用可能な変数のマッピングが 複製であ り、(一つのあるいは 複数の複製された)手続によって更新され た場合 、最後のプ ロセッ サが ローカル手続から 戻った時点でその複製された変数の全てのコピ ーは 同じ 値を持っ ていなければ ならない。
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
実装においては 、ローカルな副プ ログラムの戻りの前に 、複製された変数が 副プ ログラ ムによって矛盾なく更新されているか 判定するかも知れない。しかし 、実装でそれが 要 求されているわけではないことに 注意され たい。これは 単に 、例えば 実行性能とデバッ グ の容易性との兼ね 合いである。
グ ローバルHPFの副プ ログ ラムに おいては 、副プ ログ ラムからの戻り時にその効果が 取り消され る限り、実引数はど のように 複製あるいは 再マップ されてもよいことに 注意 されたい。
呼出し 元の処理が 再び 実行され るよりも前に 、手続の全ての動作の論理的な完了を保証 するために 、複数のプ ロセッサが 呼出し の後で同期処理を行わなければ ならないかもし れない 。
【 以上 】
6.4 外来手続の例
以下の例について 考え る。
PROGRAM DUMPLING
INTERFACE
EXTRINSIC(HPF,LOCAL) SUBROUTINE GNOCCHI(P, L, X)
INTERFACE
SUBROUTINE P(Q)
REAL Q
END SUBROUTINE P
EXTRINSIC(COBOL,LOCAL) SUBROUTINE L(R)
REAL R(:,:)
END SUBROUTINE L
END INTERFACE
REAL X(:)
END SUBROUTINE GNOCCHI
EXTRINSIC(HPF,LOCAL) SUBROUTINE POTSTICKER(Q)
REAL Q
END SUBROUTINE POTSTICKER
EXTRINSIC(COBOL,LOCAL) SUBROUTINE LEBERKNOEDEL(R)
REAL R(:,:)
END SUBROUTINE LEBERKNOEDEL
END INTERFACE
...
CALL GNOCCHI(POTSTICKER, LEBERKNOEDEL, (/ 1.2, 3.4, 5.6 /) )
...
END PROGRAM DUMPLING 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
主プ ログラムDUMPLINGは 、HPFコンパイラでコンパ イルされ るときは 、暗黙に外来種別
HPFに所属する。3つの外来サブルーチンGNOCCHI、POTSTICKER、およびLEBERKNOEDELの引 用仕様が 宣言されている。最初の2つは 外来種別HPF LOCALに所属し 、3番目はCOBOL LOCAL
に所属する。GNOCCHIは 、2つの仮手続を引数とすることができるので 、引用仕様はそのため の宣言をし なければ ならない。仮引数Pには 、外来プレ フ ィックスが 与えられていな いので 、 その 外来種別は 親有効域の外来種別になり、サブ ルーチンGNOCCHIの宣言から 、それは 外来 種別 HPF LOCALを持つことになる。結合する実引数の宣言から 、 POTSTICKERは明示的な外 来プレ フ ィックスを持つ必要がある。なぜならば 、その親有効域はプ ログ ラムDUMPLINGであ り、外来種別HPFに 属し ているからである。
もう少し 例を 挙げ る。最初の例では 、BAGELの100という明示的な 大きさの 宣言は 、そ のグ ローバルな大きさを表し 、ローカルな大きさではないことに 注意され たい 。
INTERFACE
EXTRINSIC(HPF,LOCAL) FUNCTION BAGEL(X)
REAL BAGEL(100)
REAL X(:)
!HPF$ DISTRIBUTE (CYCLIC) :: BAGEL, X
END FUNCTION
END INTERFACE
次の例では 、ALIGN文に より、X、Y、及びZが 全て 同じ 形状を 持っていることに 注意さ れたい。
INTERFACE OPERATOR (+)
EXTRINSIC(C,LOCAL) FUNCTION LATKES(X, Y) RESULT(Z)
REAL, DIMENSION(:,:), INTENT(IN) :: X
REAL, DIMENSION(:,:), INTENT(IN) :: Y
REAL, DIMENSION(SIZE(X,1), SIZE(X,2)) :: Z
!HPF$ ALIGN WITH X :: Y, Z
!HPF$ DISTRIBUTE (BLOCK, BLOCK) X
END FUNCTION
END INTERFACE
次の 最後の例での引用仕様宣言では 、2つの 外部手続は 、一方は 外来手続で 、も う一方 はそ うではないが 、同じ 総称名に 結合されており、その配列引数と 同じ 型の スカラを 戻す。
INTERFACE KNISH
FUNCTION RKNISH(X) !通常のHPFの引用仕様
REAL X(:), RKNISH
END RKNISH
EXTRINSIC(SISAL) FUNCTION CKNISH(X) !外来引用仕様
COMPLEX X(:), CKNISH
END CKNISH
END INTERFACE
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