1XcalableMP Workshop

2013/11/01

Omni XcalableMP Compilerの概要

下坂 健則
理化学研究所 計算科学研究機構
2011/11/01

2
XcalableMP Workshop

目次• 開発概要• Omni XcalableMP Compilerの構造• Omni XcalableMP Compilerの特徴• インストール方法• 講習会活動• 課題• まとめ

2013/11/01

3
XcalableMP Workshop

2013/11/01

開発概要• 筑波大CCSと理研AICSで開発中。
• オープンソースプロジェクト。
• XMP/C, XMP/Fortranをパッケージ化して提供。
• 2013/3にVer. 0.6.1をリリース済み。XcalableMP規格仕様v1.1のおおよその機能を使用可能。サポート機能の詳細は、以下のサイトで公開中。
http://www.hpcs.cs.tsukuba.ac.jp/omni-compiler/xcalablemp/download.html• SC13にて，ver. 0.7.0を，リリース予定。
• サポートプラットフォーム
Linux x86系クラスタ, 京, FX10, Cray XE5,NEC SX*, Earth Simulator*, SR16000*, BlueGene/Q** インストール確認中

4
XcalableMP Workshop

2013/11/01

Ver. 0.7.0の主なサポート項目• OpenMP指示文のサポート• task指示文(XMP/F)のサポート• gmove指示文による通信の機能拡張• reflect指示文による通信の性能改善• Coarray機能の京向け性能改善• post/wait指示文の京向け性能改善

5
XcalableMP Workshop

提供サイト

2013/11/01

6
XcalableMP Workshop

2013/11/01

HPC Challenge Class2 ＆展示履歴

過去3回挑戦。
SC09, SC10ではHonorable
Mentionを獲得

7
XcalableMP Workshop

サポート

2013/11/01

8
XcalableMP Workshop

2013/11/01

Omni XcalableMP Compilerの構造
lex, yacc
XMP
ソース
コード

フロントエンド

java
Xcode
MLトランスレータ

java
Xcode
ML

バックエンドfoo.c, foo.f90--- コンパイル方法 --XMP/C: xmpcc [xxx] [yyy] [zzz.c]
XMP/F: xmpf90 [xxx] [yyy] [zzz.f90]
xxx: Omni XMPコンパイラオプション
yyy: ネイティブコンパイラオプション
zzz:ファイル名

ノード単体性能は，Nativeコンパイラに依存。
性能差別化は，通信系機能で！

MPIプログラム

Nativeコンパイラ

XMPライブラリ

実行ファイルMPIライブラリ9
XcalableMP Workshop

2013/11/01

Omni XcalableMP Compilerの特徴• Omni XcalableMPライブラリでの最適化• MPI -> XMP, XMP->MPIの双方の呼び出しが可能• アクセラレータに対応(XMP-dev)• プロファイリングインターフェース(Scalasca, tlog連携)• 外部ライブラリインタフェース(MUMPS, ScaLAPACKの一部)

10
XcalableMP Workshop

2013/11/01

ライブラリでの最適化• reflect指示文に対する最適化- プラットフォームにより，以下の3通りから静的に選択
1. MPI derived-datatype

distributedarray

2. parallel pack/unpack

3. RDMA• Coarray記法に関する最適化- XMP/Cにて，GASNetもしくはRDMAで実装

stencil （shadow）

11
XcalableMP Workshop

2013/11/01

MPI -> XMP呼び出し例
MPIプログラム…..
if (p->c_size){
xmp_pzfft1d0_( a, b,
c + i * (nx * 2 + FFTE_NP),
c + i * (ny * 2 + FFTE_NP),w, &nx, &ny, timings );}else{
xmp_pzfft1d0_( a, b,b + i * (nx * 2 + FFTE_NP),a + i * (ny * 2 + FFTE_NP),w, &nx, &ny, timings );}…..

XMPプログラム!

SUBROUTINE XMP_PZFFT1D0(A,B,CX,CY,W,NX,NY,TIMINGS)IMPLICIT REAL*8 (A-H,O-Z)
COMPLEX*16 A(NX,NY)COMPLEX*16 B(NY,NX)COMPLEX*16 CX(*),CY(*)
COMPLEX*16 W(NY,NX)DIMENSION TIMINGS(*)!$XMP nodes p(*)!$XMP template tx(NX)!$XMP template ty(NY)!$XMP distribute tx(block) onto p!$XMP distribute ty(block) onto p!$XMP align A(*,i) with ty(i)!$XMP align B(*,i) with tx(i)!$XMP align W(*,i) with tx(i)….

A, B, Wはグローバル配列

この場合、MPI_COMM_WORLD
相当のプロセス集合

12
XcalableMP Workshop

2013/11/01

XMP -> MPI呼び出し例
XMPプログラム

MPIプログラム

SUBROUTINE XMP_PZFFT1D0(A,B,CX,CY,W,NX,NY,TIMINGS)IMPLICIT REAL*8 (A-H,O-Z)!
….
!$XMP nodes p(*)!$XMP template tx(NX)!$XMP template ty(NY)!$XMP distribute tx(block) onto p!$XMP distribute ty(block) onto p!$XMP align A(*,i) with ty(i)!$XMP align B(*,i) with tx(i)!$XMP align W(*,i) with tx(i)….
CALL ZFFT1D(B,NY,0,CY(ITHREADS*(NY*2+8)+1))….

分散配列のアドレスはXMPコンパイラ
がローカルアドレスに変換。

C

SUBROUTINE ZFFT1D(A,N,IOPT,B)
IMPLICIT REAL*8 (A-H,O-Z)
INCLUDE 'param.h'
COMPLEX*16 A(*),B(*)
COMPLEX*16 C((NDA2+NP)*NBLK),D(NDA2)
COMPLEX*16 WX(NDA2),WY(NDA2)
DIMENSION IP(3),LNX(3),LNY(3)SAVE WX,WY
CALL FACTOR(N,IP)….

13
XcalableMP Workshop

2013/11/01

プロファイリングインタフェース(Scalasca)
1. Scalasca ver. 1.4.xをインストール。
2. PATH，SCALASCA_HOME環境変数を設定。
3. xmpcc -with-scalasca a.c
4. scalasca -analyze mpiexec -n 2 ./a.out
epik_xxx/xxx.cubeファイルが生成。
5. X11(仮想環境上のLinuxなど),が使える環境で，以下のコマンドを実行
scalasca -examine xxx.cube
6. 右図のような画面が表示される。
※上記手順の動作プラットフォーム例
VMWare Player + Ubuntu環境+ Linux x86_64マシン

14
XcalableMP Workshop

2013/11/01

プロファイリングインタフェース(tlog)
XMPプログラム(foo.c)

指示文単位に経過時間のログを表示…..
#pragma xmp reflect (p)#pragma xmp loop (i,j) on t(i,j)
for (i = 1 ; i<imax-1 ; i++)for (j = 1 ; j<jmax-1 ; j++)for (k = 1 ; k<kmax-1 ; k++){s0 = a[0][i][j][k] * p[i+1][j ][k ]+…
ss = ( s0 * a[3][i][j][k] - p[i][j][k] ) * bnd[i][j][k];gosa+= ss*ss;
wrk2[i][j][k] = p[i][j][k] + omega * ss;}
#pragma xmp reduction(+:gosa) profile#pragma xmp loop (i,j) on t(i,j)
for (i = 1; i < imax-1; ++i)for (j = 1; j < jmax-1; ++j)for (k = 1; k < kmax-1; ++k)p[i][j][k] = wrk2[i][j][k];…..

指示文を限定したい場合，profileを追記。

$xmpcc -with-tlog foo.f90 (-profile)(現在、xmpccのみ使用可)
実行後、trace.logファイルが出力される。
X11が使える環境(仮想環境上のLinuxなど)
で、以下のコマンドを実行する。
$tlogview trace.log

15
XcalableMP Workshop

2013/11/01

外部ライブラリインタフェース例(MUMPS)XMPプログラム

XMPインタフェース実装#pragma xmp nodes p(*)#pragma xmp template t(0:nnz-1)#pragma xmp distribute t(cyclic) onto p#pragma xmp align a[i] with t(i)#pragma xmp align irn[i] with t(i)分散配列のデータ#pragma xmp align jcn[i] with t(i)マッピング情報を#include "stdlib.h"#include "dmumps_c.h"#include "xmp.h"

渡すため，ネイティブインタフェースに，ディスクリプタを追加。

int main(int argc, char *argv[]){………
id.icntl[17]=3;
id.job=6;
ixmp_dmumps_c(&id, xmp_desc_of(irn),xmp_desc_of(jcn), xmp_desc_of(a));………

データマッピング情報は、XMPが提供する問い合わせ関数で取得する。

void ixmp_dmumps_c(DMUMPS_STRUC_C *id,
xmp_desc_t dirn, xmp_desc_t djcn,
xmp_desc_t da){………..
xmp_array_laddr(dirn,&irn_laddr);
xmp_array_laddr(djcn,&jcn_laddr);
xmp_array_laddr(da,&a_laddr);
id->irn_loc = *(void **)irn_laddr;
id->jcn_loc = *(void **)jcn_laddr;
id->a_loc = *(void **)a_laddr;
dmumps_c(id);
………..
}

16
XcalableMP Workshop

2013/11/01

インストール方法(1)
事前にインストールしておくべきアプリケーション(前提PP)- Lex, Yacc
- C Compiler (supports C99)
- Java Compiler (latest)- Apache Ant (1.8.1 or later)- MPI Implementation (supports MPI-2)- libxml2- GASNet (If you want to use coarray functions)※Debian系Linuxの場合、あらかじめ以下を実行しておくとよい。
#aptitude install flex ant gfortran openmpi-dev openmpi-bin
libxml2-dev byacc openjdk-7-jdk make

17
XcalableMP Workshop

2013/11/01

インストール方法(2)Linux x86_64システム上での実行手順(Coarray機能を使わない場合)
1. 必要に応じ、前提PPのパスを設定
2. configure, makeの実行e.g.) $ ./configure --prefix=/home/you/XMP$ make$ make install

18
XcalableMP Workshop

2013/11/01

インストール方法(3)※Coarray機能(GASNet)を使う場合のインストール例(Linux x86_64 gnuコンパイラ+ Infiniband)
1. GASNetのダウンロード
http://gasnet.cs.berkeley.edu/GASNet-1.20.2.tar.gz
2. GASNetのインストール$ tar xvzf GASNet-1.20.2.tar.gz$ cd GASNet-1.20.2$ ./configure --enable-ibv --prefix=（GASNetのインストール場所）
出力結果が、OpenIB/OpenFabrics IB Verbs network conduit (ibv) ON となっていることを確認。
$ make$ make install
3. XcalableMPのインストール$ ./configure --prefix=（XMPのインストール場所） ¥--with-gasnetDir=（GASNetのインストール場所）¥--with-gasnet-conduit=ibv$ make$ make install

19
XcalableMP Workshop

2013/11/01

講習会活動• 2回のXcalableMP利用講習会を実施済み。
日時:7/18, 9/13 10:00～16:00
内容：1) XcalableMP概要
2) reflect指示文を使ったステンシル計算の演習
3) Coarray記法を使った行列積計算の演習
講習会資料は、以下で公開済み。
http://www.hpcs.cs.tsukuba.ac.jp/omni-compiler/xcalablemp/document.html• 今後の予定
第3回XcalableMP利用講習会
日時：12/4(水) 10:00～16:00
場所：FOCUS 2F実習室

20
XcalableMP Workshop

2013/11/01

課題• リリース済み規格仕様の早期キャッチアップ。
• 外部ライブラリ，ツール連携の強化。
• 64bitインデックス対応。

21
XcalableMP Workshop

2013/11/01

まとめ• 開発概要の説明- SC13で，ver. 0.7.0をリリース予定• Omni XcalableMP Compilerの特徴- XMP <-> MPI 呼び出しが可能- プロファイリングツールScalasca, tlog連携機能が使用可能- 外部ライブラリインターフェースが使用可能• Omni XcalableMP Compilerの構造と使い方- コンパイルの流れ，方法，インストール手順を示した。
• 講習会活動- 次回は，12/4開催予定。