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
© Copyright 2024 ExpyDoc