http://www.xcalablemp.org/

XcalableMPの仕様について
2013/11/01
富士通
岩下 英俊
1

Copyright © 2013 PCCC & Fujitu Labs. Ltd.

XMPプログラムの例（at a glance）
FortranまたはCがベース。指示文（ディレクティブ）拡張
ディレクティブだから、逐次プログラムから徐々に並列化できる。
#pragma xmp nodes p(4)#pragma xmp template t(YMAX)#pragma xmp distribute t(block) on p

module defs!$xmp nodes p(4)!$xmp template t(YMAX)!$xmp distribute t(block) on p

int a[YMAX][XMAX];#pragma xmp align a[j][*] with t(j+1)

ineger a(XMAX, YMAX)!$xmp align a(*, j) with t(j)end modulemain() {int i, j, res;
res = 0;use defs
integer i, j, res
res = 0#pragma xmp loop on t(j+1)
for (j = 0; j < YMAX; j++) {for (i = 0; i < XMAX; i++) {a[j][i] = foo(i, j);
res += a[j][i];}}!$xmp loop on t(j)do j = 1. YMAX
do i = 1, XMAX
a(i, j) = foo(i, j)
res = res + a(i, j)
end doend do#pragma xmp reduction(+: res)...

!$xmp reduction(+: res)...
2013/11/01

2Copyright © 2013 PCCC & Fujitu Labs. Ltd.

内容XcalableMP（XMP）
ハードウェアモデル
実行モデル
言語仕様の体系

主な仕様のご紹介、例を交えて
1.
2.
3.
4.

テンプレートの分散
データのマッピング
計算のマッピング
通信・同期

まとめ

2013/11/01

3

Copyright © 2013 PCCC & Fujitu Labs. Ltd.

XMPのハードウェアモデル
複数の“ノード”が、ネットワークで結合されたもの
networkmemorymemorymemoryprocessor

processor

processor

node 1

node 2

XMP並列プログラミングは、
1. データをノードにマッピング
2. 計算をノードにマッピング
3. ノード間通信を指示の３つ

node N

マルチコア、アクセラレータとのハイブリッド並列も視野にOpenMPとの混在が可能
GPUとの連携も検討中

2013/11/01

4

Copyright © 2013 PCCC & Fujitu Labs. Ltd.

XcalableMPの実行モデル
基本的には、SPMD実行モデル“冗長実行部”では各ノードが独立に実行。
HPFと違い、“ローカル変数”が存在する。
並列実行の指示があれば、並列実行を行う。

node1 node2 node3 node4

冗長実行（同じ実行）
並列実行の指示

並列実行（処理の分担）

LOOP指示構文 ・・・ループ並列
ARRAY指示構文 ・・・配列代入文の並列実行
TASK指示構文 ・・・タスク並列

冗長実行（同じ実行）
通信の指示

通信／同期の指示があれば、それを実行する。
多くの場合、集団実行

多くの場合、集団（collective）実行
冗長実行（同じ実行）

2013/11/01

5Copyright © 2013 PCCC & Fujitu Labs. Ltd.

冗長実行と並列実行
TASKS/TASK指示構文、LOOP指示構文
Nodes p(1) p(2) p(3) p(4) p(5) p(6) p(7) p(8)execution

A!$xmp nodes p(8)!$xmp template t(n)!$xmp distribute t(block) onto p
8ノード
ノードでノードで冗長実行!$xmp tasks!$xmp task on p(1:4)
B

CB

4ノードでノードで冗長実行!$xmp end task!$xmp end tasks
D!$xmp task on p(5:8)
4ノードでノードでC 冗長実行!$xmp end task

8ノード
ノードでノードで冗長実行!$xmp loop on t(1:n)
do i=1,nE1 E2 E3 E4 E5 E6 E7 E8

E1 ～ E88ノードにノードに計算負荷分散

end doF
2013/11/01

8ノード
ノードでノードで冗長実行
6

Copyright © 2013 PCCC & Fujitu Labs. Ltd.

XMP V1.1仕様の体系
グローバルビュー関連

ローカルビュー関連

テンプレートの分散言語拡張（F,Cとも）NODES指示文
TEMPLATE指示文
DISTRIBUTE指示文
TEMPLATE_FIX指示文

Coarray記法

Coarray関連の指示文／組込み
COARRAY指示文
IMAGE指示文
LOCAL_ALIAS指示文（F）
POST/WAIT指示文
LOCK/UNLOCK指示文（C）
Image Index変換組込み手続

データマッピング
ALIGN指示文
SHADOW指示文

計算マッピング

XMP/C言語拡張

LOOP指示構文
ARRAY指示構文
TASKS/TASK指示構文

部分配列，配列式，配列代入
記述子問合せ xmp_desc_of

通信と同期

組込み／ライブラリ手続

REFLECT指示文
GMOVE指示構文
BARRIER指示文
REDUCTION指示文
BCAST指示文
2013/11/01

問合せ関数
xmp_node_num, xmp_num_nodes等
xmp_dist_blocksize等

付録
7

Copyright © 2013 PCCC & Fujitu Labs. Ltd.

NODES宣言指示文
ノード配列の宣言
仮想的に配列状に構成される。ノード数は実行時に決めることもできる。
!$xmp nodes P( <整数式> , ... )*= *= <ノード参照>

左辺Pの添え字の * は、ノード数を実行時に決める。最終次元のみ出現可。
右辺が * のとき、Pは全実行ノードであることを意味する。
右辺が <ノード参照> のとき、Pは右辺の全ノードの別名として宣言される。

例
P(6)!$xmp nodes P(6)!$xmp nodes Q(2,2)=P

2013/11/01

Q(2,2)

8a b c d e fa cb dCopyright © 2013 PCCC & Fujitu Labs. Ltd.

TEMPLATE／DISTRIBUTE宣言指示文
テンプレートの形状を宣言する。
!$xmp template T ( <整数式><整数式> : <整数式>：, ... ) , ...

テンプレートをノード配列に分散する。
!$xmp distribute T(<分散種別>, ...) onto P<分散種別> は， 分散する次元は、block, cyclicなど指定分散しない次元は *【例】!$xmp nodes P(4)!$xmp template T1(N1),T2(N2)!$xmp distribute T1(block) onto P!$xmp distribute T2(block) onto P

T1(N1)

T2(N2)

P(4)2013/11/01

9

Copyright © 2013 PCCC & Fujitu Labs. Ltd.

テンプレートとは？
テンプレートは、分散を表現するための、実体のない仮想的な配列
変数は、テンプレートを仲介としてノードにマッピング
ループの反復も、テンプレートを介してノードにマッピング

テンプレートの形状・分散は、プログラム全体の並列化のスキーム
variable
A1

variable
A2

大域的な宣言variable
A3

loop
L1

align
A2(i) with T1(i) loop
alignon T1(i)A1(i) with T1(i)

loop
L2

align
A3(i) with T2(i)loop
on T2(i)template
T1(N1)

template
T2(N2)

distributeT1(block) onto P

distributeT2(block) onto P

loop
L3
loop
on T2(i)

nodes
P(4)
2013/11/01

10

Copyright © 2013 PCCC & Fujitu Labs. Ltd.

XMP V1.1仕様の体系
グローバルビュー関連

ローカルビュー関連

テンプレートの分散言語拡張（F,Cとも）NODES指示文
TEMPLATE指示文
DISTRIBUTE指示文
TEMPLATE_FIX指示文

Coarray記法

Coarray関連の指示文／組込み
COARRAY指示文
IMAGE指示文
LOCAL_ALIAS指示文（F）
POST/WAIT指示文
LOCK/UNLOCK指示文（C）
Image Index変換組込み手続

データマッピング
ALIGN指示文
SHADOW指示文

計算マッピング

XMP/C言語拡張

LOOP指示構文
ARRAY指示構文
TASKS/TASK指示構文

部分配列，配列式，配列代入
記述子問合せ xmp_desc_of

通信と同期

組込み／ライブラリ手続

REFLECT指示文
GMOVE指示構文
BARRIER指示文
REDUCTION指示文
BCAST指示文
2013/11/01

問合せ関数
xmp_node_num, xmp_num_nodes等
xmp_dist_blocksize等

付録
11Copyright © 2013 PCCC & Fujitu Labs. Ltd.

ALIGN宣言指示文
配列変数をテンプレートに整列させる。
!$xmp align A ( <変数名> , ... ) T ( <変数名> [ { + | - } <整数式
整数式>
整数式 ] , ... )**：：B(N1,N2)【例】!$xmp nodes P(4)!$xmp template T1(N1),T2(N2)!$xmp distribute T1(block) onto P!$xmp distribute T2(block) onto P

A(N1,N2)

T1(N1)

T2(N2)

real A(N1,N2), B(N1,N2)!$xmp align A(i,*) with T1(i)!$xmp align B(*,j) with T2(j)P(4)
2013/11/01

12

Copyright © 2013 PCCC & Fujitu Labs. Ltd.

LOOP実行指示文
DOループ、forループのiterationをテンプレートに整列させる。
単一ループに対する指示!$xmp loop on T ( <変数名> [ { + | - } <整数式> ] ) [ <reduction節> ]*：do i = ...
...
end do

多重ループに対する指示!$xmp loop (<i1>, ... ,<in>) on T ( <変数名> [ {+|-} <整数式> ] , ...) [<reduction節>]*：
do <i1> = ...
...
do <in> = ...
...
end do...
end do2013/11/01

13

Copyright © 2013 PCCC & Fujitu Labs. Ltd.

XMPプログラムの例（再掲）
ノードとテンプレートは、大域的に宣言するのがよい。
共通のテンプレートに対して、データと計算をマッピングしていく。
module defs!$xmp nodes p(4)!$xmp template t(YMAX)!$xmp distribute t(block) on p
ineger a(XMAX, YMAX)!$xmp align a(*, j) with t(j)end moduleuse defs
integer i, j, res
res = 0!$xmp loop on t(j)do j = 1. YMAX
do i = 1, XMAXa(i, j) = foo(i, j)
res = res + a(i, j)
end doend do#pragma xmp nodes p(4)#pragma xmp template t(YMAX)#pragma xmp distribute t(block) on p

テンプレートの分散

int a[YMAX][XMAX];#pragma xmp align a[j][*] with t(j+1)

データ
マッピング

main() {int i, j, res;
res = 0;#pragma xmp loop on t(j+1)
for (j = 0; j < YMAX; j++) {for (i = 0; i < XMAX; i++) {a[j][i] = foo(i, j);
res += a[j][i];}
}

計算
マッピング

#pragma xmp reduction(+: res)
...

通信・同期

!$xmp reduction(+: res)...
2013/11/01

14Copyright © 2013 PCCC & Fujitu Labs. Ltd.

整列（alignment）による通信の削減・削除
データのALIGN指示と、データが出現するループのLOOP指示で、alignmentを合わせ、通信が起こらないようにする。
!$xmp nodes p(2)!$xmp template t(11)!$xmp distribute t(block) onto pt

1 2 3 4 5 6 7 8 9 10 11

real a(10),b(10),c(10)!$xmp align a(i) with t(i)!$xmp align b(i) with t(i+1)

a1 2 3 4 5 6 7 8 9 10!$xmp loop on t(i)do i=2,10a(i)=a(i)+1.0b(i-1)=a(i)end dodo ib

1 2 3 4 5 6 7 8 9 10

2 3 4 5 6 7 8 9 10

整列していれば通信は発生しない。

分散種別（block, cyclic, ...）には依存しない！
2013/11/01

15

Copyright © 2013 PCCC & Fujitu Labs. Ltd.

XMP V1.1仕様の体系
グローバルビュー関連

ローカルビュー関連

テンプレートの分散言語拡張（F,Cとも）NODES指示文
TEMPLATE指示文
DISTRIBUTE指示文
TEMPLATE_FIX指示文

Coarray記法

Coarray関連の指示文／組込み
COARRAY指示文
IMAGE指示文
LOCAL_ALIAS指示文（F）
POST/WAIT指示文
LOCK/UNLOCK指示文（C）
Image Index変換組込み手続

データマッピング
ALIGN指示文
SHADOW指示文

計算マッピング

XMP/C言語拡張

LOOP指示構文
ARRAY指示構文
TASKS/TASK指示構文

部分配列，配列式，配列代入
記述子問合せ xmp_desc_of

通信と同期

組込み／ライブラリ手続

REFLECT指示文
GMOVE指示構文
BARRIER指示文
REDUCTION指示文
BCAST指示文
2013/11/01

問合せ関数
xmp_node_num, xmp_num_nodes等
xmp_dist_blocksize等

付録
16Copyright © 2013 PCCC & Fujitu Labs. Ltd.

SHADOW宣言指示文
block分散または不均等block分散で、分割範囲に「袖」を加える。
通常の分割範囲に加えて、袖の領域までローカルにアクセスできる。
隣接ノードとの値の一貫性は、利用者の責任。

!$xmp shadow A ( <整数式><整数式> : <整数式>：!$xmp nodes p(3)!$xmp template t(0:21)!$xmp distribute t(W) onto p, ... ) , ...

w
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21tp(1) 0 1 2 3 4 5 6 7dimension x(0:21)!$xmp align x(i) with t(i)dimension y(0:21)!$xmp align y(i) with t(i)!$xmp shadow y(1)2013/11/01

xp(1)ではx(7)までアクセス可

8 9 10 11 12 13 14 15p(2)16 17 18 19 20 21p(3)p(1) 0 1 2 3 4 5 6 7 8yp(1)ではy(8)までアクセス可

7 8 9 10 11 12 13 14 15 16p(2)15 16 17 18 19 20 21p(3)17Copyright © 2013 PCCC & Fujitu Labs. Ltd.

REFLECT実行指示文
すべての「袖」領域に、それぞれ隣接ノードの値をコピーする。
!$xmp reflect (A) [ <width節> ] [ <async節> ]!$xmp nodes p(3)!$xmp template t(0:21)!$xmp distribute t(W) onto pw
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21tdimension x(0:21)!$xmp align x(i) with t(i)dimension y(0:21)!$xmp align y(i) with t(i)!$xmp shadow y(1)p(1) 0 1 2 3 4 5 6 7 8reflect通信!$xmp reflect (y)!$xmp loop t(i)do i = 1, 20x(i) = 0.25 * (y(i-1) + 2*y(i) + y(i+1))
end do2013/11/01

yp(2)

7 8 9 10 11 12 13 14 15 16reflect通信p(3)1815 16 17 18 19 20 21

Copyright © 2013 PCCC & Fujitu Labs. Ltd.

SHADOW/REFLECTの例
2次元分割、隣接8ノードと袖通信がある例
通信の記述はREFLECT指示文１つだけ

1!$xmp nodes p(3,3)!$xmp template t(30,30)!$xmp distribute t(block,block) onto preal a(30,30)!$xmp align a(i,j) with t(i,j)!$xmp shadow a(1,1)

1011202130

11011! *** 袖領域に値を設定 ***!$xmp!$xmp reflect a!$xmp loop (i,j) on p(i,j)
do j=1,100
do i=1,100a(i,j) = a(ia(i-1, j-1) + a(i, j-1) + a(i+1a(i+1,+1, j-1) + &a(ia(i-1, j ) + a(i, j ) + a(i+1a(i+1,+1, j ) + &a(ia(i-1, j+1)+1) + a(i, j+1)+1) + a(i+1a(i+1,+1, j+1)
enddo
enddo

2013/11/01

1920

2130

分割データの本体

袖領域

Copyright © 2013 PCCC & Fujitu Labs. Ltd.

XMP V1.1仕様の体系
グローバルビュー関連

ローカルビュー関連

テンプレートの分散言語拡張（F,Cとも）NODES指示文
TEMPLATE指示文
DISTRIBUTE指示文TEMPLATE_FIX指示文

Coarray記法

Coarray関連の指示文／組込み
COARRAY指示文
IMAGE指示文
LOCAL_ALIAS指示文（F）
POST/WAIT指示文
LOCK/UNLOCK指示文（C）
Image Index変換組込み手続

データマッピング
ALIGN指示文
SHADOW指示文

計算マッピング

XMP/C言語拡張

LOOP指示構文
ARRAY指示構文
TASKS/TASK指示構文

部分配列，配列式，配列代入
記述子問合せ xmp_desc_of

通信と同期

組込み／ライブラリ手続

REFLECT指示文
GMOVE指示構文
BARRIER指示文
REDUCTION指示文
BCAST指示文
2013/11/01

問合せ関数
xmp_node_num, xmp_num_nodes等
xmp_dist_blocksize等

付録
20

Copyright © 2013 PCCC & Fujitu Labs. Ltd.

LOCAL_ALIAS宣言指示文
グローバル配列Gに、ローカルビューの別名Lを付ける!$xmp nodes P(4)!$xmp template :: T(100)!$xmp distribute (block) onto P :: T(100)仮想グローバル空間

real :: G(80, 100)!$xmp align with T :: GG(80, 100)

real :: L(80, 25)!$xmp local_alias L to G

Global View G(80, 1:25)
Local View L(80, 25)[1]P(1)2013/11/01

G(80, 26:50)
L(80, 25)[2]G(80, 51:75)
L(80, 25)[3]
P(3)

P(2)
21

G(80, 76:100)
L(80, 25)[4]P(4)Copyright © 2013 PCCC & Fujitu Labs. Ltd.

まとめXcalableMPの特徴
テンプレートが活躍する言語仕様体系
HPFと違い、計算マッピングも通信も手動だからテンプレートは、プログラム全体の並列化の戦略（スキーム）を表現する
データもループiterationも、テンプレートに整列させる

通信はREFLECTが最重要
XMPが確実に性能を出せるのは、ステンシル計算
他の通信パターンでは何が重要だろうか

グローバルビューとローカルビューとの連携
グローバルからローカルへのalias（名前の呼び分け）が提供されている逆のaliasも必要。要件を具体化したい

XcalableMPの今後
ハイブリッドへ（アクセラレータ、MPI、OpenMP）
トポロジ対応、片側通信
まずはOMNI XMPの実装に協力し、利用者を増やしたい
2013/11/01

22

Copyright © 2013 PCCC & Fujitu Labs. Ltd.