*ここに掲載するのは、エジンバラ大学 EPCCのD.M.Scott博士らによるHECToRレポート「Performance Enhancement and Optimization of the TPLS and DIM Two-Phase Flow Solvers, D.M.Scott, L.Ó Náraigh, I.Bethune, P.Valluri, P.D.M.Spelt, 19th June 2013」を要約したものです。
概要
このレポートは2012年7月1日から2013年4月30日まで行われたプロジェクトの報告です。Lennon Ó NáraighおよびPrashant Valluri両博士によりTPLS:二相流ナビエストークス流体ソルバーが開発されました。これはレベルセット法(一般的な説明は文献[1]を参照してください)を用い、流速ベクトルや圧力場の様な流れ場情報に加えて3D界面の動的な時間発展を計算します。これはチャネル構造における二相層流を正確に記述します。このコードはハイブリッドOpenMP/MPI並列手法を用い、8百万グリッドを用いる場合は1,000コア迄良好なスケール性を示します。このコードは、炭素吸着やその保存、その他と同様な石油・ガス工業において興味が持たれている実用的な問題の理解のために利用出来ます。さらに、二相流の界面不安定性の理論的な解析にも用いられます。しかしながらより正確に、またより広く長いチャネルをモデル化するには、より大規模なグリッドが必要です。そこには1,000コアを超える良好な効率と、その結果としての実行時間の短縮を如何にして実現するか、という問題が有りました。このレポートはコードのスケーラビリティの改善と、計算において最も高負荷な圧力ソルバーの最適化について報告します。
両博士は界面を捕捉するための拡散界面法(DIM)を用いた二相ナビエストークスソルバーも開発しました。これはpure-OpenMPコードで、大規模なコア数を利用出来ません。これに対し、TPLSと同様なMPI並列化を計画しましたが、プロジェクト期間内には完了しませんでした。
このプロジェクトの当初の目的は、TPLSとDIMに対してHECToR上で少なくとも24Mグリッドポイントを用いたシミュレーションを可能にすることでした。
目標は以下の2つでした:
·TPLS内の通信オーバーヘッドの削減。OpenDuct1ケース(512x144x152グリッド、11.2Mポイント、レイノルズ数=100)で、1,000コア上で少なくとも10%高速化すること。
·既存のSOR法をPETScライブラリへ置き換える。これは共役勾配法の実装よりも作業時間は増えますが、多様なクリロフ法とプレコンディショナの利用が可能になります。
作業の成果は以下の通りです:
·出力を除外すれば、目標1では12%の高速化が達成されました。
·手法の違いから直接的な比較は困難ですが、25,000時間ステップのシミュレーションで出力を除外すれば、目標2に対して32%高速化しました。圧力計算のみに着目すれば54%の高速化が達成されました。PETScによる圧力ソルバーは、1,024から2,048へコア数を増やした場合に、既存コードよりも優れた強スケール性を示しました。弱スケール性は以前と変わらず優秀な結果を示しました。
ここで示す結果は全てgfortan 4.7.2に-O3フラグを用いたものです。PETScバージョンは3.3です。全ての時間単位は秒で表しています。用いたHECToRはフェーズ3です。
既存コード
既存コードは圧力の計算に、ヤコビ法とSOR法を組み合わせて解いています。一回の繰り返しは、レッドとブラック部の更新間に一回のヤコビステップを用いたred-black SORスキームから成ります。残差情報は生成されますが繰返しの制御には用いず、そのかわりに固定した繰り返し数で制御します。最初の1万時間ステップ毎に対して、圧力ソルバーでは1000回の繰り返しが実行されます。その後は時間ステップ当たり300回の繰り返しを行います。
一つの境界条件がクリロフ法に適したもので有りませんでした。そのため標準的なノイマン条件へコード修正が行われましたが、結果には影響は有りませんでした。
·MPIとOpenMPのトレードオフ
TPLSは2D領域分割を用いており、ベンチマークではx、y方向はMPI並列を行い、z方向は一つのMPIプロセスで実行します。
ここで、境界条件の変更は殆ど性能に影響を与えませんでした。
特徴的なのは、MPIプロセス当たり一つのOpenMPスレッドのみを用いた場合には、性能が向上したことです。HECToRフェーズ3のGeminiインターコネクトは、ノード当たりより多くのMPIプロセスからの通信トラフィックを維持することが出来るためです。また、注意すべきは出力に多くの時間が占められていることです(50%を超える場合が有ります)。以下では断りの無い限り、MPIプロセスに対して一つのOpenMPスレッドを用いることとします。
·既存コードのスケール性能
強スケール性とは、問題サイズを固定した場合にコア数に対してコード性能が如何に振る舞うかに関連します。一方、弱スケール性は、問題サイズがコア数に比例する場合に(つまりコア当たりの領域サイズが一定)コード性能が如何に振る舞うかを示します。
出力処理については、マスタープロセスにデータを集約してから出力するシリアル形式のためスケールしません。計算部(出力以外のコード)では弱スケール性は極めて優れています(1024コアと2048コアで比較すると効率[実行時間の比]は1)。強スケール性はそれほどでもありません(効率[実行時間×コア数の比]は0.5から0.7)。これは計算コストに対してハロ交換コストが増加するためです。
MPIとOpenMPの最適化
冗長なMPIバリアやOpenMP集団操作を削除し、OpenMP指示行のチューニングを施した修正版を実装しました。通信をオーバーラップさせてレイテンシーを削減するために、ノンブロッキング1対1通信も実装しました。
OpenMPスレッドは効果はなく、ノンブロッキング送受信の効果により、1024コアを用いた場合は最大12%の高速化が観察されました。
PETScバージョンのTPLS
既存コードの圧力ソルバーを、PETScライブラリルーチンを呼び出すように置き換えました。既存コードではx,y座標でしか並列化されていません。PETScライブラリはC言語で記述されていますがFortran90インターフェイスを持ちます。
クリロフソルバーの初期化時には、各時間ステップ毎にデータを展開する際に、そのデータは残りのコードのデータに合わせて再配置させなくてはなりません。これは以下の理由によるものです:
・クリロフソルバーで用いられる境界条件は既存の圧力ソルバーで用いられるものと同じですが、その実装方法が異なります。例えば既存コードでは周期境界条件は、そのコピーとして追加されたグリッドポイントで扱われます。PETScライブラリでは、ユーザは周期境界条件を用いることをソルバーに伝えるだけです。このときPETScライブラリはユーザが関与しない仕組みで周期境界条件を実装しています。
・CとFORTRAN言語では配列レイアウトが異なるため、圧力配列の最初の2つの次元を交換しなくてはなりません。
このデータ再配置の性能への影響は大きなものではありませんでした。
PETScライブラリを用いて試験を行った結果、シミュレーションの初期ステージにおいて安定性に問題があることが判りました。唯一満足できるソルバーはGMRESGeneralisedMinimalResidual法ソルバーでした。共役勾配法は初期では収束しませんが、4000時間ステップ以降での利用は可能です。しかしながらそうした場合でさえ、GMRES以上に性能は改善しませんでした。このレポートの以下の結果は、ブロックヤコビ前処理とGMRES法を用いたものです。
実行に用いた収束条件は、前処理後の残差ノルムの相対的な減少値が0.0001未満となることとしました。PETScでは既存コードと同じく、ソルバーが用いる繰り返し回数を固定することはできませんが、その数を制限するように実装しました。
·スケール性能
1024コアと2048コアに対して512×144×152グリッドケースのベンチマークを行ったところ、最初の約4000ステップにおける収束に膨大な繰り返し数が必要となったため、弱スケール性が極めて貧弱な結果となりました。512×144×152の場合は1770回の繰り返しが必要となりますその後は実行終了まで各時間ステップ毎に14回です。残りの時間ステップのみを考慮すれば、圧力計算の効率は1です。
より大規模計算では22M個のグリッドポイントが必要になります。シミュレーション実績のある最大領域は27Mグリッドです。
·性能比較
1024コア上でのOpenMPスレッド数を変えた場合に、PETScバージョンと既存コードの比較を行いました。残差ノルムの検証から、シミュレーション結果の最終的な精度は一致していることを確認しました。
PETScはOpenMPをサポートしていないので、以前の結果と同様にOpenMPスレッドの効果はありません。出力を除いた場合には、最高で15%高速化しました。
1024及び2048コア上の512×144×152と1024×144×152ケースを用いたETScバージョンは、最初の5000時間ステップを除いた最後の20000時間ステップでは、強スケール効率は0.9、弱スケール効率は1となり、優れた効率を示しました。
既存コードで繰り返し数を固定して意味のある結果を出せた場合に、同様にPETScバージョンでも固定してみました。全体の検証は必要ですが、初期的な検証実験では性能向上を確認しました。1024コア上の512×144×152ケースの場合に、クリロフソルバーの繰り返し数を最大200に制限しました。この200は初期の繰り返し数増大が収まったのちの繰り返し数よりも1桁大きなものです。
25000時間ステップ計算の結果、PETScバージョンの圧力ソルバーは既存コードに比べ54%高速化しました。
結論
既存のヤコビ/SOR圧力ソルバーをPETScライブラリのクリロフ法へ置き換え、コード内のMPIおよびOpenMP並列の最適化を施し、物理的に意味のあるサイズ11M要素の計算において圧力ソルバーを約50%高速化しました。コードは20M要素以上まで優れた強/弱スケール性を示しました。
TPLSの動作に関する調査から、コード改善の余地が見つかりました。もっとも重要なものが、現状のシリアルI/Oの並列I/Oへの置き換えその例が文献3にありますです。これはスケール性能の向上のボトルネックであり、既存のテストケースでは半分以上の実行時間を占めています。また、この他の主要なコード部分である運動量ソルバーおよび界面ソルバーも、PETScライブラリの利用により効率化が可能です。これは性能向上とともに、PETScとTPLSデータ構造間の煩雑なデータコピーの必要性を解除して実行時間とメモリーオーバーヘッドを削減し、3D領域分割への移行の柔軟性をもたらします。この他、圧力ソルバーにマルチグリッド法を適用する事で性能改善が見込まれます。
この作業の結果、TPLSはオープンソースとして公開されました。コードは、https://sourceforge.net/projects/tpls/ から入手可能で、TPLSの改善が継続されています。
謝辞
このプロジェクトは、nAG Ltd.が運営するHECToRの分散計算科学および工学CSEサービスの基に実行されました。英国の国立スーパーコンピューティング・サービスである、HECToR:英国リサーチ・カウンシル・ハイエンド計算サービスは、リサーチ・カウンシルを代行するEPSRCが管理しています。そのミッションは英国学術界の科学および工学の研究支援です。HECToRスーパーコンピューターは、UoE HPCx Ltd.およびnAG Ltd.のCSEサポートサービスにより管理運営されています。
文献
[1] | S. Osher and R. Fedkiw, Level Set Methods and Dynamic Implicit Surfaces, Springer, 2003 |
[2] | H. Ding, P.D.M.Spelt and C. Shu, Diffuse interface model for incompressible two-phase flows with large density ratios, Journal of Computational Physics 226, 2078-2095 2007 |
[3] | . Johnson, I. Bethune, Adding Parallel I/O to PARA-BMU, HECToR dCSE Report, Oct 2012, http://www.hector.ac.uk/cse/distributedcse/reports/voxfe/voxfe.pdf |