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

Similar documents
NEE 研究会第 18 回講演討論会 OpenFOAM への計算機能追加連続的データ同化法 (VCA 法 ) の実装 大阪大学大学院工学研究科博士後期課程松尾智仁 内容 1.OpenFOAM を使う理由 1.1 OpenFOAMの特徴 1.2 OpenFOAMを使うにあたって 2.OpenFOAM

演習1: 演習準備

Microsoft PowerPoint OpenFOAMの使い方(柴田).ppt [互換モード]

4-3- 基 C++ に関する知識 オープンソースシステムのソースを解読する上で C++ の知識は必須であるといえる 本カリキュラムでは まずオブジェクト指向に関する Ⅰ. 概要理解を深め クラスの扱い方について学習し STL を使用してアルゴリズムとデータ構造を実装する方法を学習する Ⅱ. 対象専

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

Microsoft PowerPoint - sales2.ppt

openmp1_Yaguchi_version_170530

問 次の Fortran プログラムの説明及びプログラムを読んで、設問に答えよ。

Microsoft Word ●IntelクアッドコアCPUでのベンチマーク_吉岡_ _更新__ doc

ParallelCalculationSeminar_imano.key

Python によるジオプロセシング スクリプト入門

Hphi実行環境導入マニュアル_v1.1.1

Microsoft PowerPoint ppt

Microsoft Word - C言語研修 C++編 3.doc

Microsoft PowerPoint - 09.pptx

Application Note Application Note No. ESC-APN Document No.: ESC-APN adviceluna Linux デバッグ手順 (MIPS コア編 ) はじめに adviceluna Linux デバッグ手順 ( 以

intra-mart Accel Platform — IM-共通マスタ スマートフォン拡張プログラミングガイド   初版  

コードのチューニング

新版明解C言語 実践編

Python によるジオプロセシング スクリプト入門

FUJITSU Cloud Service for OSS 「コンテナサービス」 ご紹介資料

演習準備

White Paper 高速部分画像検索キット(FPGA アクセラレーション)

JAVA入門

HashMapからConcurrentHashMapへの移行

OpenFOAM_compile_basic 1 / /12/23 12: 年 12 月 13 日オープン CAE 富山 ( 富山県立大学中川慎二 ) Disclaimer OPENFOAM is a registered trade mark

JavaプログラミングⅠ

Oracle Cloud Adapter for Oracle RightNow Cloud Service

(速報) Xeon E 系モデル 新プロセッサ性能について

JavaプログラミングⅠ

はじめての OpenFOAM その 3 富 県 学 中川慎二 オープンCAE 富 2014 年 1 月 25 日 Disclaimer: OPENFOAM is a registered trade mark of OpenCFD Limited, the producer of the

PowerPoint プレゼンテーション

CashDrawer ライブラリ API 仕様書 2014/07/09 CashDrawer ライブラリ API 仕様書 Rev / 10

(STL) STL 1 (deta structure) (algorithm) (deta structure) 2 STL STL (Standard Template Library) 2.1 STL STL ( ) vector<int> x; for(int i = 0; i < 10;

ポスト「京」でのコデザイン 活動報告

計算機アーキテクチャ

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

PowerPoint プレゼンテーション

コンパイラ演習 第 7 回

文字列操作と正規表現

26

Microsoft Word - matlab-coder-code-generation-quick-start-guide-japanese-r2016a

JS2-14 マルチコアCPU時代の Javaプログラミング

Java知識テスト問題

PowerPoint プレゼンテーション

Javaの作成の前に

Microsoft PowerPoint - 01_Vengineer.ppt

Undestand の解析 Understand の C 言語で抽出できない依存関係について サンプルコードを用いて説明します 確認バージョン Understand 3.0 (Build 640) Understand 3.1 (Build 700) Understand 4.0 (Build 78

K5移行サービス ご紹介資料

スライド 1

FUJITSU Cloud Service for OSS 認証サービス サービス仕様書

情報処理 Ⅱ 2007 年 11 月 26 日 ( 月 )

CodeRecorderでカバレッジ

Oracle Un お問合せ : Oracle Data Integrator 11g: データ統合設定と管理 期間 ( 標準日数 ):5 コースの概要 Oracle Data Integratorは すべてのデータ統合要件 ( 大量の高パフォーマンス バッチ ローブンの統合プロセスおよ

熱伝達の境界条件 (OF-2.1 OF-2.3) 1/7 藤井 15/01/30 熱伝達の境界条件 (OF-2.1 OF-2.3) 目次 1. はじめに 2. 熱伝達の境界条件 (fixedalphatemp) の作成 2-1. 考え方 2-2. fixedalphatemp の作成 3. 作動確認

FUJITSU Cloud Service K5 認証サービス サービス仕様書

Insert your Title here

メディプロ1 Javaプログラミング補足資料.ppt

Transcription:

富士通 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