HPC Challenge Benchmarkによる並列プログラミング言語XcalableMPの性能評価○ 中尾 昌広（理化学研究所 計算科学研究機構）
佐藤 三久（理化学研究所 計算科学研究機構）

PCクラスタワークショップ in 大阪, February 20th, 2015

XcalableMP（XMP）
既存言語（C99とFortran95）を指示文と拡張構文で並列化
低い教育コスト記法のいくつかはCoarray FortranとHPFから継承

Node1

Node2

Node3

Directive

実行モデルはMPIと同じSPMD
指示文がなければ、重複実行

Directive

Performance-aware programming
チューニングが行い易い
2つのメモリモデル
グローバルビュー：指示文による典型的なデータ並列のサポート
ローカルビュー：Coarrayによる片側通信

Possibility of
Performance Tunning

指示文とCoarray記法により通信・同期を実行
MPI
XMP
ChapelHPF
Automatic
Parallelization

Programming Cost2

Code example (グローバルビュー)
int a[MAX];#pragma xmp nodes p(4)#pragma xmp template t(0:MAX-1)#pragma xmp distribute t(block) on p
#pragma xmp align a[i] with t(i)データ分散の定義

main(){
int i, j, res = 0;
#pragma xmp loop on t(i) reduction(+:res)for(i = 0; i <MAX; i++){
データ並列と集約演算
a[i] = func(i);res += array[i];}3Code example (ローカルビュー)
double a[100]:[*], b[100]:[*];
int me = xmp̲node̲num();

Coarrayの定義

if(me == 2)
a[:]:[1] = b[:];Put通信

if(me == 1)a[0:50] = b[0:50]:[2];Get通信Coarray synax in XMP/C

array_name[start:length]:[node_number];4最近の成果（1/4）
2014年11月に仕様書1.2.1をリリース（マイナーアップデート）
http://xcalablemp.org
同日にOmni Compiler Ver. 0.9をリリース
http://omni-compiler.org「京」のRDMAを使った片側通信機能の実装など
total社のアプリReverse Time Migration（RTM）をXMPで実装
核融合プラズマシミュレーションコードGTC-PをXMPで実装
FX10，SR16000，SX-9，XE6，BG/Qなどへの移植
第2回XMPワークショップ＠秋葉原（2014年10月24日）
参加者は約40名：14件の発表
基調講演は3次元流体コードなどのアプリの話
http://www.pccluster.org/ja/event/2014/09/2xcalablemp.html

来年度もします5最近の成果（2/4）
XMP講習会＠計算科学振興財団 in 神戸

来年度は東京で開催予定（ハンズオンができる所を募集中）

AICS eラーニングアーカイブ
理研AICSのウェブサイト
orYoutubeでXcalableMPと検索
6

最近の成果（3/4）
HPC Challenge Awards Competition Class 2への応募（発表は2014年11月）
http://www.hpcchallenge.org
HPCシステムを多角的に評価するためのベンチマークセット
In Class 1, only the performance of an HPC system is evaluated
In Class 2, the productivity and performance of a programming language
are evaluated（コードのエレガントさを50%、性能を50%で評価）
Benchmark説明

RandomAccess

分散テーブルをランダムにアクセス

STREAM

実効メモリバンド幅を計測

HPL

密行列連立一次方程式を解く

FFT

1次元離散複素フーリエ変換に対する速度7

最近の成果（4/4）
Best Performance賞とMost Elegant Language賞
京を使って評価
2013年はAwardを受賞（日本初）
2014年は2013年のに対してチューニングXMPはBest Performance賞を受賞
Most Elegant Language賞はPCJというJava拡張Best

MostXMP
PCJ??
??

8

2013年と2014年とのXMPの比較
同じノード数における性能向上率
1.94

Ratio

2.0##

Good

1.5##

1.37

1.56

1.47

1.0##
0.5##
0.0##
HPL#

(4,096 nodes)

RandomAccess#

STREAM#(16,384 nodes) (16,384 nodes)

FFT#(36,864 nodes)

行数
2500"

2013年はコードクリーンは行えていなかった

2416

2000"
1500"

Good

1000"
500"

313 426

250 253

HPL"

RandomAccess"

0"

66

69

STREAM"

205
FFT"

9

HPL version 1
Source lines of Code (SLOC) is 313, written in XMP/C
ブロックサイクリック分散A[N][N]double	  A[N][N];	  #pragma	  xmp	  nodes	  p(P,Q)	  #pragma	  xmp	  template	  t(0:N-­‐1,	  0:N-­‐1)	  #pragma	  xmp	  distribute	  t(cyclic(NB),	  \	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  cyclic(NB))	  onto	  p	  #pragma	  xmp	  align	  A[i][j]	  with	  t(j,i)

12

3

4

12

行列積には「京」が提供しているBLASを利用

gmove指示文を用いたパネル転送

A[N][N]

A_L[N][NB]double	  A_L[N][NB];	  #pragma	  xmp	  align	  A_L[i][*]	  with	  t(*,i)	  k	  	  	  	  :	  #pragma	  xmp	  gmove	  A_L[k:len][0:NB]	  =	  A[k:len][j:NB];
lenjNB

10HPL version 2
SLOC is 426, written in XMP/C
gmove指示文とasync節を用いたLookaheadアルゴリズムの実装
通信と計算のオーバラップ
double	  A_L[N][NB];	  #pragma	  xmp	  align	  A_L[i][*]	  with	  t(*,i)	  	  	  	  	  :	  k#pragma	  xmp	  gmove	  async(1)	  A_L[k:len][0:NB]	  =	  A[k:len][j:NB];	  	  	  	  	  :	  lenfor(m=j+NB;m<N;m+=NB){	  	  	  for(n=j+NB;n<N;n+=NB){	  	  	  	  	  cblas_dgemm(&A[m][n],	  ..);	  	  	  	  	  if(xmp_test_async(1)){	  	  	  	  	  	  	  	  //	  receive	  A[k:len][j:NB];	  	  	  	  	  	  	  	  	  	  	  	  :A[N][N]

jA_L[N][NB]

NB

非同期Broadcast通信

非同期通信が来ているかどうかをチェック
11Performance of HPL
423 TFlops (80.7%)
4,096 nodes

TFlops

1000#

100#

10#
256#

2
noisreV1noisreV1024#

971 TFlops (46.3%)
16,384 nodes
310 TFlops (59.1%)
4,096 nodes

4096#16384#

Number of nodes

XMP-HPL Version 2の方がスケーラビリティが高い12

RandomAccess
SLOC is 253, written in XMP/C
XMP/C coarrayを用いたローカルビュー
Post指示文とWait指示文を用いたP2Pバリア

u64Int	  recv[LOGPROCS][RCHUNK+1]:[∗];	  ...	  
for	  (j	  =	  0;	  j	  <	  logNumProcs;	  j++)	  {	  	  	  recv[j][0:num]:[i_partner]	  =	  send[i][0:num];	  	  Coarrayの定義
Put operation#pragma	  xmp	  sync_memory	  #pragma	  xmp	  post(p(i_partner),	  0)	  	  	  	  :	  #pragma	  xmp	  wait(p(j_partner))	  }post/wait指示文を用いたP2Pバリア
13片側通信機能
片側通信に関する機能（put/get/post-wait/lock-unlock/sync.）
基本的には，片側通信ライブラリGASNetを利用 (http://gasnet.lbl.gov)「京」では，富士通RDMAを利用
コードを静的に解析し，連続領域の転送の場合は，ランタイム内のいくつかの処理をショートカット
片側通信の行

片側通信の行
Yes

XMP関数
Yes

連続？

put

No

新XMP関数 XMP関数
連続？

No

Yes

Nopackputpack

静的解析して，連続領域の転送であれば新XMP関数を呼ぶように置換する

14

片側通信機能Putの性能比較：C言語から直接呼び出した場合とほぼ同じ性能

Performance (GByte/s)

5
XcalableMP (New)XcalableMP (Old)4

C language3

静的解析することで，平均20%程度性能向上

2

1

Better0864512

4K

32K

256K

2M

Transfer Size (Byte)
15Performance of RandomAccess
MPI̲Send/Recvを用いて実装されていたpost/wait指示文を「京」が提供しているRDMAを用いて再実装．
1000"

254 GUPs
16,384 nodes

raeysih
TGUPs

100"

Las

10"

raety

162 GUPs
16,384 nodes

1"
64"

256"

1024"

4096"

16384"

Number of nodes
16

STREAM
Fujitsuコンパイラの最適化指示文を追加

STREAM (XMP/C)
3,583 TB/s
82,944 nodes

10000##pragma	  xmp	  nodes	  p(∗)	  1000#ishT

TB/s#pragma	  loop	  xfill	  #pragma	  loop	  noalias	  #pragma	  omp	  parallel	  for	  	  	  for	  (i=0;	  i<N;	  i++)	  	  	  	  	  a[i]	  =	  b[i]	  +	  scalar∗c[i];	  La100#rayeytsrae

2,439 TB/s
82,944 nodes#pragma	  xmp	  reduction(+:triadGBs)

C言語やFortranの最適化手法がそのまま適用できる

10#
1024#

8192#

65536#

Number of nodes

17

FFT
1プロセスが，スレッド化したFFTEライブラリを呼ぶように変更．
コードクリーンナップ．

call	  xmp_transpose(a,b,1)

Th
is

100"

TFlops!$xmp	  loop	  on	  tx(i)	  !$omp	  parallel	  do	  do	  i=1,nx	  	  	  do	  j=1,ny	  	  	  	  	  b(j,i)=b(j,i)∗w(j,i)	  	  	  end	  do	  end	  do	  year

212 TFlops
82,944 nodes!$xmp	  loop	  on	  tx(i)	  do	  i=1,nx	  	  	  call	  zfft1d(b(1,i),ny,−1,cy)	  	  end	  do	  

Las

10"

1"
512"

4096"

50 TFlops
38,864 nodes

raety32768"

Number of nodes
18

Results and Machine
Summary
Benchmark# Nodes

Performance (/peak)

SLOC

Ver. 1

16,384

971 TFlops (46.3%)

313

Ver. 2

4,096

423 TFlops (80.7%)426

RandomAccess

16,384254 GUPs

253

STREAM

82,994

3,583 TB/s (67.5%)

69FFT

82,944212 TFlops (2.0%)

205

HPL

The K computer: 82,944 nodes
SPARC64 VIIIfx Chip, 128 GFlops
DDR3 SDRAM 16GB, 64GB/s
Tofu Interconnect
6D mesh/torus network
http://www.aics.riken.jp/jp/outreach/photogallery.html

5GB/s x 4links x 2

19

他のPGAS言語とMPIとの行数の比較
Lang.

HPL

RandomAccess

FFT

STREAM

XMP

313 (ver. 1)
426 (ver. 2)

253

205

69

PCJ

<N/A>

146

498

180

Coarray Fortran

786

409

450

63

Chapel

658

112

<N/A>

72

X10708

143

236

60

MPI (hpcc-1.4)

8,800

787

1904

32920

まとめと今後の課題
XMPの概要と最近の活動について紹介
並列言語のコンテストHPC Challenge Awards Competition Class 2への応募
HPL，FFT，STREAM，FFTの実装
Best Performance Awardを受賞

今後の予定
2015年4月にOmni Compiler 0.95のリリース
XMP/FortranにおけるCoarray機能
ハンドブックの作成
C++，Fortran2003（今はFortran95）
アクセラレータ対応（OpenACCとの組合せ）
21