インテル VTune Amplifier 2018 を 使用した最適化手法 ( 初級編 ) 久保寺 陽子
内容 アプリケーション最適化のプロセス インテル VTune Amplifier の紹介 インテル VTune Amplifier の新機能 インテル VTune Amplifier を用いた最適化例 (1) インテル VTune Amplifier を用いた最適化例 (2) まとめ 2
インテル VTune Amplifier 2018
アプリケーション最適化のプロセス 実データを使用した性能測定 インテル VTune Amplifier インテル Inspector アプリケーションの開発 修正 インテル C++ コンパイラーインテル Fortran コンパイラーインテル Distribution for Python* インテル マス カーネル ライブラリー ( インテル MKL) インテル スレッディング ビルディング ブロック ( インテル TBB) OpenMP* 性能解析ツールによるボトルネックの発見 インテル VTune Amplifier インテル Advisor インテル Inspector 4
インテル VTune Amplifier 2018
インテル Parallel Studio XE コンポーネント ツール Composer Edition Professional Edition Cluster Edition インテル C++ コンパイラー インテル Fortran コンパイラー インテル Distribution for Python* インテル マス カーネル ライブラリー ( インテル MKL) インテル スレッディング ビルディング ブロック ( インテル TBB) インテル インテグレーテッド パフォーマンス プリミティブ ( インテル IPP) OpenMP* インテル Advisor インテル Inspector インテル VTune Amplifier インテル データ アナリティクス アクセラレーション ライブラリー ( インテル DAAL) インテル MPI ライブラリー インテル Trace Analyzer & Collector ローグウェーブ IMSL* ライブラリーバンドルとアドオンアドオンアドオン インテル コンパイラー 18.0 はインテル Parallel Studio XE 2018 に含まれます 6
さまざまな分野に対応した豊富なプロファイル機能インテル VTune Amplifier ーパフォーマンス プロファイラー 7
インテル VTune Amplifier の機能 hotspot 解析 多くの時間を費やしているコードを素早く特定 プロファイルデータをソース上に表示して結果を素早く解析 オンチップのパフォーマンス モニタリング ユニット (PMU) による低いオーバーヘッド マルチスレッド化モデルをサポート タスクの開始 / 終了 同期 待機時間などマルチスレッドの概念を簡単に理解 MPI + OpenMP* のマルチランクを簡単に解析 "locks and waits" 解析で遅いスレッドのコードの一般的な原因を特定 タイムラインのフィルター処理で必要なデータを得る 選択された範囲のグリッドの CPU 時間を多く消費している関数リストを更新して表示 8
インテル VTune Amplifier の機能 ストレージデバイス解析 (HDD SATA または NVMe SSD) I/O 操作 ( 非同期および同期 ) と計算の間のインバランスを調査 インテル Xeon Phi 製品向けのチューニング インテル Xeon Phi 製品のハードウェア プロファイルをサポート GPU とプラットフォームのデータを解析 OpenCL* と GPU プロファイル Windows* と Linux* をサポート リモートシステムを簡単にプロファイル ライセンスはホストのみに必要でターゲットには不要 ホスト OS Windows* Linux* macos* ターゲット OS Windows* Linux* 組込み Linux* Android* Tizen* Wind River* Linux* Yocto Project* FreeBSD* 9
Visual Studio* IDE への統合 インテル VTune Amplifier ツールバー 表示ウィンドウの切り替え コールスタック表示 タイムライン表示 10
インテル VTune Amplifier 2018
インテル VTune Amplifier 2018 の新機能 共有および分散メモリー アプリケーションのメトリックを素早く取得 コンテナーの内部もプロファイル MPI メトリックの拡張 : インバランスとクリティカル パス ランクを含む アプリケーション スナップショット : MPI と OpenMP* データの統合と MPICH サポートを追加 コンテナー内のプロファイルおよび実行中の Java* サービス / デーモンへのアタッチ Python* のプロファイル : スレッド / メモリー使用量の解析を追加 OpenCL* カーネル hotspot 解析 : カーネルのボトルネックを特定 従来に加えて新しいプロセッサー /OS のサポートの追加 インテル Xeon Phi プロセッサー ( 開発コード名 : Knights Landing Knights Mill) インテル Xeon スケーラブル プロセッサー Intel Atom プロセッサー ( 開発コード名 : Apollo Lake Denverton) インテル プロセッサー ( 開発コード名 : Kaby Lake) Ubuntu* 17.04/Fedora* 26/Debian* 9.0 Microsoft* Windows 10 Creators Update (RS2)/Microsoft* Visual Studio* 2017 12
アプリケーション スナップショット https://software.intel.com/sites/products/snapshots/application-snap ( 英語 ) パフォーマンスの概要を簡単に素早く確認 パフォーマンス チューニングが必要か 共有メモリーや MPI アプリケーションを性能を簡易解析 : MPI 並列性 (Linux* のみ ) OpenMP* 並列性 メモリーアクセス 浮動小数点ユニット (FPU) の使用状況 I/O 効率 Windows* または Linux* システムでデータ収集が可能 結果は Web ブラウザーで表示 13
hotspot を探せ
hotspot の探し方 解析の準備 Visual Studio* IDE から起動 インテル VTune Amplifier を起動 hotspot を探す Basic Hotspot Analysis を選択し実行 解析結果から性能低下を引き起こしているコードを見つける hotspot の削除 アルゴリズムを向上するコードを修正 インテル コンパイラーでビルド 性能の再チェック 修正後のバイナリーを再び Basic Hotspot Analysis で解析 最適化前の結果と比較する 15
解析の準備 解析するアプリケーションのプロジェクトを選択 サンプルプログラム tachyon_vtune_amp_xe の入手 (https://software.intel.com/en-us/product-code-samples ( 英語 )) find_hotspots プロジェクトを選択 Microsoft* シンボルサーバーの設定 [Tools ( ツール )] > [Options... ( オプション...)] > [Debugging ( デバッグ )] > [Symbols ( シンボル )] メニューでシンボルサーバー (http://msdl.microsoft.com/download/symbols ( 英語 )) またはシンボルファイルを指定 最適なコンパイラー / リンカーのオプションを確認 コンパイラーのオプション 16
解析の準備 最適なコンパイラー / リンカーのオプションを確認 リンカーのオプション アプリケーション バイナリーを Release モードでビルド 性能測定のベースラインを作成 [Debug ( デバッグ )] > [Start without Debugging ( デバッグなしで開始 )] でアプリケーションが正常終了することを確認 17
hotspot を探す インテル VTune Amplifier を Microsoft* Visual Studio* のプラグインメニューから実行または単体で起動 18
hotspot を探す 解析可能なアプリケーションの種類 ターゲットシステム ローカルホスト Android* デバイス リモートシステム (Linux*) ターゲットタイプ アプリケーションを起動 プロセスをアタッチ システム全体のプロファイル 起動環境の設定 実行パス 入力パラメーター 環境変数等 19
hotspot を探す Basic Hotspots の解析結果 ( 概要 ) シンボル情報の関連付け 20
hotspot を探す (Basic Hotspots の解析結果 ) hotspot の関数 / コールスタックを階層表示 解析領域をタイムライン表示上で指定 21
hotspot を探す Basic Hotspots の解析結果 -> ソースコードまで追跡 22
hotspot の削除 解析結果 mem_array へのアクセスの順番 for (int i = 0; i < mem_array_i_max; i++) { iteration_count mem_array[] j iteration_count // Try to defeat hardware prefetching by varying the stride ( アクセス後 ) int j(0), iteration_count(0); do { 0 0*mem_array_i_max + 0 3 1 mem_array [j*mem_array_i_max+i] = *fill_value + 2; // Code to give the array accesses a non-uniform stride to defeat hardware 1 3*mem_array_i_max + 0 1 2 prefetch 2 1*mem_array_i_max + 0 2 3 if ((iteration_count % 3) == 0) j=j+3; 3 2*mem_array_i_max + 0 6 4 else j=iteration_count; iteration_count++; 4 6*mem_array_i_max + 0 4 5 } while (j < mem_array_j_max); メモリー上での並び 5 4*mem_array_i_max + 0 5 6 } 0 6 5*mem_array_i_max + 0 9 7 mem_array へのアクセスの順番 2 3 1 mem_array mem_array_i_max mem_array_j_max : : : : プロセッサーのハードウェア プリフェッチが効かない 23
hotspot の削除 プラットフォームに最適なアルゴリズムの選択 for (int j = 0; j < mem_array_j_max; j++) { for (int i = 0; i < mem_array_i_max; i++) { mem_array [j*mem_array_i_max+i] = *fill_value + 2; } } mem_array へのアクセスの順番 0 1 2 3 4 5 mem_array_i_max mem_array mem_array_j_max mem_array へのアクセスの順番 i j mem_array[] 0 0 0*mem_array_i_max + 0 1 0 0*mem_array_i_max + 1 2 0 0*mem_array_i_max + 2 3 0 0*mem_array_i_max + 3 4 0 0*mem_array_i_max + 4 : : : プロセッサーのハードウェア プリフェッチを有効活用 24
性能の再チェック hotspot が削除されたのを確認 最適化前 12.906 sec hotspot であった render_one_pixel 関数がリストにないことを確認 最適化後 6.703 sec 25
性能の再チェック 最適化後の hotspot 計算時間が適当かどうかのチェック 最適化後 0.308 sec 更なる最適化が必要か? 最適化前 6.493 sec 26
最適化前後の結果比較 どの程度最適化されたかを定量的にチェック 27
Lock & Wait の解析
Lock & Wait の探し方 解析の準備 Visual Studio* IDE から起動 インテル VTune Amplifier を起動 Lock を探す Lock Wait Analysis を選択し実行 解析結果から性能低下を引き起こしているコードを見つける hotspot の削除 アルゴリズムを向上するコードを修正 インテル コンパイラーでビルド 性能の再チェック 修正後のバイナリーを再び Lock Wait Analysis で解析 最適化前の結果と比較する 29
解析の準備 解析するアプリケーションのプロジェクトを選択 サンプルプログラム tachyon_vtune_amp_xe の入手 (https://software.intel.com/en-us/product-code-samples ( 英語 )) analyze_locks プロジェクトを選択 Microsoft* シンボルサーバーの設定 [Tools ( ツール )] > [Options... ( オプション...)] > [Debugging ( デバッグ )] > [Symbols ( シンボル )] メニューでシンボルサーバー (http://msdl.microsoft.com/download/symbols ( 英語 )) またはシンボルファイルを指定 最適なコンパイラー / リンカーのオプションを確認 コンパイラーのオプション 30
解析の準備 最適なコンパイラー / リンカーのオプションを確認 リンカーのオプション アプリケーション バイナリーを Release モードでビルド 性能測定のベースラインを作成 [Debug ( デバッグ )] > [Start without Debugging ( デバッグなしで開始 )] でアプリケーションが正常終了することを確認 31
ロックを探す インテル VTune Amplifier を Microsoft* Visual Studio* のプラグインメニューから実行または単体で起動 このメッセージが表示されたら 管理者権限で Visual Studio* を起動しなおす 32
ロックを探す Locks and Waits の解析結果 ( 概要 ) 同期を待っている時間 スレッドごとに換算されるので マルチスレッド環境下では Elapsed Time より大きくなる 同期コンストラクトにおいてアクティブな時間 想定した上限を超えている 並列性が低い 論理 CPU ごとの Elapsed Time 33
ロックを探す (Locks and Waits の解析結果 ) ロックの関数 / コールスタックを階層表示 実際に計算しているのは 4 つのスレッド 解析領域をタイムライン表示上で指定 34
ロックを探す ( ソースプログラムでは ) EnterCriticalSection 関数でロックを引き起こしていることを特定 Spin Time の 84% を 1 つの関数で引き起こしている その原因は? 35
ロックの削除 pthread_mutex_lock を呼び出している箇所を探す 36
ロックの削除 pthread_mutex_lock の動作 スレッド 0 スレッド 1 スレッド 2 スレッド 3 CriticalSection によってシリアル化されている EnterCriticalSection render_one_pixel LeaveCriticalSection render_one_pixel を計算できるのは同時に 1 つのスレッドだけ 37
ロックの削除 スレッド 0 スレッド 1 スレッド 2 スレッド 3 各スレッドで計算に使用される変数に依存性がないことが保証されている render_one_pixel 不要なロックを削除 インテル TBB の cancel_group_execution ( スレッドセーフ ) 38
性能の再チェック ロックが削除されたのを確認 最適化前 7.078 sec Spin Time の問題が解消されていることを確認 最適化後 3.062 sec 39
性能の再チェック ロックが削除されたのを確認 論理 CPU もバランス 並列性の向上 40
最適化前後の結果比較 どの程度最適化されたかを定量的にチェック 41
インテル ソフトウェア開発製品
インテル Parallel Studio XE コンポーネント ツール Composer Edition Professional Edition Cluster Edition インテル C++ コンパイラー インテル Fortran コンパイラー インテル Distribution for Python* インテル マス カーネル ライブラリー ( インテル MKL) インテル スレッディング ビルディング ブロック ( インテル TBB) インテル インテグレーテッド パフォーマンス プリミティブ ( インテル IPP) OpenMP* インテル Advisor インテル Inspector インテル VTune Amplifier インテル データ アナリティクス アクセラレーション ライブラリー ( インテル DAAL) インテル MPI ライブラリー インテル Trace Analyzer & Collector ローグウェーブ IMSL* ライブラリーバンドルとアドオンアドオンアドオン インテル コンパイラー 18.0 はインテル Parallel Studio XE 2018 に含まれます 43
まとめ インテル VTune Amplifier を使用してアプリケーションを快適に動作 無料の 30 日間のインテル Parallel Studio XE 評価版をダウンロード : makebettercode.com/parallelstudioxe-eval ( 英語 ) 皆さんのフィードバックは重要です!! 44
問い合わせ? Q/A 45
法務上の注意書きと最適化に関する注意事項 本資料に掲載されている情報は現状のまま提供され いかなる保証もいたしません 本資料は 明示されているか否かにかかわらず また禁反言によるとよらずにかかわらず いかなる知的財産権のライセンスを許諾するためのものではありません 製品に付属の売買契約書 Intel's Terms and Conditions of Sale に規定されている場合を除き インテルはいかなる責任を負うものではなく またインテル製品の販売や使用に関する明示または黙示の保証 ( 特定目的への適合性 商品性に関する保証 第三者の特許権 著作権 その他 知的財産権の侵害への保証を含む ) をするものではありません 性能に関するテストに使用されるソフトウェアとワークロードは 性能がインテル マイクロプロセッサー用に最適化されていることがあります SYSmark* や MobileMark* などの性能テストは 特定のコンピューター システム コンポーネント ソフトウェア 操作 機能に基づいて行ったものです 結果はこれらの要因によって異なります 製品の購入を検討される場合は 他の製品と組み合わせた場合の本製品の性能など ほかの情報や性能テストも参考にして パフォーマンスを総合的に評価することをお勧めします 2017 Intel Corporation. 無断での引用 転載を禁じます Intel インテル Intel ロゴ Intel Atom Xeon Intel Xeon Phi VTune は アメリカ合衆国および / またはその他の国における Intel Corporation の商標です Microsoft および Windows は 米国 Microsoft Corporation の 米国およびその他の国における登録商標または商標です 最適化に関する注意事項 インテル コンパイラーでは インテル マイクロプロセッサーに限定されない最適化に関して 他社製マイクロプロセッサー用に同等の最適化を行えないことがあります これには インテル ストリーミング SIMD 拡張命令 2 ( インテル SSE2) インテル ストリーミング SIMD 拡張命令 3 ( インテル SSE3) ストリーミング SIMD 拡張命令 3 補足命令 (SSSE3) 命令セットに関連する最適化およびその他の最適化が含まれます インテルは 他社製マイクロプロセッサーに関して いかなる最適化の利用 機能 または効果も保証いたしません 本製品のマイクロプロセッサー依存の最適化は インテル マイクロプロセッサーでの使用を前提としています インテル マイクロアーキテクチャーに限定されない最適化のなかにも インテル マイクロプロセッサー用のものがあります この注意事項で言及した命令セットの詳細については 該当する製品のユーザー リファレンス ガイドを参照してください 改訂 #20110804 46