富士通 C++ コンパイラの 性能向上の取り組み 2013 年 9 月 27 日富士通株式会社ミドルウェア事業本部アプリケーションマネジメント ミドルウェア事業部第四開発部千葉修一
Agenda 富士通 C++ コンパイラ C++ コンパイラの概要 C++ コードに対する課題 最適化の拡張 性能状況 OpenFOAM FX10 向けOpenFOAM OpenFOAM 構築 OpenFOAM 利用 OpenFOAMの性能改善 流体解析ヘルプデスク (OpenFOAM) 1
富士通 C++ コンパイラ 2
C++ コンパイラの概要 製品名 Parallelnavi for MP10 - 京 向け Technical Computinig Suite - PRIMEHPC FX10 向け 仕様 ISO/IEC 14882:2003 規格 GNU C++ コンパイラ仕様 ( 一部 ) Standard Template Library: STLport 5.0.0 / 5.2.1 / 5.0.0 fast mode 機能 逐次最適化機能インライン展開 ループ最適化 SIMD 化 ソフトウェアパイプライニング etc. 並列化機能自動並列化 OpenMP API Version 3.0 May 2008 * 京 は独立行政法人理化学研究所の登録商標です * スーパーコンピュータ 京 は 独立行政法人理化学研究所と富士通の共同開発です 3
C++ コードに対する課題 アプリケーション実行性能における問題 (sec) 35000.00 30000.00 25000.00 20000.00 2.3 倍差 multiphase/interdymfoam/ras/sloshingtank3d multiphase/multiphaseinterfoam/laminar/dambreak4phase multiphase/interfoam/ras/dambreak multiphase/mrfmultiphaseinterfoam/mixervessel2d incompressible/mrfsimplefoam/mixervessel2d heattransfer/buoyantsimpleradiationfoam/hotradiationroom heattransfer/buoyantpimplefoam/hotroom heattransfer/buoyantboussinesqpimplefoam/hotroom compressible/rhoporousmrfpimplefoam/mixervessel2d combustion/pdrfoam/flamepropagationwithobstacles DNS/dnsFoam/boxTurb16 basic/potentialfoam/pitzdaily 15000.00 10000.00 5000.00 0.00 富士通 C++ 2012/09 GNU C++ 性能測定は FX10 を利用 OpenFOAM 2.1.0 付属チュートリアルコード 13 本選出における性能比較で 2.3 倍差 4
C++ コードに対する課題 最適化機能の改善計画 特殊なコード最適化機能 コード一括変換型最適化 ループの多段変形効果 : CRTP カ ウスサ イテ ル法 smoother C++ コード最適化機能 C++ 言語仕様最適化機能 再帰向けインライン展開の強化 スケジューリングの改善効果 : 再帰型テンプレート インライン展開の強化 STLport 5.0.0 fast mode の開発効果 : テンプレート operator etc. 開発言語共通最適化機能 Base Function 1st Ext. 2nd Ext. 3rd Ext. 2012/09 2013/09 2014/03 2014/09 Fortran/C/C++ 共通汎用最適化 ハードウェア向け最適化 5
C++ コードに対する課題 C++ 機能に対する最適化状況 C++ 技術 最適化機能 base '12/09 対応状況 予定 1st '13/09 2nd '14/03 クラスコンストラクタ / デストラクタ分岐削除 例外処理 unwind ライブラリ 自動インラインインライン属性 STL 多重継承テンプレート operator 3rd '14/09 ユーザ指示インライン展開 SPARC アーキテクチャ対応による STLport 5.0.0 fast mode インライン展開 ローカルスケジューリング 再帰型テンプレート再帰向けインライン展開 CRTP 仮想関数フレンド関数 型変換解析 仮想関数テーブル除去特殊属性インライン展開 ポインタ 構造体依存解析 PointerValueResolution : 未着手 :50% 対応完了〇 :90% 対応完了 (g++ レベル ) : 対応完了 6
最適化の拡張 STLport 5.0.0 fast mode SPARCアーキテクチャ向けチューニングによる高速化を実現 Base Function instance 1st Extension allocate/deallocate Memory pool :Lock Object Lock Object の生成オーバヘッドが高い pthread を利用したライブラリ レベルの排他 allocate/deallocate Memory pool 排他用オブジェクトの再利用 排他論理の C&S に変更 高速モードオプションを追加 instance 7
最適化の拡張 再帰型テンプレート 1 から 10 までの数字の合計を算出するプログラム Num template< int S, int E > class Num // S: start, E: end { public: static const int status = (S < E)? 1 : 0; static int getsum() { return S + Num< status*(s+1), status*e >::getsum(); } template<> class Num< 0, 0 > // Partial template specialization { public: static int getsum() { return 0; } // tail call main() { Num<1,10> n; cout << "sum=" << n.getsum() << endl ;; // sum=55 8
最適化の拡張 再帰型テンプレート 再帰呼び出し向けのインライン展開による即値の伝搬 Base Function call Graph int Num<N, I>::getSum() [with int S = 1, int E = 10] int Num<N, I>::getSum() [with int S = 2, int E = 10] int Num<N, I>::getSum() [with int S = 3, int E = 10] int Num<N, I>::getSum() [with int S = 10, int E = 10] int Num<N, I>::getSum() [with int S = 0, int E = 0] 2nd Extention call Graph すべて別名関数 部分特殊化の利用 55 完全なインライン展開 即値を設定 9
最適化の拡張 仮想関数 基底クラス :Polygon を持つ Triangle の面積算出プログラム 三角形 : 正多角形 class Polygon { private: int side; virtual int calcarea(int side) = 0; public: int getarea() { return calcarea(side); } class Triangle : public Polygon { private: int calcarea(int side) { return side * side / 2; } int main(int argc, char *argv[]) { Triangle t(100); cout << "triangle area=" << t.getarea() << endl ;; // 5000 10
最適化の拡張 仮想関数 仮想関数テーブルの削除により即値を伝搬 Base Function Polygon getarea() { } search calcarea vtable ( 仮想関数テーブル ) Polygon::calcArea call calcarea Triangle calcarea() { } 3rd Extension 5000 Polygon 仮想関数テーブルによる間接アクセス Triangle inline getarea() { } inline calcarea() { } 即値を設定 11 オーバライドの検出 仮想関数テーブルの削除 インライン展開の強化
最適化の拡張 CRTP:Curiously Recurring Template Pattern 基底クラス :Polygon を持つ Triangle の面積算出プログラム 三角形 : 正多角形 template<class T> class Polygon { private: int side; public: int getarea() { return static_cast<t&>(*this).calcarea(side); } class Triangle : public Polygon<Triangle> { public: int calcarea(int side) { return side * side / 2; } int main(int argc, char *argv[]) { Triangle t(100); cout << "triangle area=" << t.getarea() << endl ;; 12
最適化の拡張 CRTP:Curiously Recurring Template Pattern 型変換解析の強化による即値の伝搬 Base Function 3rd Extension call getarea Polygon getarea() { // キャスト呼び出し static_cast<t&>(*this) } call calcarea Triangle calcarea() { } アドレスに対する型変換 5000 Polygon Triangle 即値を設定 inline getarea() { // キャスト呼び出し static_cast<t&>(*this) } inline calcarea() { } 型変換解析の強化 インライン展開の強化 13
最適化の拡張 コーディングスタイルによる性能の変化 コーディングスタイルの異なるC++ コードの姫野ベンチを作成し 実行性能の変化を計測 富士通 C++ GNU C++ ともに同じ傾向 (MFLOPS) 1600 1400 1200 1000 800 type 1 (Fortran コードライク ) 配列アクセスを利用したコード type 2 (C 言語コードライク ) ポインタアクセスを利用したコード type 3 (C++ コードライク ) テンプレートを利用したコード 600 400 200 0 1572.56 55.82 38.73 himenobmt type 1 himenobmt type 2 himenobmt type 3 チューニングのポイントは コーディングスタイルにもある 性能測定は FX10 を利用 14
性能状況 アプリケーション実行性能 (sec) 35,000 30,000 25,000 20,000 15,000 10,000 multiphase/interdymfoam/ras/sloshingtank3d multiphase/multiphaseinterfoam/laminar/dambreak4phase multiphase/interfoam/ras/dambreak multiphase/mrfmultiphaseinterfoam/mixervessel2d incompressible/mrfsimplefoam/mixervessel2d heattransfer/buoyantsimpleradiationfoam/hotradiationroom heattransfer/buoyantpimplefoam/hotroom heattransfer/buoyantboussinesqpimplefoam/hotroom compressible/rhoporousmrfpimplefoam/mixervessel2d combustion/pdrfoam/flamepropagationwithobstacles DNS/dnsFoam/boxTurb16 basic/potentialfoam/pitzdaily basic/laplacianfoam/flange コンパイルオプション -O3 -Xg -Klib -Krdconv -Kfp_contract -Nstl=500fast 5,000 0 富士通 C++ 2012/09 富士通 C++ 2013/09 富士通 C++ 2014/09 GNU C++ チュートリアルによっては FPE が発生する場合あり 性能測定は FX10 を利用 OpenFOAM 2.1.0 付属チュートリアルコード 13 本選出における性能比較 15
性能状況 アプリケーション翻訳性能 (%) 100 90 80 70 60 50 40 30 20 10 0 36 % 性能改善 富士通 C++ 2012/09 富士通 C++ 2013/09 性能測定は FX10 を利用 OpenFOAM 2.1.0 付属チュートリアルコード 177 本選出における性能比較 16
OpenFOAM 17
FX10 向け OpenFOAM FX10 における OpenFOAM の取り組み FX10 は市販 (ISV) アプリの動作実績が少ないため OSS( 流体解析分野では OpenFOAM) を強化 OpenFOAM の調査 分析を行い コンパイラ改善 性能改善を実施し FX10 向けに提供 東京大学 ) 情報基盤センター様 FX10 (Oakleaf-FX) の状況 OpenFOAM のリリース状況 OpenFOAM Version 公開日最終更新日 2.1.0 2012/4/2 2013/3/18 9/26 迄デフォルト 2.1.1 2013/2/22 2013/3/18 2.2.0 2013/3/18 2013/5/30 2.2.1 2013/9/28-9/28 以降のデフォルト 実行確認は OpenFOAM tutorials を使用 2.1.0/2.1.1 は 560 ケース中 557 の走行を確認 (3 ケースは IA Intel コンパイラと同等 ) 2.2.0 はアプリケーションバグが多く 2.2.1 で確認作業を実施中 18
OpenFOAM 構築 ( 東大情報基盤センター様 FX10) 構築方法 東大センター (Oakleaf-FX) の利用支援ポータルから FX10 用 OpenFOAM のパッチと構築手順のダウンロードが可能 (Oakleaf-FX のアカウントが必要 ) FX10 の開発環境は ログインノードと計算ノードで環境が異なる ログインノード : IA 機 - x86, FJ クロスコンパイラ, リトルエンディアン 計算ノード : FX10 - SPARC, FJ オウンコンパイラ, ビックエンディアン 1) OpenFOAM と Third-Party をダウンロード 2) Third-Party はオウンコンパイラで構築 3) OpenFOAM はクロスコンパイラで構築 4) tutorials で動作確認 19
OpenFOAM 利用 ( 東大情報基盤センター様 FX10) Oakleaf-FX での環境設定 (Environment Modules を利用 ) 利用可能なライブラリ アプリを表示 ( ログインノードとインタラクティブノードで異なる ) OpenFOAM 2.2.1 の環境を設定 利用例 [user@fx10 ~]$ module avail -------------- /usr/local/share/modules/modulefiles/apps -------------- OpenFOAM/2.1.0(default) OpenFOAM/2.2.0 OpenFOAM/2.2.1 : : [user@fx10 ~]$ module load OpenFOAM/2.2.1 [OpenFOAM 2.2.1を設定 ] [user@fx10 ~]$ module list [ 環境設定されたことを確認 ] Currently Loaded Modulefiles: 1) TCSuite/GM-1.2.1-06 2) OpenFOAM/2.2.1 OpenFOAM 用メッシュの作成 (blockmesh snappyhexmesh その他 ) パラメタ モデル設定等 実行スクリプト準備 ジョブ投入 (Oakleaf-FX : pjsub: 投入, pjstat: 確認 ) ポスト処理 (Paraview 等 ) 20
OpenFOAM の性能改善 0 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 210 220 230 240 250 利用頻度の高い tutorials を選定し性能改善を実施中 チュートリアル名内容問題規模 motorbike 風環境解析 34 万格子 ( 逐次実行 ) hotroom 定常熱流体解析 4 千格子 ( 逐次実行 ) multiregionheaterradiation 伝熱連成解析 3 千格子 ( 逐次実行 ) propeller 回転機械解析 57 万格子 (4 並列実行 ) buoyantboussinesqsimplefoam 定常熱流体解析 - Foam::GaussSeidelSmoother::smooth() 3~4 回転のループがソフトウェアパイプライニングされているため 4 回転以下の場合は ループ内容を展開したルートを通るようにコード変更 実行時間が 51.66 秒 32.14 秒に短縮 プロセス間リダクション演算に Tofu バリア機構を利用 プロセス間リダクション演算が MPI_Send/Recv で実装されている MPI_Allreduce を使用するバイパスルートを追加 対象関数 : Foam::reduce() 平方根演算のコスト削減 平方根演算が多いが 逆数近似命令が使用されていないため 翻訳オプション -Klib,fp_relaxed を適用 FPE で異常終了する事もあり注意が必要 今後も性能改善を継続し OpenFOAM チューニング版の情報提供を予定 100% 90% 80% 70% 60% 50% 40% 30% 20% 10% 0% 演算 一対一通信完了待ち ランク 集団通信開始待ち その他の通信 パフォーマンス解析 21
流体解析ヘルプデスク (OpenFOAM) サービス一覧 導入サービスインストール 動作チェック 標準ソルバー simplefoam のカスタマイズ例 定常の濃度移流拡散方程式 Q&A サービス e-mail により技術的なご質問回答 教育サービス操作講習 理論解説 等お客様のニーズ応じたコースを提供 受託開発サービス方程式の組込み等 アプリのカスタマイズを実施 受託解析サービス十分に経験を積んだ技術者がお客様の解析を代行 現在は IA サーバのみサポート対象 1 トップレベルソースコード simple.c に以下を挿入 solve ( fvm::div(phi, C) ==fvm::laplacian(turbulence->nueff(), C) ); 2 ヘッダーファイル createfield.h を編集 3 新ソルバーをビルド simplefoam の流れ場と完全に一致 ホームページ http://jp.fujitsu.com/solutions/hpc/tccloud/helpdesk/openfoam.html 追加した濃度の移流拡散方程式が正常に機能 22
23 Copyright 2010 FUJITSU LIMITED