富士通C++コンパイラの
性能向上の取り組み
2013年9月27日
富士通株式会社
ミドルウェア事業本部
アプリケーションマネジメント・ミドルウェア事業部 第四開発部
千葉 修一
富士通C++コンパイラ
C++コンパイラの概要
C++コードに対する課題
最適化の拡張
性能状況
OpenFOAM
FX10向けOpenFOAM
OpenFOAM構築
OpenFOAM利用
OpenFOAMの性能改善
流体解析ヘルプデスク(OpenFOAM)
Agenda
製品名
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
C++コンパイラの概要
* 「京」は独立行政法人理化学研究所の登録商標です。
アプリケーション実行性能における問題
C++コードに対する課題
(sec) 0.00 5000.00 10000.00 15000.00 20000.00 25000.00 30000.00 35000.00 富士通C++ 2012/09 GNU C++ 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 OpenFOAM 2.1.0 付属 チュートリアルコード 13本選出における性能比較で、2.3倍差 2.3倍差 ※性能測定は、FX10を利用
最適化機能の改善計画
C++コードに対する課題
開発言語共通 最適化機能 C++言語仕様 最適化機能 C++コード 最適化機能 特殊なコード 最適化機能 Base Function 1st Ext. 2nd Ext. 3rd Ext. Fortran/C/C++共通汎用最適化 ハードウェア向け最適化 インライン展開の強化 STLport 5.0.0 fast modeの開発 効果: テンプレート、operator、etc. 再帰向けインライン展開の強化 スケジューリングの改善 効果: 再帰型テンプレート コード一括変換型最適化 ループの多段変形 効果: CRTP、ガウスザイデル法 smoother 2012/09 2013/09 2014/03 2014/09
C++機能に対する最適化状況
C++コードに対する課題
C++ 技術 最適化機能 対応状況・予定 base '12/09 1st '13/09 2nd '14/03 3rd '14/09 クラス コンストラクタ/デストラクタ分岐削除 × △ △ ○ 例外処理 unwindライブラリ ○ ○ ○ ○ 自動インライン インライン属性 ユーザ指示インライン展開 × △ ○ ◎ STL SPARCアーキテクチャ対応によるSTLport 5.0.0 fast mode × △ △ ◎ 多重継承 テンプレート operator インライン展開、 ローカルスケジューリング × △ ○ ◎ 再帰型テンプレート 再帰向けインライン展開 × × △ ○ CRTP、仮想関数 フレンド関数 型変換解析、仮想関数テーブル除去 特殊属性インライン展開 × × × ○ ポインタ、構造体 依存解析、PointerValueResolution × △ △ ○ ×:未着手 △:50%対応完了 〇:90%対応完了(g++レベル) ◎:対応完了
最適化の拡張
Memory pool allocate/deallocate instance Base Function 1st Extension Memory pool allocate/deallocate instance :Lock Object 排他用オブジェクトの再利用 排他論理のC&Sに変更 高速モードオプションを追加
STLport 5.0.0 fast mode
SPARCアーキテクチャ向けチューニングによる高速化を実現
Lock Objectの生成オーバ ヘッドが高い
pthreadを利用したライブラリ・ レベルの排他
再帰型テンプレート
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;
最適化の拡張
再帰型テンプレート
再帰呼び出し向けのインライン展開による即値の伝搬
Base Functioncall 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 完全なインライン展開 即値を設定 すべて別名関数 部分特殊化の利用
最適化の拡張
三角形 : 正多角形
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
仮想関数
最適化の拡張
call calcArea Base Function 3rd Extension vtable (仮想関数テーブル) Polygon::calcArea
仮想関数
仮想関数テーブルの削除により即値を伝搬
calcArea() { ・・・ } Triangle search calcArea Polygon getArea() { ・・・ } 5000 inline Polygon getArea() { ・・・ } calcArea() { ・・・ } Triangle inline オーバライドの検出 仮想関数テーブルの削除 インライン展開の強化 即値を設定 仮想関数テーブルによる 間接アクセス
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);
Polygon getArea() { //キャスト呼び出し static_cast<T&>(*this) }
最適化の拡張
CRTP:Curiously Recurring Template Pattern
型変換解析の強化による即値の伝搬
call calcArea Base Function 3rd Extension Polygon getArea() { //キャスト呼び出し static_cast<T&>(*this) } 5000 型変換解析の強化 インライン展開の強化 calcArea() { ・・・ } Triangle call getArea inline calcArea() { ・・・ } Triangle inline 即値を設定 アドレスに対する型変換
コーディングスタイルによる性能の変化
コーディングスタイルの異なるC++コードの姫野ベンチを作成し、実行性能
の変化を計測 ※ 富士通C++、GNU C++ともに同じ傾向
最適化の拡張
チューニングのポイントは、コーディングスタイルにもある 0 200 400 600 800 1000 1200 1400 1600himenoBMT type 1 himenoBMT type 2 himenoBMT type 3
1572.56 55.82 38.73 type 1 (Fortranコード ライク) 配列アクセスを利用したコード type 2 (C言語コード ライク) ポインタアクセスを利用したコード type 3 (C++コード ライク) テンプレートを利用したコード (MFLOPS) ※性能測定は、FX10を利用
アプリケーション実行性能
性能状況
OpenFOAM 2.1.0 付属 チュートリアルコード 13本選出における性能比較 0 5,000 10,000 15,000 20,000 25,000 30,000 35,000 富士通C++ 2012/09 富士通C++ 2013/09 富士通C++ 2014/09 GNU C++ 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 (sec) コンパイルオプション -O3 -Xg -Klib -Krdconv-Kfp_contract -Nstl=500fast
※ チュートリアルによっては、 FPEが発生する場合あり
0 10 20 30 40 50 60 70 80 90 100 富士通C++ 2012/09 富士通C++ 2013/09
アプリケーション翻訳性能
性能状況
36 % 性能改善 OpenFOAM 2.1.0 付属 チュートリアルコード 177本選出における性能比較 (%) ※性能測定は、FX10を利用FX10向けOpenFOAM
FX10におけるOpenFOAMの取り組み
FX10は市販(ISV)アプリの動作実績が少ないため、OSS(流体解析分野では
OpenFOAM)を強化。
OpenFOAMの調査・分析を行い、コンパイラ改善、性能改善を実施し、FX10
向けに提供
東京大学)情報基盤センター様 FX10 (Oakleaf-FX)の状況
OpenFOAMのリリース状況
実行確認は、OpenFOAM tutorialsを使用。2.1.0/2.1.1は、560ケース中557の走行を 確認(3ケースはIA Intelコンパイラと同等)。 2.2.0はアプリケーションバグが多く、2.2.1で確認作業を実施中。 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構築
(東大情報基盤センター様 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で動作確認
Oakleaf-FXでの環境設定 (Environment Modules を利用)
利用可能なライブラリ・アプリを表示 (ログインノードとインタラクティブノードで異なる)
OpenFOAM 2.2.1の環境を設定
利用例
OpenFOAM用メッシュの作成(blockMesh snappyHexMesh、その他)
パラメタ、モデル設定等、実行スクリプト準備
ジョブ投入 (Oakleaf-FX : pjsub:投入 , pjstat:確認)
ポスト処理(Paraview等)
[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
Foam::GaussSeidelSmoother::smooth() • 3~4回転のループがソフトウェアパイプライニングされているため、4回転以下の場合は、ループ内容を展 開したルートを通るようにコード変更。実行時間が、51.66秒→32.14秒に短縮 プロセス間リダクション演算にTofuバリア機構を利用 • プロセス間リダクション演算がMPI_Send/Recvで実装されている。 MPI_Allreduceを使用するバイパスルートを追加 。対象関数: Foam::reduce() 平方根演算のコスト削減 • 平方根演算が多いが、逆数近似命令が使用されていないため、翻訳オプション -Klib,fp_relaxedを適用。 ※ FPEで異常終了する事もあり注意が必要