PSI3-1 研究開発状況

PHASE:超並列化とスケルトンコード開発
2008-02-19
富士通株式会社
小松
第一原理分子動力学(PHASE)とは
・第一原理(量子力学)による固体(半導体
等)の電子状態計算を通じて、多様な物性・
機能をナノ構造から予測・解明
超並列化の目的
・各CPUへのデータ分散・演算分割を最適化
することにより、大規模問題を高速に処理
(~数万原子規模)
2
第一原理分子動力学(PHASE)の処理の流れ
・PHASEでは3つの部分に負荷が集中:
初期原子配置・電子波動関数を用意
全エネルギー(ハミルトニアン)の計算
電子の
収束ループ
原子の
収束ループ
高負荷部(カーネル):
↓
3次元FFT
(複雑な通信あり)
1%
ハミルトニアンによる電子波動関数の
補正計算
擬ポテンシャル積
66%
補正された電子波動関数の直交化
Gram-Schmidt
直交化 33%
原子に働く力の計算
↑
[%は大規模問題
での演算比率]
力にもとづいて原子を移動
力が0になれば終了
3
PHASE の超並列化の方針(2次元分割)
・オリジナルの1次元分割では Gram-Schmidt 直交
化
の前後で大域的な転置転送 (波数・バンド間の
transpose 転送による並列化軸変更) が入り、
数万プロセスでの超並列化では効率が著しく低下
↓
・波数・バンド両方向の2次元分割を行い、GramSchmidt直交化部と他の部分で共通の分割による
並列化を行うことによって、転置転送を回避でき、
かつ、少ない原子数のデータで高並列度を得る
ことができる。
・さらにGram-Schmidt直交化部の allreduce転送量
を(1/バンド分割数)に削減が可能。
4
PHASE 結合カーネルコードの作成
・PHASE カーネルコードを結合する以下の部分を作成し、
全体結合コードを作成した。
[波動関数データの並べ替え部]
(1) 波数方向の並べ替え転送部
(大きさ順→デカルト座標順)
:3次元FFT を適用するために
波数の並べ替えが必要
(2) 波数方向の並べ替え転送部
(デカルト座標順→大きさ順)
:波数のカットオフを導入する
ために波数の並べ替えが必要
(3) バンド方向の並べ替え用
インデックス作成部
:バンドを固有値順に並べ替える
インデックスを作成
(直交化のために必要)
(4) バンド方向の並べ替え転送部 :インデックスに従いバンド方向
(固有値の大きさ順)
に並べ替える
5
PHASE 結合カーネルの PrimeQuest 実測
・ 1024 MPI並列での実行時間 :(ピーク性能比 28%~38%)
ケース1:バンド数 16,384 ; ケース3 : バンド数 4,096
ケース2 : バンド数 8,192
・バンド並列数=4 → allreduce転送量を1/4に削減
実行時間(sec)
PrimeQuest 実行時間
400
350
300
250
200
150
100
50
0
通信時間
演算時間
1
2
問題規模
3
6
PHASE 結合カーネルの PrimeQuest 実測
・ 1024 MPI並列での実行時間の内訳 :
ケース1:バンド数 16,384 ; ケース3 : バンド数 4,096
ケース2 : バンド数 8,192
実行時間(sec)
PrimeQuest 実行時間内訳
400
350
300
250
200
150
100
50
0
並べ替え
FFT
Gram-Schmidt
擬ポテンシャル積
1
2
問題規模
3
7
PHASE のスケルトン化の方針
・小規模問題から大規模問題をシミュレートする
スケーリングパラメタを導入してスケルトンコードを作成
↓
・小規模問題と同じ使用メモリ量のスケルトンコード
を本番と同じ並列度で実行し、高並列実行時の
転送負荷と大規模問題の演算時間を再現:
-通信ログ生成関数 LMPI に、スケールさせた通信量を指定
-演算時間の指定関数 BSIM_Add_time に、スケールさせた
演算時間を指定
- 通信回数のスケーリングが必要な部分には、do ループに
スケール因子を挿入
8
PHASE のスケルトン化(1)
・オリジナルコード (PHASE 結合カーネルコード):
nnn=Nfp*Nep
call MPI_BCAST(PSI2,nnn,MPI_DOUBLE_COMPLEX,Irank,
&
NCOM2(1),ierr)
→ 通信ログ生成関数 LMPI に
do 42 nb=1,Nblk
置き換え
nbss=(nb-1)*Ni+myir+1
if(nbss .le. (Ne-1)/Nep+1 .and. nbss .ge. nbs+1) then
call zgemm('C','N',Nep,Nep,Nfp,z1,PSI2(1,1),Nfp,
&
PSI(1,1,nb),Nfp,z0,CC(1,1,nb),Nep)
endif
→ 演算時間の指定関数
42 continue
BSIM_Add_time に置き換え
nnn=Nep*Nep*(Nblk-nbsn+1)
call MPI_ALLREDUCE(CC(1,1,nbsn),CCW(1,1,nbsn),nnn,
&
MPI_DOUBLE_COMPLEX,
→通信ログ生成関数 LMPI に
&
MPI_SUM,NCOM(1),ierr)
置き換え
9
PHASE のスケルトン化(2)
・小規模問題から大規模問題をシミュレートする
スケーリングパラメタ (Nescale, Nfscale) を導入して
スケルトンコードを作成:
nnn=Nfp*Nep*Nfscale*Nescale
call LMPI_BCAST(ZPSI2,nnn,MPI_DOUBLE_COMPLEX,Irank,
&
NCOM2(1),ierr)
← 通信ログ生成関数 LMPI に、
mx=(Nep*Nescale-1)/32+1
スケールさせた通信量を指定
nx=((Nep*Nescale-1)/256+1)*8
jx=(Nfp*Nfscale-1)/32+1
time_val=7.9d-8+mx*(0.512d-6*jx+1.141d-6*nx
&
+0.666d-6*jx*nx)
演算時間の指定関数
time_val=time_val/2.0d+0*Nblk
BSIM_Add_time に
call BSIM_Add_time(time_val) ← スケールさせた演算時間を指定
nnn=Nep*Nep*(Nblk-nbsn+1)*Nescale*Nescale
call LMPI_ALLREDUCE(ZCC,ZCCW,nnn,
&
MPI_DOUBLE_COMPLEX, ←通信ログ生成関数 LMPI に、
&
MPI_SUM,NCOM(1),ierr)
スケールさせた通信量を指定
10
まとめ
・PHASE カーネルコードを結合する並べ替え転送部分を追加作成し、
超並列の全体結合コードを作成し、PrimeQuest 1024 並列性能を実証した。
・超並列化(2次元分割)によって、カーネル間の並べ替え転送が
発生するが、転送量を少量におさえることができる。
→ コード全体の超並列化方法として有効な方法になっている。
PrimeQuest 1024並列の実測で並べ替えの負荷を3%程度に
抑制できる。
・カーネル部の最大転送量を1次元分割の1/4(=1/バンド分割数)
に抑えることができ、1次元分割よりも効率的
→ PrimeQuest 1024並列の実測で、通信時間を全実行時間の
半分程度に抑えることが可能
・上記の結合コードをもとに、スケルトン化を実施した。
→演算部および通信部をログ生成用関数に置き換え、
高並列 (4096並列) のシミュレーション用スケルトンコードを作成した。
→BSIM、NSIM へ入力可能とした。
11