インテル® VTune™ Amplifier 2018 ヘルプ
非効率な同期など Poor な CPU 時間使用率の原因を特定するため、インテル® VTune™ Amplifier のロックと待機ビューポイントを使用します。
ロックと待機のビューポイントで示されるデータを解釈するため、次のステップに従います。
ロックと待機を解析するチュートリアル (Linux* (英語) | Windows* (英語)) では、サンプル C++ アプリケーションを使用して並列性を妨げるロックと待機を特定する手法を紹介しています。
この解析結果で提供される [Summary (サマリー)] ウィンドウでアプリケーション・レベルのデータを確認することから開始します。最適化の前後の結果を比較するためのベースラインとして経過時間の値を使用します。
経過時間と指定した数の実行スレッドと利用可能な CPU の使用状況を表した [CPU Usage (CPU 使用率)] チャートと [Thread Concurrency (スレッドの並行性)] チャートを確認します。最も長いバーがインテル® VTune™ Amplifier で定義されている OK (許容範囲) または Ideal (理想) 範囲内にあるのが理想的です。
[Summary] に表示される上位の待機オブジェクトをクリックすると、インテル® VTune™ Amplifier は [Bottom-up (ボトムアップ)] ウィンドウを開いてこのオブジェクトをハイライト表示します。
パフォーマンスに重大な影響を与える同期オブジェクトは、[Bottom-up] ペインで確認できます。一概にはいえませんが、通常は、これといった特徴のないスレッドがまれにオブジェクトを長時間待機していることがあります。待機時間が長く、待機カウントの多いオブジェクト (特に、CPU 使用率/並行性が Poor (低) のもの) を重点的にチューニングすることを推奨します。
デフォルトでは、同期オブジェクトは待機時間でソートされ、最もクリティカルな同期オブジェクトが最初に表示されます。[Wait Time by Thread Concurrency (スレッドの並行性別待機時間)] 列見出しで ボタンをクリックすると、列を展開して並行性レベルごとの分布を確認できます。
待機時間が最も長い同期オブジェクト (バー形式の場合は赤いバーが最も長いもの) の待機時間と待機カウント値をなくすか、最小限に抑えます。
またインテル® VTune™ Amplifier は、CPU がアクティブである間に同期構造が費やした待機時間を検出します (スピン時間)。スピン時間が、解析中のインテル® アーキテクチャーのプロセッサー・タイプ向けに定義されているしきい値を超えた場合、インテル® VTune™ Amplifier はグリッド内、または [Summary] ウィンドウでそれらの値をハイトライして強調します。
このメトリックからスピンしている同期オブジェクトを見つけます。そして、スピン待機のパラメーターを調整する、ロックの実装に変更する (例えば、ブロッキングでスケジュールされないようにする)、または同期の粒度を調整することを検討してください。
[Bottom-up]/[Top-down Tree (トップダウン・ツリー)] ウィンドウの下部にある [Timeline (タイムライン)] ペインは、時間経過でのアプリケーションのスレッドの動作、および CPU 使用率、GPU 使用率およびスレッドの並行性の変化を表示します。
アプリケーションのスレッドがアクティブに動作している時間は、濃い緑でタイムラインに表示されます。スレッドが特定のオブジェクトを待機している時間が、薄い緑の表示で示されます。待機オブジェクトにマウスをホバーして詳細を確認します。
データを解析するには、問題個所を選択し、コンテキスト・メニューを使用してその領域を拡大します。例えば、次の図では、並行性レベルが低く、遷移の多発により多数の待機が発生していることが分かります。遷移している個所をダブルクリックすると、[Source (ソース)] 表示に切り替わり、そのコード領域を検証することができます。それぞれの待機時間でアプリケーションが何を行っているか理解するには、注目するタイムラインの範囲で [Zoom In and Filter In by Selection (選択を拡大してフィルターイン)] コンテキスト・メニューを選択すると、インテル® VTune™ Amplifier は [Bottom-up] グリッドの関連するオブジェクトをフィルター処理します。[Call Stack (コールスタック)] ペインでは、待機が発生した関数向けに選択されたタイプのコールスタックを自動的に更新します。
アプリケーションの呼び出しシーケンスの問題を特定し、関数の呼び出し方法を変更することでパフォーマンスを改善できます。潜在的な問題の場所を特定するには次の方法があります。
[Top-down Tree] ペイン: hotspot の呼び出し元と呼び出し先の合計時間とセルフ時間を検証して、それぞれの時間を最適化できるかどうか確認します。
[Call Stack] ペイン: [Bottom-up] または [Top-down Tree] ペインで選択した同期オブジェクトのスタックのうち最も割合の高いものが表示されます。ナビゲーション・ボタン を使用して、選択した同期オブジェクトを呼び出したスタックの表示を切り替えることができます。バーは、選択した同期オブジェクトで費やされた合計時間に対する現在表示されているスタックの割合を示しています。[Call Stack] ペインのドロップダウン・リストを使用して、異なるスタックのデータを表示することもできます。
最もホットな同期オブジェクト (最も高い待機時間と待機カウント値) をダブルクリックして、[Source (ソース)]/[Assembly (アセンブリー)] ウィンドウに関連するソースコードを表示します。[Timeline (タイムライン)] ペインで遷移している個所をダブルクリックすると、その遷移のコールサイトが表示されます。インテル® VTune™ Amplifier から直接コードエディターを開き、コードを編集できます。
比較解析を実行して、最適化後のパフォーマンス・ゲインを知ることができます。
高度なイベントベース・サンプリング解析では、アプリケーションのパフォーマンスに影響を与えているハードウェア問題を特定できます。