シ ス テ ム 問 合 せ 関 数が 問 い 合わ せ るのは 物 理 的な 計 算 機に 関し て で あ り、いか な る
PROCESSORS指示 文と も 無 関係で あ ることに 注意され た い 。HPFプ ログ ラ ムが より 大きな 計算機の物理的な一部分で実行されている場合には 、問合せが行われ るのは実際にプ ログラム を実行し ている小さな 部分に 関し てであり、その諸元がシ ステム問合せ関数により返され る。
関数PROCESSORS SHAPEの値とし て 返すべき「 自然な 」形状を 持たな い計算機もあ る。
たとえば 、木構造のトポ ロジを 持つ計算機など である。このような 場合は 、たとえば 大きさ がNUMBER OF PROCESSORS()の1次元配列など 、ある程度の合理性と 一貫性を 持った計算機 構成を与えるように実装されなければ ならない。言語処理系は 、この構成と実際のハード ウェ ア・プ ロセッサ識別方法との間の対応付けを行な う必要がある。
【 利用者への助言 】SIZE(PROCESSORSSHAPE())は 、プ ロセッサ配列の次元数を返す。
配列の宣言やHPF指示文中で 、シ ステム問合せ関数を以下のよ うに 引用することがで きる。
INTEGER, DIMENSION(SIZE(PROCESSORS_SHAPE())) :: PSHAPE
!HPF$ TEMPLATE T(100, 3*NUMBER_OF_PROCESSORS())
【 以上 】
7.3 計算組込み関数
HPFには 新たに 計算組込み関数が1つ追加され た 。ILENは 、整数値を 格納するのに 必要な ビ ット 数を計算する。
7.4 ラ イブ ラリ手続
本 章で 述べ る マッピ ン グ 問 合せ サブ ル ー チン と 計 算 関 数は 、HPFラ イブ ラ リモジュール
HPF LIBRARYの 中に 用意され て いる 。これ ら の 手 続を 引用する 際は 、各 有効域に おいて 適 宜USE文を 指定し なければ ならない 。これらは 組込みではない。
7.4.1 マッピ ング 問合せサブ ルーチン
HPFはデ ータマッピ ング 指示文を 提供するが 、それは 本質的には 言語処理系に 対する助言 に すぎ ない。マッピング 問合せサブ ルーチンに より、プ ログ ラムは 実行時に 、配列が 実際に ど の よ うに マッピ ング され て いるかを 知ることが でき る。正確な マッピング を 知ることは 、
EXTRINSIC副プ ログ ラムを 呼び 出すときに 特に 重要である。このような理由から 、配列の計
算機上での実際の マッピング を 記述するマッピング 問合せサブ ル ーチンがHPFに 含められ た 。手続の数を 抑え るため 、問合せ手続は 省略可能なINTENT (OUT)引数を 持つサブ ルーチ ンとし て 構成され ている。
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
7.4.2 ビ ット 操作関数
HPFラ イブ ラ リには 、3つの要素別処理ビ ット 操作関数が 含まれ る。LEADZは 、整数表現の 先頭にある0であるビ ット の数を計算する。POPCNTは 、整数中の1であるビ ット の数を数え る。POPPARは 、整数中の1であるビ ット の奇偶を計算する。
7.4.3 配列集計関数
HPFにはFortranのSUM、ANYなど の組込み関数と 同様の演算を行う配列集計関数が 追加さ れた 。新し い集計関数は 、IALL、IANY、IPARITY及びPARITYであり、それぞれ 交換則と結 合則を満たす2進演算IAND、IOR、IEOR、及び.NEQV.に 対応する。
関数の仕様の記述で「XXX集計 」という用語が 使われているが 、XXXは 上述の2進演算の うちの1つであるものとする。例示によってこれらを定義する。arrayの全要素のうちmask
の対応する要素が 真であるもののIAND集計は 、以下のプ ログ ラムでresultに 計算され る整 数型スカラと する。
result = IAND_IDENTITY_ELEMENT
DO i_1 = LBOUND(array,1), UBOUND(array,1)
...
DO i_n = LBOUND(array,n), UBOUND(array,n)
IF ( mask(i_1,i_2,...,i_n) ) &
result = IAND( result, array(i_1,i_2,...,i_n) )
END DO
...
END DO
ここでnはarrayの次元数とし 、IANDIDENTITY ELEMENTは 全ビ ットが1である整数とする
(整数のビ ット 列とし ての解釈は 、F95:13.5.7で与えられ る)。ほかの3つの集計演算も同様に 定義され る。IORとIEORの単位元は0である。.NEQV.の単位元は.FALSE.である。
7.4.4 配列集計拡散関数
XXX SCATTER関数は 、配列集計関数を 一般化し たもので 、要素の任意の部分集合を集計し て
結果の要素を構成することができる。このとき 、結果の各要素に 対応する配列の部分集合は 、 重複部分を持たない。HPFに11ある集計演算は 、各々集計拡散関数の1つに 対応し ており、
それ とは 別にCOPY SCATTERに よって 、既存の値を 対応する部分集合中の任意の1つの 値で 上書きすることもできる。元の配列のど の要素が 結果のど の要素と 対応するかは 、本節で 述 べる 。それらの値を集計する方法は 、7.7節の各関数の仕様中で 述べる。
これらの関数は 以下のような一般形を 持つ。
XXX_SCATTER(ARRAY, BASE, INDX1, ..., INDXn, MASK)
ただし 、あとで 述べるよ うな 特殊な 場合を 除く。XXXの値とし て 許され るのは 、ALL、ANY、
COPY、COUNT、IALL、IANY、IPARITY、MAXVAL、MINVAL、PARITY、PRODUCT、及びSUMであ る 。配列ARRAY、MASK、及び すべてのINDXは 、形状適合するものと する 。配列INDXは 整
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
数型で あ り、引数INDXの 数は BASEの 次元数と 同じ でなければ なら な い 。引数MASKは 論 理型の引数で 、省略可能とする 。COUNT SCATTERを 除き 、ARRAYとBASEは 同じ 型の配列と する 。COUNT SCATTERに ついては 、ARRAYが 論理型 、BASEが 整数型と する(ALL SCATTER、
ANY SCATTER、COUNT SCATTER、及び PARITYSCATTERの 引数ARRAYは 、論理型でなければ ならない。これらの関数は 、省略可能な引数MASKを 持たない。Fortran規格書にならい 、こ れら の関数に 対する引数ARRAYは 、7.7節の仕様の 中ではMASKと 記述し ている)。ど の場合 も 、結果の配列はBASEと同じ 型 、種別型パラ メタ、及び 形状を持つ。
配列INDXはARRAYと同じ 形状なので 、ARRAYのあらゆる要素aに 対し て 、INDXにはそ れぞれ 対応する要素が 存在する。nをBASEの次元数とするとき 、各j=1;2;:::;nに対し て 、
s
j
をARRAYの要素aに 対応するINDXjの要素の値とする。これらの添字により、ARRAYの要 素aに影響を受け る結果の要素が 決定する。すなわち、添字s
j
のそれぞれに対し て 、BASEの 対応する添字は 、b
j
=s
j
+LBOUND(BASE, j) - 1に よって与えられ る。
整 数 b j
; j = 1;:::;n は 、BASE の 要 素 を 選 択 す る 添 字 と な る 。す な わ ち
BASE(b
1
;b
2
;:::;b
n
) が 選 択 され る 。BASEと 結 果 と は 形 状 適 合 す る か ら 、BASE の 各 要 素 に 対し て 、対応する結果の要素が 存在する。
し たが って配列INDXは 、ARRAYのすべての要素から 、結果とBASEの選択され た要素へ の写像を定める。見方を変えると 、この写像は 、BASEの各要素bとARRAYの要素の集合Sと を対応づけている。
Sが 空のとき 、BASEの要素bに 対応する結果の要素は 、bと同じ 値を 持つ。
Sが空でないとき、Sの要素は要素bとともに集計されて、結果の要素を構成する。集計拡散 関数の詳細な仕様に 、値を集計する方法が述べられている。例えばSUM SCATTERにおいて 、Sの 要素がa
1
;:::;a
m
のとき 、BASEの要素bに対応する結果の要素は 、SUM((/a 1
;a
2
;:::;a
m
;b/))
を評価し た結果となる。
配列INDXの要素の値は 非負でなければ ならず、INDXjの要素の値はSIZE(BASE, j)以 下でなければ ならない。計算結果は 、BASEの上下限の宣言の影響を受けず、BASEの形状だけ に 依存する。
スカラは 任意の配列と形状適合するから 、配列INDXの位置に 使用できる。このとき 、選 択され る結果の要素は 、1つの 超平面をなす。以下の例を 参照され たい 。
省略可能な 最後の引数MASKが 指定され たとき 、ARRAYの要素の うち 、MASKが 真である ような位置のものだけが 演算に 加わる。他のすべてのARRAYと 配列INDXの要素は 無視され 、 結果のど の要素にも影響を 与えない 。
例えば 、
配列Aが
2
6
4
1 2 3
4 5 6
7 8 9 3
7
5 、配列Bが
2
6
4
-1 -2 -3
-4 -5 -6
-7 -8 -9 3
7
5 、
配列I1が
2
6
4
1 1 1
2 1 1
3 2 1 3
7
5 、配列I2が
2
6
4
1 2 3
1 1 2
1 1 1 3
7
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
SUM SCATTER(A, B, I1, I2)は 、
6
4
14 6 0
8 -5 -6
0 -8 -9 7
5 、
SUM SCATTER(A, B, 2, I2)は 、
2
6
4
-1 -2 -3
30 3 -3
-7 -8 -9 3
7
5 、
SUM SCATTER(A, B, I1, 2)は 、
2
6
4
-1 24 -3
-4 7 -6
-7 -1 -9 3
7
5 、
SUM SCATTER(A, B, 2, 2)は 、
2
6
4
-1 -2 -3
-4 40 -6
-7 -8 -9 3
7
5
にな る。
配列Aが
h
10 20 30 40 -10 i
、Bが
h
1 2 3 4 i
、INDが
h
3 2 2 1 1 i
のとき 、SUM SCATTER(A, B, IND, MASK=(A .GT. 0))は 、
h
41 52 13 4 i
とな る。
7.4.5 配列累計関数
ベクトルの累計では 、結果の各要素は 、先行するベ クトル要素の関数(順累計のとき)である か 、または 後続するベクトル 要素の関数(逆累計のとき)である。これらの関数に より、配列 及び 部分配列上の累計演算が 提供され る。関数は 以下のような一般形を持つ。
XXX_PREFIX(ARRAY, DIM, MASK, SEGMENT, EXCLUSIVE)
XXX_SUFFIX(ARRAY, DIM, MASK, SEGMENT, EXCLUSIVE)
ただし 、あとで 述べるよ うな 特殊な 場合を 除く。XXXの値とし て 許され るのは 、ALL、ANY、
COPY、COUNT、IALL、IANY、IPARITY、MAXVAL、MINVAL、PARITY、PRODUCT、及びSUMである。
順方向型(prex)と逆方向型(suÆx)の双方の手続に 当てはまるとき 、以下ではそれらを
関数YYYFIXと 呼ぶ 。
引数DIM、MASK、SEGMENT、及びEXCLUSIVEは 省略可能である。関数COPY YYYFIXは 、 引数MASKやEXCLUSIVEを 持たな い 。また 関数ALL YYYFIX、ANY YYYFIX、COUNT YYYFIX、 及びPARITY YYYFIXは 、引数MASKを持たない。これらの関数に 対する引数ARRAYは 論理型 でなければ ならず 、7.7節の仕様の中ではMASKと記述し ている。
引数MASK及びSEGMENTは 論理型でなければ ならない。SEGMENTの形状はARRAYと同じ でなければならない。MASKはARRAYと形状適合し なければ ならない。EXCLUSIVEは 論理型ス カラとする 。DIMは 整数型スカラであって 、1からARRAYの次元数までの範囲の 値であるも のする。
結果の値. 結果は 、ARRAYと同じ 形状とする。またCOUNT YYYFIXを除き 、ARRAYと同 じ 型及び 種別型パラ メタを 持つ(COUNT YYYFIXの結果は 、基本整数型とする)。 ど の関数も 、仕様に 記載され た関数ご とに 決まったやり方で選ばれ るARRAYの要素の
値に よって 、結果のすべての要素が 決まる。省略可能な 引数は 、結果の各要素に 対す
るARRAYの要素の選択方法に 影響を与える。ここで選ばれたARRAYの要素は 、結果の
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
要素に 寄与する 、と 呼ばれ る。ある結果の要素に 対し てARRAYのど の要素が 寄与する のか 、本節で 完全に 述べる。
ある結果の要素に 対し てARRAYの要素が 一つも 選択されないとき 、その結果の要素に は 仕様に 記載され た関数ご とに 決まった既定値が 設定され る。
ある結果の要素rに 対し て 、ARRAYの対応する要素をaとする 。以下の規則のいずれ かに より無効とされないすべてのARRAYの要素がrに 寄与する。
1.関数がXXX PREFIXであるとき 、配列要素順序でaより後のど のARRAYの要素も
rには寄与し ない。関数がXXX SUFFIXであるとき 、配列要素順序でaより前のど のARRAYの要素もrには 寄与し ない。
2.引数DIMが 指定され たとき 、第DIM次元の添字を 除く、少なくとも1つの添字が 対応するaの添字と異なるならば 、ARRAYの要素zはrに寄与し ない(DIMが 省略 され たとき 、ARRAY、MASK、及びSEGMENTは 、一時的に1次元配列と見なされ る かのように 、配列要素順序で 処理され る。DIMが 指定され たときは 、完全に 独立 な一群の累計演算がARRAYの選ばれた次元に 沿って 実行され る)。
3.引数MASKが 指定され たとき 、ARRAYの要素zは 、MASKの対応する要素が 真のと きだけrに 寄与する(MASKが 偽の位置に 対応する配列要素は 、結果には まったく 寄与し ない。し かし 、それでも結果は 、MASKが 偽であるような位置も含め 、すべ ての位置で定義され る)。
4.引数SEGMENTが 指定されたとき 、ARRAYの要素zは 、以下の性質をすべて満たす
ARRAYの要素w (z自身のこともある)が 存在するならば 、寄与し ない 。
(a)関数がXXXPREFIXのとき 、wが 配列要素順序でzより前にはないが 、aよりは 前にある。または 関数がXXX SUFFIXのとき 、wが 配列要素順序でzより 後に はないが 、aよりは 後にある。
(b)引数DIMが 指定されたとき 、第DIM次元の添字を 除くwのすべての添字が 、a
の対応する添字と 同じ である。
()wに 対応するSEGMENTの要素は 、aに 対応するSEGMENTの要素と異なる値を持 つ(言い換えれば 、zが 寄与するのは 、zからaまでの列に 対応するSEGMENTの 要素に 同じ 値が 並んでいるときだけである)。
5.引数EXCLUSIVEが 指定されていて 、真であるとき 、a自身はrに 寄与し ない。
これらの一般則から 、以下のような重要な 場合が 導かれ る。
場合 (i): ARRAYが1次元配列のとき 、XXX PREFIX(ARRAY)の結果の要素iは 、ARRAY
の 最 初のi 個の 要 素で 決 ま る 。また XXX SUFFIX(ARRAY)の 結 果の 要 素
SIZE(ARRAY) i+1は 、ARRAYの最後のi個の要素で決まる。
場合 (ii): ARRAYが2次元以上の 配列のとき 、XXX PREFIX(ARRAY)の 結果の各 要素 の値は 、ARRAYの対応する要素aと 、配列要素順序でaより前のすべての
ARRAYの要素で決まる。XXXSUFFIXについては 、ARRAYの対応する要素a
と 、配列要素順序でaより後のARRAYの要素で決まる。
場合 (iii): XXX PREFIX(ARRAY,MASK=MASK)の結果の各要素の値は 、ARRAYの 対応す る要素aと 、配列要素順序でaより前のすべてのARRAYの要素で決まるが 、 このときMASKの対応する要素が 真のものだけが 結果に 寄与する 。この制
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