XcalableMP講習会
村井 均（理研）

2

はじめに´ ⼤規模シミュレーションなどの計算を⾏う
ためには、クラスタのような分散メモリシステムの利⽤が⼀般的´ 並列プログラミングの現状´ ⼤半はMPI (Message Passing Interface)を利⽤´ MPIはプログラミングコストが⼤きい´ ⽬標´ ⾼性能と⾼⽣産性を兼ね備えた並列プログラミング⾔語の開発
XcalableMP講習会

2015/12/9

3

並列プログラミング⾔語
XcalableMP´ 次世代並列プログラミング⾔語検討委員会 /PCクラスタコンソーシアムXcalableMP規格部会で検討中。
´ MPIに代わる並列プログラミングモデル´ ⽬標:´ Performance´ Expressiveness´ Optimizability´ Education cost

XcalableMP講習会

www.xcalablemp.org

2015/12/9

4

XcalableMPの特徴（１）´ Fortran/Cの拡張 （指⽰⽂ベース）→ 逐次プログラムからの移⾏が容易´ SPMDモデル´ 各ノード（並列実⾏の主体）が独⽴に（重複して）実⾏を開始する。

XcalableMP講習会

2015/12/9

5

XcalableMPの特徴（２）´ 明⽰的な並列化と通信´ ワークマッピング（並列処理）、通信、および同期は「集団的」な指⽰⽂によって明⽰される。
→ チューニングが容易´ 2つのプログラミングモデル´ グローバルビュー´ ローカルビュー

XcalableMP講習会

2015/12/9

6

XMPの実⾏モデル（SPMD）´ 各ノードは、同⼀のコードを独⽴に（重複して）実⾏する。
´ 指⽰⽂の箇所では、全ノードが協調して動作する（集団実⾏）。
ノード1
ノード4
´ 通信・同期´ ワークマッピング（並列処理）

重複実⾏

指⽰⽂

通信, 同期, ワークマッピング

XcalableMP講習会

2015/12/9

7メモリモデル´ 各ノードは、⾃⾝のローカルメモリ上のデータ（ローカルデータ）のみをアクセスできる。
´ 他のノード上のデータ（リモートデータ）にアクセスする場合は、特殊な記法による明⽰的な指定が必要。
´ 通信指⽰⽂´ coarray´ 「分散」されないデータは、全ノードに重複して配置される。
XcalableMP講習会

2015/12/9

8プログラム例（MPIとの⽐較）
XMP/Cプログラム

int array[MAX];#pragma xmp nodes p[*]#pragma xmp template t[MAX]#pragma xmp distribute t[block] onto p#pragma xmp align array[i] with t[i]MPIプログラム
int array[MAX];
main(int argc, char **argv){
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);main(){#pragma xmp loop on t[i] reduction(+:res)for (i = 0; i < MAX; i++){array[i] = func(i);res += array[i];}}dx = MAX/size;
llimit = rank * dx;
if (rank != (size -1)) ulimit = llimit + dx;
else ulimit = MAX;
temp_res = 0;
for (i = llimit; i < ulimit; i++){array[i] = func(i);temp_res += array[i];}シンプル

MPI_Allreduce(&temp_res, &res, 1, MPI_INT,MPI_SUM, MPI_COMM_WORLD);MPI_Finalize( );}XcalableMP講習会

2015/12/9

9

XMPのグローバルビュー・プ
ログラミングローカルビュー: 各ノードが解くべき問題を個別に⽰す。「ノード1は問題1〜25を解け。ノード2は……」´ 解くべき問題全体を記述し、それをN個のノードが分担する⽅法を⽰す。
´ 「問題1〜100を4⼈で分担して解け」´ 分かりやすい（基本的に指⽰⽂を挿⼊するだけ）。
´ 「分担」を指定する⽅法´ データマッピング´ ワークマッピング´ 通信・同期

XcalableMP講習会

2015/12/9

10

XcalableMP指⽰⽂の記法´ XMPの指⽰⽂は、「#pragma xmp」または「!$xmp」から始まる。
例[C]#pragma xmp align a[i] with t[i][F]!$xmp align a(i) with t(i)XcalableMP講習会

2015/12/9

XMPのデータマッピング

11´ 整列 + 分散による2段階の処理
001122343

整列

401
分散
25566773テンプレート(仮想的な配列)

ノード

配列/ループ

XcalableMP講習会• 配列はテンプレートに整列され、• テンプレートはノードに分散される。

2015/12/9

12データマッピング指⽰⽂（１）nodes指⽰⽂´ XMPプログラムの実⾏者である「ノード」のサイズと形状を宣⾔する。
´ データやワークを割り当てる対象。
´ プロセッサ（マルチコア可）とローカルメモリから成る。
[C]#pragma xmp nodes p[4][4][F]!$xmp nodes p(4,4)

XcalableMP講習会

2015/12/9

13

動的なnodes指⽰⽂´ 実際のpのサイズは、実⾏時に決まる。
´ mpiexec コマンドの引数など。
[C]#pragma xmp nodes p[*]#pragma xmp nodes p[*][4][F]!$xmp nodes p(*)!$xmp nodes p(4,*)
最後の次元に「*」を指定できる。

XcalableMP講習会

2015/12/9

14

データマッピング指⽰⽂（２）template指⽰⽂´ XMPプログラムの並列処理の基準である「テンプレート」のサイズと形状を宣⾔する。
´ データやワークの整列の対象。

[C]#pragma xmp template t[64][64][F]!$xmp template t(64,64)

XcalableMP講習会

2015/12/9

15

データマッピング指⽰⽂（3）distribute指⽰⽂´ノード集合pに、テンプレートtを分散する。
[C] #pragma xmp distribute t[block] onto p[F] !$xmp distribute t(block) onto p´分散形式として、ブロック、サイクリック、ブロックサイクリック、不均等ブロックを指定できる。
XcalableMP講習会

2015/12/9

データマッピングの例

16

例1: ブロック分散

例2: サイクリック分散#pragma xmp nodes p[4]#pragma xmp template t[20]#pragma xmp nodes p[4]#pragma xmp template t[20]#pragma xmp distribute t[block] onto p#pragma xmp distribute t[cyclic] onto p

ノード

インデックスノード

インデックス

P[0]0, 1, 2, 3, 4

P[0]0, 4, 8, 12, 16

P[1]5, 6, 7, 8, 9P[1]1, 5, 9, 13, 17

P[2]10, 11, 12, 13, 14P[2]2, 6, 10, 14, 18

P[3]15, 16, 17, 18, 19

P[3]3, 7, 11, 15, 19

XcalableMP講習会

2015/12/9

17

多次元テンプレートの分散#pragma xmp nodes p2[2][2]#pragma xmp distribute t[block][block] onto p2

P2[0][0] P2[0][1]P2[1][0] P2[1][1]#pragma xmp nodes p1[4]#pragma xmp distribute t[block][*] onto p1

P1[0]
P1[1]
P1[2]
P1[3]
XcalableMP講習会「*」は⾮分散を意味する。

2015/12/9

18

データマッピング指⽰⽂（４）align指⽰⽂（１）´ 配列aの要素iを、テンプレートtの要素i-1に整列させる。
[C] #pragma xmp align a[i] with t[i-1][F] !$xmp align a(i) with t(i-1)´ 多次元配列も整列可能。
[C] #pragma xmp align a[i][j] with t[i-1][j][F] !$xmp align a(i,j) with t(i-1,j)XcalableMP講習会

2015/12/9

#pragma xmp nodes p[4]#pragma xmp template t[8]19#pragma xmp distribute t[block] onto pfloat a[8];#pragma xmp align a[i] with t[i]´ 整列 + 分散による2段階の処理

データマッピング

0

0

1

1

2

2

3
4

3

整列

40

1
分散
255

6

6

773

配列

テンプレート(仮想的な配列)ノード

XcalableMP講習会

2015/12/9

20

特殊な整列
´ 縮退

#pragma xmp distribute t[block] onto p1#pragma xmp align a[i][*] with t[i]´ 複製#pragma xmp distribute t[block][block] onto p2#pragma xmp align a[i] with t[i][*]a[0]の実体は、p2[0][0]とp2[0][1]に存在する。値の⼀致は保証されない。

XcalableMP講習会

2015/12/9

21

動的な配列の整列´ ポインタまたは割付け配列として宣⾔。
´ 実際の「整列」の処理は、続くxmp_mallocまたはallocate⽂において実⾏される。
[C] int *a;#pragma xmp align a[i] with t[i]...
a = (int *)xmp_malloc(xmp_desc_of(a), 100);[F] integer, allocatable :: a(:)!$xmp align a(i) with t(i)...
allocate (a(100))
XcalableMP講習会

2015/12/9

22

ワークマッピング指⽰⽂（１）loop指⽰⽂（１）´ ループの並列化を指⽰する。
´ t[i][j]を持つノードが、繰り返しi,jにおいてa[i][j]への代⼊を実⾏する。

#pragma xmp loop (i,j) on t[i][j]for (i = 0; i < n; i++)for (j = 0; j < n; j++)a[i][j] = ...;

XcalableMP講習会

2015/12/9

23

loop指⽰⽂（２）´ アクセスされるデータが、その繰り返しを実⾏するノードに割り当てられていなければならない。
´ 下の例では、t[i][j]を持つノードが、a[i][j]を持たなければならない。
´ そうでない場合、事前に通信を⾏っておく。

#pragma xmp loop (i,j) on t[i][j]for (i = 0; i < n; i++)for (j = 0; j < n; j++)a[i][j] = ...;
XcalableMP講習会

2015/12/9

24

loop指⽰⽂（３）´ reduction節´ 並列ループの終了時に、各ノードの値を「集計」する。
´ 提供している演算は+，max, minなど。
#pragma xmp loop on t[i] reduction(+:sum)for (i = 0; i < 20; i++)sum += i;

各ノード上のsumの値を合計した値で、各ノード上のsumを更新する。
XcalableMP講習会

2015/12/9

25

ワークマッピング指⽰⽂（２）task指⽰⽂´ 直後の処理を、指定したノードが実⾏する。
#pragma xmp task on p[0]{func_a();}#pragma xmp task on p[1]{func_b();}
XcalableMP講習会

P[0]がfunc_aを実⾏する。

p[1]がfunc_bを実⾏する。

2015/12/9

26

通信指⽰⽂（１）shadow/reflect指⽰⽂
aの上下端に幅1のシャドウを付加する。

#pragma xmp distribute t[block] onto p#pragma xmp align a[i] with t[i]#pragma xmp shadow a[1:1]...
#pragma xmp reflect (a)aに対する隣接通信を実⾏する。

reflect
P[0]XcalableMP講習会

P[1]

P[2]

P[3]
2015/12/9

27

shadow/reflect指⽰⽂の例#pragma xmp loop on t[i]for (i = 1; i < 9; i++)b[i] = a[i-1] + a[i] + a[i+1];
P[0]

P[1]

a 0123

4

b 012

3

4

XcalableMP講習会

545678956789
2015/12/9

28

shadow/reflect指⽰⽂の例#pragma xmp shadow a[1:1]#pragma xmp reflect (a)#pragma xmp loop on t[i]for (i = 1; i < 9; i++)b[i] = a[i-1] + a[i] + a[i+1];
reflect

P[0]

a 0

1234

b 0

1

2

34

XcalableMP講習会

54P[1]

5678956789
2015/12/9

29

通信指⽰⽂（2）gmove指⽰⽂´ 通信を伴う任意の代⼊⽂を実⾏する。
#pragma xmp gmovea[:][:] = b[:][:];

n1n2n3n4※ Cで「部分配列」も記述できる。

a[block][block]XcalableMP講習会

n1n2
n3
n4
b[block][*]2015/12/9

30

通信指⽰⽂（３）´ bcast指⽰⽂´ 特定のノードが、指定したデータを他のノードへブロードキャストする（ばらまく）。
#pragma xmp bcast (s) from p[0]※ from p[0]は省略可

´ barrier指⽰⽂´ ノードが互いに待ち合わせる（バリア同期）。
#pragma xmp barrier

XcalableMP講習会

2015/12/9

31

XcalableMPプログラムの例!$xmp nodes p(npx,npy,npz)!$xmp template (lx,ly,lz) :: t!$xmp distribute (block,block,block) onto p :: tノード集合の宣⾔!$xmp align (ix,iy,iz) with t(ix,iy,iz) ::!$xmp&
sr, se, sm, sp, sn, sl, ...

テンプレートの宣⾔と分散の指定!$xmp shadow (1,1,1) ::!$xmp&
sr, se, sm, sp, sn, sl, ...
lx = 1024!$xmp reflect (sr, sm, sp, se, sn, sl)!$xmp loop on t(ix,iy,iz)
do iz = 1, lz-1
do iy = 1, ly
do ix = 1, lx
wu0 = sm(ix,iy,iz ) / sr(ix,iy,iz )wu1 = sm(ix,iy,iz+1) / sr(ix,iy,iz+1)
wv0 = sn(ix,iy,iz ) / sr(ix,iy,iz )...
XcalableMP講習会

整列の指定
シャドウの指定
重複実⾏される
隣接通信の指定
ループの並列化の指定
2015/12/9

32

XMPのローカルビュー・プロ
グラミング´ 各ノードが解くべき問題を個別に⽰す。
´ 「ノード1は問題1〜25を解け。ノード2は……」´ ⾃由度が⾼いが、やや難しい。
´ ローカルビューのための機能として、Fortran 2008から導⼊したcoarrayをサポート。

XcalableMP講習会

2015/12/9

coarray機能33´ 「coarray」として宣⾔されたデータは、代⼊⽂の形式で他のノードからもアクセスできる。
ノード2が持つb[3:3]のデータをa[0:3]に代⼊float b[100]:[*];
if (xmpc_this_image() == 0)a[0:3] = b[3:3]:[1];base

配列bはcoarrayであると宣⾔
コロンの後の[]はノード番号を表す

length 「0からの3要素」
XcalableMP講習会

2015/12/9