READ(*,*) GRID(I)%SIZE
END DO
! それぞれの subgrid に 対する部分プ ロセッサを 計算し 、
! LO と HI の値を設定する。
CALL FIGURE_THE_PROCS ( GRID, number_of_proessors())
! それぞれの subgrid を 割り付け 、計算し た部分プ ロセッサに 対し て 分散する。
DO I = 1, SUBGRID_COUNT
ALLOCATE( GRID(I)%BL( GRID(I)%SIZE ) )
!HPF$ REDISTRIBUTE GRID(I)%BL(BLOCK) ONTO P( GRID(I)%LO : GRID(I)%HI )
END DO
【 仕様の根拠 】 構造型の成分は 、それがDYNAMIC属性だけでなくPOINTER属性ももっ ているときに 限って再マップ することができる。この制約は 、HPF指示文を 使って直 接に指定できないマッピングを禁止するために 置かれている。例えば 、以下のコード を 考えてみる。
!HPF$ PROCESSORS P(4)
TYPE DT
REAL C(100)
!HPF$ DISTRIBUTE C(BLOCK) ONTO P
!HPF$ DYNAMIC C ! 規格合致でない
END TYPE DT
TYPE (DT) :: S(10)
...
J = 3
...
!HPF$ REDISTRIBUTE S(J)%C(CYCLIC) ONTO P
... S(:)%C(2) ...
ここでは 、構造型DTの成分CはDYNAMICと 宣言されている。し たが って 、配列変数S
は10個の配列要素から 成り、それぞれ の配列要素は 最初はブ ロック分散され た成分C
をもつ構造体とな る。REDISTRIBUTE指示文により、Sの第J要素の構造体成分Cはサ イクリック分散にな るように 再マップ され る。ここで 、式S(:)%C(2)に よって 参照さ れ るデ ータ実体のマッピングに ついて 考えてみる 。これは 、配列変数Sを 構成する10
個の構造体のそれぞれから 、2番目の要素を取り出し たものである。Sの1要素(この場 合は3番目の要素)を再分散し ているため 、デ ータ実体の他のすべての要素はプ ロセッ サP(1)上に 存在するが 、第3要素だけはプ ロセッサP(2)に 存在する。このよ うな 分 散は 、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
48
Fortran規格では 、成分がPOINTER属性をもつ場合のこのような式を禁止し ている。す なわち、デ ータ参照中の部分名(part-name)がPOINTER属性をもつ場合、それよりも左 側の部分参照(part-ref)は スカラでなければ ならない(F95:6.1.2)。そこで 、我々は 以下 のような規約に よって上記のよ うな 状態を避け る。
POINTER属性をもたない構造体成分の再マッピングは 禁止する。
POINTER属性をもつ構造体成分について 、上記のような式を禁止するために 、F
or-tran規格の規約に 従う。
【 以上 】
8.10 新し い 分散形式
本章では 、二つの 新し い分散形式に ついて述べる。構文は 以下のように 拡張され る。
H810 extended-dist-format is BLOCK [ ( int-expr ) ℄
or CYCLIC [ ( int-expr ) ℄
or GEN BLOCK ( int-array )
or INDIRECT ( int-array )
or *
制約: DISTRIBUTE指示文またはREDISTRIBUTE指示文のextended-dist-formatの中に 現れ る 整数型配列(int-array)は 、整数型の一次元配列でなければ ならない。
制約: DISTRIBUTE指示文のextended-dist-formatの中に現れ る整数型配列(int-array)は 、制 限式(restrited-expr)でなければ ならない 。
制約: GEN BLOCK分散に 現れ る整数型配列(int-array)の大きさは 、分散先のプ ロセッサ構成 の対応する次元の寸法と等し くなければ ならない。
制約: INDIRECT分散に現れ る整数型配列(int-array)の大きさは 、その分散が 適用され る
dis-tributeeの対応する次元の寸法と等し くなければ ならない。
ブ ロック分散を「 一般化 」し たGEN BLOCKは 、配列を不均等な大きさの連続区間に 分け てプ ロセッサに マップ させる。各区間の大きさは 利用者定義の整数型のマッピング 配列の値 によって指定され る。つまり、マッピング 配列のi番目の要素は 、分散先プ ロセッサ構成のi
番目のプ ロセッサに 配置され るブ ロッ クの大きさを 指定する 。そのため 、マッピング 配列の 値は 負でない数に 制約され 、その総和は 分散配列の対応する次元の寸法と比較し て 等し いか 大きくなければ ならない。
マッピング 配列は 、DISTRIBUTE指示文で使用され る場合には 制限式でなければならない
が 、REDISTRIBUTE指示文では 配列変数であってもよい。後者の場合 、マッピング 配列の値が
指示文が 実行され た後で変化し ても 、分散配列のマッピングは 変化し ない 。
ここで 、lとuをそれぞれdistributeeのある次元の下限値と上限値 、MAPをマッピング 配列とし 、BS(i):BE(i)を分散先であるプ ロセッサ構成の対応する次元のi番目のプ ロセッサ
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
に マップ され る要素とする。すると 、次式が 成り立つ。
BS(1) = l;
BE(i) = min(BS(i)+MAP(i) 1;u);
BS(i) = BE(i 1)+1:
例:
PARAMETER (S = (/2,25,20,0,8,65/))
!HPF$ PROCESSORS P(6)
REAL A(100), B(200), new(6)
!HPF$ DISTRIBUTE A( GEN_BLOCK( S) ) ONTO P
!HPF$ DYNAMIC B
...
new = ...
!HPF$ REDISTRIBUTE B( GEN_BLOCK(new) )
上 記の 宣 言で 、配 列 要 素A(1:2)は P(1)に マップ され 、A(3:27)は P(2)に マップ され 、
A(28:47)はP(3)に マップ され 、P(4)にマップ され るものはなく、A(48:55)はP(5)にマッ プ され 、A(56:100)はP(6)に マップ され る。配列Bの分散は 、実行時に 値が 計算され る配 列newによって 決まる。
【 実装者への助言 】 一般化され たブ ロッ ク分散を 使った分散配列の要素のア クセスの ためには 、実行時に マッピング 配列の値をアクセスし なければならない。し かし 、マッ ピング 配列の 大きさはプ ロセッサ構成の大きさと 等し い(あ まり大きくない)ので 、ほ とんど の場合にはすべてのプ ロセッサに 複製し てし まえば よい 。
動的配列に 対し ては 、マッピング 配列のコピ ーをシ ステム内で個々に 管理し て 、マッピ ング 配列の値が 変化し ても分散配列のアクセスに影響を与えないようにし なければなら ない。【 以上 】
問題領域の構造がFortranのデ ータ構造に 直接対応付けできないよ うな 科学分野のアプ リケーションは数多くある。例えば 、多くのCFDアプ リケーションでは 、問題領域の表現に 構造化できない メッシュ(2次元での三角形 、3次元での四面体など)が 使用され る。このよう な メッシュの格子点は 一般に1次元配列で 表現され 、それら の相互の接続関係の表現に も1
次元配列が 使われ る。この配列のマッピングにBLOCKやCYCLICのよ うな 構造化され た分散 の機構を 用いると 、同じプ ロセッサ上に 無関係な 要素が マップ され る結果とな る。これは 言 い換え ると 、不必要な 通信を 大量に 発生させ ることにな る。必要なのは 、関係の深い配列要 素の集合を任意に 同じプ ロセッサ上に マップ させる機構である。INDIRECT分散は 、そのよう な機構を 提供する。
INDIRECT分散は 、デ ータ配列のある次元の要素から分散先プ ロセッサ構成のある次元へ
の多対一のマッピング を 可能に する 。分散する配列次元の個 々の要素と 分散先プ ロセッサの 対応を指定するために 、一つの整数型配列が 使用され る。すなわち、このマッピング 配列のi 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
番目の要素は 、i番目の配列要素が マップ され る先のプ ロセッサ番号を表し ている。マッピン グ 配列は 配列要素からプ ロセッサ要素へのマッピング を 示すので 、マッピング 配列の寸法は 分散され る配列のその次元の寸法と一致し なければ ならない。また 、マッピング 配列の値は 、 分散先となるプ ロセッサ構成の次元の下限値と 上限値の間になければ ならない 。
マッピング 配列は 、DISTRIBUTE指示文で使用され る場合には 制限式でなければならない
が 、REDISTRIBUTE指示文では 配列変数であってもよい。後者の場合 、マッピング 配列の値が
指示文が 実行され た後で変化し ても 、分散配列のマッピングは 変化し ない 。 例:
!HPF$ PROCESSORS P(4)
REAL A(100), B(50)
INTEGER map1(100), map2(50)
PARAMETER (map1 = (/1,3,4,3,3,2,1,4, ..../))
!HPF$ DYNAMIC B
!HPF$ DISTRIBUTE A( INDIRECT(map1) ) ONTO P
!HPF$ DISTRIBUTE map2(BLOCK) ONTO P
map2 = ...
!HPF$ REDISTRIBUTE B( INDIRECT(map2) ) ONTO P
....
ここで 、配列Aは 定数配列map1を使って静的に 分散されている。し たがって 、以下のよ うになる。
A(1)はP(1)へマップ され る
A(2)はP(3)へ
A(3)はP(4)へ
A(4)はP(3)へ
A(5)はP(3)へ
A(6)はP(2)へ
A(7)はP(1)へ
A(5)はP(4)へ
…
配列Bは 動的であると 宣言され 、マッピング 配列map2を 使って再分散され ている。
【 実装者への助言 】 一般に 、INDIRECT分散は 、マッピング 配列となる配列変数をもっ
たREDISTRIBUTE指示文の形で使用され ることになるだろう。また 、マッピング 配列の
大きさは 分散され る配列の大きさと同じ なので 、それ 自身もほとんど の場合BLOCK分散 など で分散され るだろう。これには 、いくつかの問題点がある。この分散を正し く実装 するためには 、実行時システムはマッピング 配列の(分散された)コピ ーを管理し て 、プ ログ ラムが マッピング 配列を変更し ても分散が 変化し ないよ うにし なければ ならない。
マッピング 配列とし て配列変数を使用することは 、配列のそれぞれの要素の配置が 実行 時まで分からないということを意味する。し たが って 、指定された配列要素の配置を計 算するために 、通信が 必要とな るであろう。【 以上 】
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
8.11 RANGE指示文
RANGE属性は 、DYNAMIC属性または 転写的な分散形式をもつデ ータ実体(ポ イン タを 含む)と テンプレ ートについて 、あり得る分散形式を限定するために 使用され る。
H811 range-diretive is RANGE ranger range-attr-stuff
H812 ranger is objet-name
or template-name
H813 range-attr-stuff is range-distribution-list
H814 range-distribution is ( range-attr-list )
H815 range-attr is range-dist-format
or ALL
H816 range-dist-format is BLOCK [ ( ) ℄
or CYCLIC [ ( ) ℄
or GEN BLOCK
or INDIRECT
or *
制約: 少な くとも以下のいずれかが 成り立たなければ ならない 。
rangerはDYNAMIC属性をもつ 。
rangerはINHERIT属性をもつ 。
rangerはDISTRIBUTE指示文かombined-diretiveで指定され 、その dist-format-lauseは*である。
制約: range-attr-listの長さはそれぞれ 、rangerの次元数と等し くなければ ならない 。 制約: rangerはALIGN指示文またはREALIGN指示文のaligneeであってはならない 。
range-attr-listの長さは それぞれrangerの次元数と 等し いので 、range-distribution中の
range-attr (Rとする)はrangerの次元(Dとする)にそれぞれ 順番に 対応する。つまり、次元
Dはrangerが 最終的に 整列するテンプレ ート の座標軸Aに 対応するか(この場合順番が 対応 するとは 限らない)、あるいは 、テンプレ ート のど の座標軸とも対応し ない。
この記法を使って 、rangerに 対するRANGE属性の意味を 表現すると 以下のようになる: range-distribution-list 中 の 少な くと も 一 つ の range-distribution に つ い て 、す べ て の
range-attr Rは 以下のど ちらかである。
対応する座標軸Aが 存在する場合 、その 座標軸の分散形式と適合し ている 。
対応する座標軸が 存在し ない場合 、*またはALLである。
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
こ の 適 合 性 は 、ranger が distributee と し て 現 れ るど ん な DISTRIBUTE 指 示 文 や
REDISTRIBUTE指 示文に 対し て も 維持され なければ なら な い 。また 、rangerがPOINTER属 性をもっていて 転写的に 分散され ている場合 、rangerが 結合され るすべての指示先に 対し て も 、この適合性が 維持され なければ ならない。
ここで言う適合とは 、分散形式に よって以下のように 規約され る。
1.BLOCKは 、range-dist-formatの中のBLOCK、BLOCK()またはCYCLIC()と適合する。
2.BLOCK(n)は 、range-dist-formatのBLOCK()またはCYCLIC()と適合する。
3.CYCLICは 、range-dist-formatのCYCLICまたはCYCLIC()と適合する。
4.CYCLIC(n)は 、range-dist-formatのCYCLIC()と適合する。
5.GENBLOCK(a)は 、range-dist-formatのGEN BLOCKと 適合する。
6.INDIRECT(a)は 、range-dist-formatのINDIRECTと 適合する。
7.*は 、range-dist-formatの*と 適合する。
すべての分散形式は 、range-dist-formatのALLと 適合する。
ombined-diretiveについての構文規則H301により、以下の形式のRANGE指示文も許さ れ ることに 注意され たい。
!HPF$ RANGE range-attr-stuff-list :: ranger-list
これは 、構文規則H801に よって定義され るombined-attribute-extendedを用いて いる。
例:
!HPF$ DISTRIBUTE T(BLOCK)
!HPF$ ALIGN A(I,J) WITH T(I)
CALL SUB(A)
....
SUBROUTINE SUB(X)
!HPF$ INHERIT X
!HPF$ RANGE X (BLOCK, *), (CYCLIC, *)
Xの最終整列先(この場合は 継承されたテンプレ ートT)は2次元目をもたないので 、Xの
range-distributionの2次元目には*かALLだけを 使うことができる。
REAL A(100, 100, 100)
!HPF$ DISTRIBUTE A(BLOCK, *, CYCLIC)
CALL SUB( A(:,:,1) ) ! 規格合致である
CALL SUB( A(:,1,:) ) ! 規格合致でない
CALL SUB( A(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