富士通c++コンパイラの 性能向上の取り組み › materials ›...

24
Copyright 2013 FUJITSU LIMITED 富士通C++コンパイラの 性能向上の取り組み 2013年9月27日 富士通株式会社 ミドルウェア事業本部 アプリケーションマネジメント・ミドルウェア事業部 第四開発部 千葉 修一

Upload: others

Post on 03-Jul-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 富士通C++コンパイラの 性能向上の取り組み › materials › ws_openfoam_130927_slides...Foam::GaussSeidelSmoother::smooth() •3~4回転のループがソフトウェアパイプライニングされているため、4回転以下の場合は、ループ内容を展

Copyright 2013 FUJITSU LIMITED

富士通C++コンパイラの

性能向上の取り組み

2013年9月27日

富士通株式会社

ミドルウェア事業本部

アプリケーションマネジメント・ミドルウェア事業部 第四開発部

千葉 修一

Page 2: 富士通C++コンパイラの 性能向上の取り組み › materials › ws_openfoam_130927_slides...Foam::GaussSeidelSmoother::smooth() •3~4回転のループがソフトウェアパイプライニングされているため、4回転以下の場合は、ループ内容を展

Copyright 2013 FUJITSU LIMITED

富士通C++コンパイラ

C++コンパイラの概要

C++コードに対する課題

最適化の拡張

性能状況

OpenFOAM

FX10向けOpenFOAM

OpenFOAM構築

OpenFOAM利用

OpenFOAMの性能改善

流体解析ヘルプデスク(OpenFOAM)

Agenda

1

Page 3: 富士通C++コンパイラの 性能向上の取り組み › materials › ws_openfoam_130927_slides...Foam::GaussSeidelSmoother::smooth() •3~4回転のループがソフトウェアパイプライニングされているため、4回転以下の場合は、ループ内容を展

Copyright 2013 FUJITSU LIMITED

富士通C++コンパイラ

2

Page 4: 富士通C++コンパイラの 性能向上の取り組み › materials › ws_openfoam_130927_slides...Foam::GaussSeidelSmoother::smooth() •3~4回転のループがソフトウェアパイプライニングされているため、4回転以下の場合は、ループ内容を展

Copyright 2013 FUJITSU LIMITED

製品名 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++コンパイラの概要

* 「京」は独立行政法人理化学研究所の登録商標です。 * スーパーコンピュータ「京」は、独立行政法人理化学研究所と富士通の共同開発です。

3

Page 5: 富士通C++コンパイラの 性能向上の取り組み › materials › ws_openfoam_130927_slides...Foam::GaussSeidelSmoother::smooth() •3~4回転のループがソフトウェアパイプライニングされているため、4回転以下の場合は、ループ内容を展

Copyright 2013 FUJITSU LIMITED

アプリケーション実行性能における問題

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/sloshingTank3Dmultiphase/multiphaseInterFoam/laminar/damBreak4phasemultiphase/interFoam/ras/damBreakmultiphase/MRFMultiphaseInterFoam/mixerVessel2Dincompressible/MRFSimpleFoam/mixerVessel2DheatTransfer/buoyantSimpleRadiationFoam/hotRadiationRoomheatTransfer/buoyantPimpleFoam/hotRoomheatTransfer/buoyantBoussinesqPimpleFoam/hotRoomcompressible/rhoPorousMRFPimpleFoam/mixerVessel2Dcombustion/PDRFoam/flamePropagationWithObstaclesDNS/dnsFoam/boxTurb16basic/potentialFoam/pitzDaily

OpenFOAM 2.1.0 付属 チュートリアルコード 13本選出における性能比較で、2.3倍差

2.3倍差

※性能測定は、FX10を利用

4

Page 6: 富士通C++コンパイラの 性能向上の取り組み › materials › ws_openfoam_130927_slides...Foam::GaussSeidelSmoother::smooth() •3~4回転のループがソフトウェアパイプライニングされているため、4回転以下の場合は、ループ内容を展

Copyright 2013 FUJITSU LIMITED

最適化機能の改善計画

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

5

Page 7: 富士通C++コンパイラの 性能向上の取り組み › materials › ws_openfoam_130927_slides...Foam::GaussSeidelSmoother::smooth() •3~4回転のループがソフトウェアパイプライニングされているため、4回転以下の場合は、ループ内容を展

Copyright 2013 FUJITSU LIMITED

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++レベル) ◎:対応完了

6

Page 8: 富士通C++コンパイラの 性能向上の取り組み › materials › ws_openfoam_130927_slides...Foam::GaussSeidelSmoother::smooth() •3~4回転のループがソフトウェアパイプライニングされているため、4回転以下の場合は、ループ内容を展

Copyright 2013 FUJITSU LIMITED

最適化の拡張

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を利用したライブラリ・レベルの排他

7

Page 9: 富士通C++コンパイラの 性能向上の取り組み › materials › ws_openfoam_130927_slides...Foam::GaussSeidelSmoother::smooth() •3~4回転のループがソフトウェアパイプライニングされているため、4回転以下の場合は、ループ内容を展

Copyright 2013 FUJITSU LIMITED

再帰型テンプレート

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

Page 10: 富士通C++コンパイラの 性能向上の取り組み › materials › ws_openfoam_130927_slides...Foam::GaussSeidelSmoother::smooth() •3~4回転のループがソフトウェアパイプライニングされているため、4回転以下の場合は、ループ内容を展

Copyright 2013 FUJITSU LIMITED

最適化の拡張

再帰型テンプレート

再帰呼び出し向けのインライン展開による即値の伝搬

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

Page 11: 富士通C++コンパイラの 性能向上の取り組み › materials › ws_openfoam_130927_slides...Foam::GaussSeidelSmoother::smooth() •3~4回転のループがソフトウェアパイプライニングされているため、4回転以下の場合は、ループ内容を展

Copyright 2013 FUJITSU LIMITED

最適化の拡張

三角形 : 正多角形

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

仮想関数

基底クラス:Polygonを持つTriangleの面積算出プログラム

10

Page 12: 富士通C++コンパイラの 性能向上の取り組み › materials › ws_openfoam_130927_slides...Foam::GaussSeidelSmoother::smooth() •3~4回転のループがソフトウェアパイプライニングされているため、4回転以下の場合は、ループ内容を展

Copyright 2013 FUJITSU LIMITED

最適化の拡張

call calcArea

Base Function

3rd Extension

vtable (仮想関数テーブル)

Polygon::calcArea

仮想関数

仮想関数テーブルの削除により即値を伝搬

calcArea() { ・・・ }

Triangle search

calcArea Polygon

getArea() { ・・・ }

5000

inline

Polygon

getArea() { ・・・ }

calcArea() { ・・・ }

Triangle

inline

オーバライドの検出 仮想関数テーブルの削除 インライン展開の強化

即値を設定

仮想関数テーブルによる 間接アクセス

11

Page 13: 富士通C++コンパイラの 性能向上の取り組み › materials › ws_openfoam_130927_slides...Foam::GaussSeidelSmoother::smooth() •3~4回転のループがソフトウェアパイプライニングされているため、4回転以下の場合は、ループ内容を展

Copyright 2013 FUJITSU LIMITED

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

Page 14: 富士通C++コンパイラの 性能向上の取り組み › materials › ws_openfoam_130927_slides...Foam::GaussSeidelSmoother::smooth() •3~4回転のループがソフトウェアパイプライニングされているため、4回転以下の場合は、ループ内容を展

Polygon

getArea() { //キャスト呼び出し static_cast<T&>(*this) }

Copyright 2013 FUJITSU LIMITED

最適化の拡張

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

即値を設定

アドレスに対する型変換

13

Page 15: 富士通C++コンパイラの 性能向上の取り組み › materials › ws_openfoam_130927_slides...Foam::GaussSeidelSmoother::smooth() •3~4回転のループがソフトウェアパイプライニングされているため、4回転以下の場合は、ループ内容を展

Copyright 2013 FUJITSU LIMITED

コーディングスタイルによる性能の変化

コーディングスタイルの異なるC++コードの姫野ベンチを作成し、実行性能

の変化を計測 ※ 富士通C++、GNU C++ともに同じ傾向

最適化の拡張

チューニングのポイントは、コーディングスタイルにもある

0

200

400

600

800

1000

1200

1400

1600

himenoBMT 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を利用

14

Page 16: 富士通C++コンパイラの 性能向上の取り組み › materials › ws_openfoam_130927_slides...Foam::GaussSeidelSmoother::smooth() •3~4回転のループがソフトウェアパイプライニングされているため、4回転以下の場合は、ループ内容を展

Copyright 2013 FUJITSU LIMITED

アプリケーション実行性能

性能状況

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/sloshingTank3Dmultiphase/multiphaseInterFoam/laminar/damBreak4phasemultiphase/interFoam/ras/damBreakmultiphase/MRFMultiphaseInterFoam/mixerVessel2Dincompressible/MRFSimpleFoam/mixerVessel2DheatTransfer/buoyantSimpleRadiationFoam/hotRadiationRoomheatTransfer/buoyantPimpleFoam/hotRoomheatTransfer/buoyantBoussinesqPimpleFoam/hotRoomcompressible/rhoPorousMRFPimpleFoam/mixerVessel2Dcombustion/PDRFoam/flamePropagationWithObstaclesDNS/dnsFoam/boxTurb16basic/potentialFoam/pitzDailybasic/laplacianFoam/flange

(sec)

コンパイルオプション -O3 -Xg -Klib -Krdconv -Kfp_contract -Nstl=500fast ※ チュートリアルによっては、 FPEが発生する場合あり

※性能測定は、FX10を利用

15

Page 17: 富士通C++コンパイラの 性能向上の取り組み › materials › ws_openfoam_130927_slides...Foam::GaussSeidelSmoother::smooth() •3~4回転のループがソフトウェアパイプライニングされているため、4回転以下の場合は、ループ内容を展

0

10

20

30

40

50

60

70

80

90

100

富士通C++ 2012/09 富士通C++ 2013/09

Copyright 2013 FUJITSU LIMITED

アプリケーション翻訳性能

性能状況

36 % 性能改善

OpenFOAM 2.1.0 付属 チュートリアルコード 177本選出における性能比較

(%)

※性能測定は、FX10を利用

16

Page 18: 富士通C++コンパイラの 性能向上の取り組み › materials › ws_openfoam_130927_slides...Foam::GaussSeidelSmoother::smooth() •3~4回転のループがソフトウェアパイプライニングされているため、4回転以下の場合は、ループ内容を展

Copyright 2013 FUJITSU LIMITED

OpenFOAM

17

Page 19: 富士通C++コンパイラの 性能向上の取り組み › materials › ws_openfoam_130927_slides...Foam::GaussSeidelSmoother::smooth() •3~4回転のループがソフトウェアパイプライニングされているため、4回転以下の場合は、ループ内容を展

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で確認作業を実施中。

Copyright 2013 FUJITSU LIMITED

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以降のデフォルト

18

Page 20: 富士通C++コンパイラの 性能向上の取り組み › materials › ws_openfoam_130927_slides...Foam::GaussSeidelSmoother::smooth() •3~4回転のループがソフトウェアパイプライニングされているため、4回転以下の場合は、ループ内容を展

OpenFOAM構築 (東大情報基盤センター様 FX10)

構築方法

東大センター(Oakleaf-FX)の利用支援ポータルから、FX10用OpenFOAMのパッチと構築手順のダウンロードが可能。(Oakleaf-FXのアカウントが必要)

FX10の開発環境は、ログインノードと計算ノードで環境が異なる。

•ログインノード : IA機 - x86, FJクロスコンパイラ,リトルエンディアン

•計算ノード : FX10 - SPARC, FJオウンコンパイラ,ビックエンディアン

Copyright 2013 FUJITSU LIMITED

1) OpenFOAMとThird-Partyを ダウンロード

2) Third-Partyはオウンコンパイラ で構築

3) OpenFOAMはクロスコンパイラ で構築

4) tutorialsで動作確認

19

Page 21: 富士通C++コンパイラの 性能向上の取り組み › materials › ws_openfoam_130927_slides...Foam::GaussSeidelSmoother::smooth() •3~4回転のループがソフトウェアパイプライニングされているため、4回転以下の場合は、ループ内容を展

Oakleaf-FXでの環境設定 (Environment Modules を利用)

利用可能なライブラリ・アプリを表示 (ログインノードとインタラクティブノードで異なる)

OpenFOAM 2.2.1の環境を設定

利用例

OpenFOAM用メッシュの作成(blockMesh snappyHexMesh、その他)

パラメタ、モデル設定等、実行スクリプト準備

ジョブ投入 (Oakleaf-FX : pjsub:投入 , pjstat:確認)

ポスト処理(Paraview等)

Copyright 2013 FUJITSU LIMITED

[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利用 (東大情報基盤センター様 FX10)

20

Page 22: 富士通C++コンパイラの 性能向上の取り組み › materials › ws_openfoam_130927_slides...Foam::GaussSeidelSmoother::smooth() •3~4回転のループがソフトウェアパイプライニングされているため、4回転以下の場合は、ループ内容を展

Foam::GaussSeidelSmoother::smooth()

• 3~4回転のループがソフトウェアパイプライニングされているため、4回転以下の場合は、ループ内容を展開したルートを通るようにコード変更。実行時間が、51.66秒→32.14秒に短縮

プロセス間リダクション演算にTofuバリア機構を利用

• プロセス間リダクション演算がMPI_Send/Recvで実装されている。 MPI_Allreduceを使用するバイパスルートを追加 。対象関数: Foam::reduce()

平方根演算のコスト削減

• 平方根演算が多いが、逆数近似命令が使用されていないため、翻訳オプション -Klib,fp_relaxedを適用。 ※ FPEで異常終了する事もあり注意が必要

OpenFOAMの性能改善

利用頻度の高い tutorials を選定し性能改善を実施中

Copyright 2013 FUJITSU LIMITED

チュートリアル名 内容 問題規模

motorBike 風環境解析 34万格子 (逐次実行)

hotRoom 定常熱流体解析 4千格子 (逐次実行)

multiRegionHeaterRadiation 伝熱連成解析 3千格子 (逐次実行)

propeller 回転機械解析 57万格子 (4並列実行)

buoyantBoussinesqSimpleFoam 定常熱流体解析 -

今後も性能改善を継続し、OpenFOAMチューニング版の情報提供を予定

0%

10%

20%

30%

40%

50%

60%

70%

80%

90%

100%

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

ランク

演算 集団通信開始待ち

一対一通信完了待ち その他の通信

パフォーマンス解析

21

Page 23: 富士通C++コンパイラの 性能向上の取り組み › materials › ws_openfoam_130927_slides...Foam::GaussSeidelSmoother::smooth() •3~4回転のループがソフトウェアパイプライニングされているため、4回転以下の場合は、ループ内容を展

流体解析ヘルプデスク(OpenFOAM)

サービス一覧

ホームページ http://jp.fujitsu.com/solutions/hpc/tccloud/helpdesk/openfoam.html

Copyright 2013 FUJITSU LIMITED

導入サービス インストール、動作チェック

Q&Aサービス e-mailにより技術的なご質問回答

教育サービス 操作講習、理論解説、等

お客様のニーズ応じたコースを提供

受託開発サービス 方程式の組込み等、

アプリのカスタマイズを実施

受託解析サービス 十分に経験を積んだ技術者が

お客様の解析を代行 ※ 現在は、IAサーバのみサポート対象

標準ソルバー simpleFoamのカスタマイズ例

solve ( fvm::div(phi, C) ==fvm::laplacian(turbulence->nuEff(), C) );

① トップレベルソースコード simple.C に以下を挿入

② ヘッダーファイル createField.H を編集

③ 新ソルバーをビルド

定常の濃度移流拡散方程式

simpleFoamの流れ場と完全に 一致

追加した濃度の移流拡散方程式が正常に機能

22

Page 24: 富士通C++コンパイラの 性能向上の取り組み › materials › ws_openfoam_130927_slides...Foam::GaussSeidelSmoother::smooth() •3~4回転のループがソフトウェアパイプライニングされているため、4回転以下の場合は、ループ内容を展

Copyright 2010 FUJITSU LIMITED 23