• 検索結果がありません。

Agenda 富士通 C++ コンパイラ C++ コンパイラの概要 C++ コードに対する課題 最適化の拡張 性能状況 OpenFOAM FX10 向けOpenFOAM OpenFOAM 構築 OpenFOAM 利用 OpenFOAMの性能改善 流体解析ヘルプデスク (OpenFOAM) 1

N/A
N/A
Protected

Academic year: 2021

シェア "Agenda 富士通 C++ コンパイラ C++ コンパイラの概要 C++ コードに対する課題 最適化の拡張 性能状況 OpenFOAM FX10 向けOpenFOAM OpenFOAM 構築 OpenFOAM 利用 OpenFOAMの性能改善 流体解析ヘルプデスク (OpenFOAM) 1"

Copied!
24
0
0

読み込み中.... (全文を見る)

全文

(1)

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

性能向上の取り組み

2013年9月27日

富士通株式会社

ミドルウェア事業本部

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

千葉 修一

(2)

富士通C++コンパイラ

C++コンパイラの概要

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

最適化の拡張

性能状況

OpenFOAM

FX10向けOpenFOAM

OpenFOAM構築

OpenFOAM利用

OpenFOAMの性能改善

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

Agenda

(3)
(4)

製品名

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

* 「京」は独立行政法人理化学研究所の登録商標です。

(5)

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

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

(6)

最適化機能の改善計画

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

(7)

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

(8)

最適化の拡張

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

(9)

再帰型テンプレート

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;

(10)

最適化の拡張

再帰型テンプレート

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

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  完全なインライン展開  即値を設定  すべて別名関数  部分特殊化の利用

(11)

最適化の拡張

三角形 : 正多角形

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

仮想関数

(12)

最適化の拡張

call calcArea Base Function 3rd Extension vtable (仮想関数テーブル) Polygon::calcArea

仮想関数

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

calcArea() { ・・・ } Triangle search calcArea Polygon getArea() { ・・・ } 5000 inline Polygon getArea() { ・・・ } calcArea() { ・・・ } Triangle inline  オーバライドの検出  仮想関数テーブルの削除  インライン展開の強化  即値を設定  仮想関数テーブルによる 間接アクセス

(13)

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);

(14)

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  即値を設定  アドレスに対する型変換

(15)

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

コーディングスタイルの異なる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を利用

(16)

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

性能状況

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が発生する場合あり

(17)

0 10 20 30 40 50 60 70 80 90 100 富士通C++ 2012/09 富士通C++ 2013/09

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

性能状況

36 % 性能改善 OpenFOAM 2.1.0 付属 チュートリアルコード 177本選出における性能比較 (%) ※性能測定は、FX10を利用

(18)
(19)

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

(20)

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で動作確認

(21)

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

(22)

 Foam::GaussSeidelSmoother::smooth() • 3~4回転のループがソフトウェアパイプライニングされているため、4回転以下の場合は、ループ内容を展 開したルートを通るようにコード変更。実行時間が、51.66秒→32.14秒に短縮  プロセス間リダクション演算にTofuバリア機構を利用 • プロセス間リダクション演算がMPI_Send/Recvで実装されている。 MPI_Allreduceを使用するバイパスルートを追加 。対象関数: Foam::reduce()  平方根演算のコスト削減 • 平方根演算が多いが、逆数近似命令が使用されていないため、翻訳オプション -Klib,fp_relaxedを適用。 ※ FPEで異常終了する事もあり注意が必要

OpenFOAMの性能改善

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

チュートリアル名 内容 問題規模 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 ランク 演算 集団通信開始待ち 一対一通信完了待ち その他の通信 パフォーマンス解析

(23)

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

サービス一覧

ホームページ

http://jp.fujitsu.com/solutions/hpc/tccloud/helpdesk/openfoam.html

導入サービス

インストール、動作チェック

Q&Aサービス

e-mailにより技術的なご質問回答

教育サービス

操作講習、理論解説、等 お客様のニーズ応じたコースを提供

受託開発サービス

方程式の組込み等、 アプリのカスタマイズを実施

受託解析サービス

十分に経験を積んだ技術者が お客様の解析を代行 ※ 現在は、IAサーバのみサポート対象 標準ソルバー simpleFoamのカスタマイズ例 solve ( fvm::div(phi, C) ==fvm::laplacian(turbulence->nuEff(), C) ); ① トップレベルソースコード simple.C に以下を挿入 ② ヘッダーファイル createField.H を編集 ③ 新ソルバーをビルド 定常の濃度移流拡散方程式 simpleFoamの 流れ場と完全に 一致 追加した濃度の 移流拡散方程式 が正常に機能

(24)

参照

関連したドキュメント

(月額) 専門里親 123 , 000 円( 2 人目以降 87,000

March 13, 2018: Futtsu Thermal Power Station Group 2 Unit 2 was made highly efficient (Replacement work on gas turbines etc. for reducing fuel cost and CO 2 emissions

据付確認 ※1 装置の据付位置を確認する。 実施計画のとおりである こと。. 性能 性能校正

[r]

 工学の目的は社会における課題の解決で す。現代社会の課題は複雑化し、柔軟、再構

性能  機能確認  容量確認  容量及び所定の動作について確 認する。 .

性能  機能確認  容量確認  容量及び所定の動作について確 認する。 .

性能  機能確認  容量確認  容量及び所定の動作について確 認する。 .