スレッド化解析

スレッド化解析を使用して、アプリケーションが利用可能なプロセッサー計算コアをどの程度効率的に利用しているか特定し、スレッドランタイムの非効率性、またはスレッドを待機させてプロセッサーの利用効率を妨げるスレッド同期の競合を調査します。

インテル® VTune™ プロファイラーは、メインのスレッド効率の測定として、[効率的な CPU 利用率] メトリックを使用します。このメトリックは、アプリケーションが利用可能な論理コアをどのように利用しているかを示します。スループットの計算では通常、物理コアごとに 1 つの論理コアをロードします。

スレッド化解析の次の情報から、低い CPU 利用率の原因を考えることができます。

スレッド化解析には、スレッド待機時間の収集と解釈が異なる 2 つの収集モードがあります。

どのように動作するか: ユーザーモード・サンプリングとトレース

ユーザーモードのサンプリングとトレース収集モードでは、インテル® VTune™ プロファイラーは、ランタイム中に呼び出しをインターセプトし、同期オブジェクトを検出するスレッドの相互作用フローを作成するスレッド化およびブロック化 API をインストルメントします。[ユーザーモード・サンプリングとトレース] 収集モードを使用して、各同期オブジェクトのアプリケーションへの影響を予測し、アプリケーションが同期オブジェクトやブロック化 API で待機している時間を理解できます。この解析は、あるスレッドから別のスレッドへの実行フロー遷移とタイムライン・ビューでの同期オブジェクトの解放と発生を含む、スレッドの相互作用を示します。

アプリケーション実行時のオーバーヘッドが大きい場合は、待機時間収集の負担が少ない、[ハードウェア・イベントベース・サンプリングとコンテキスト・スイッチ] モードを検討してください。

どのように動作するか: ハードウェア・イベントベース・サンプリングとコンテキスト・スイッチ

マルチタスク・オペレーティング・システムは、すべてのソフトウェア・スレッドをタイムスライスで実行します (スレッド実行クァンタ)。ハードウェア・イベントベース・サンプリングとコンテキスト・スイッチ・モードでは、スレッドがプロセッサー上にスケジュールされ、プロセッサーからスケジュール・アウトされるたびに (スレッドクァンタム境界で) プロファイラーが制御を取得します。このモードはスレッドが非アクティブとなった原因を判断します。オペレーティング・システムのスケジューラーが、現在のスレッドをプリエンプトして別の優先度の高いスレッドを実行する場合、明示的な同期要求またはいわゆるスレッドクァンタムの終了が原因です。

スレッドがインアクティブとして測定された時間はインアクティブ待機時間と呼ばれます。インアクティブ待機時間はインアクティブ化の原因に基づいて区分されます。

コンテキスト・スイッチ情報はコールスタックを使用して収集されるため、待機関数の呼び出しパスでインアクティブ待機時間の理由を調査することが可能です。[ハードウェア・イベントベース・サンプリングとコンテキスト・スイッチ] モードは、同期オブジェクトまたは I/O 操作により待機が発生したコードの場所を示します。

[ハードウェア・イベントベース・サンプリングとコンテキスト・スイッチ] モードは、ハードウェア・イベントベース・サンプリング収集を使用し、システム上で実行されるすべてのプロセスを解析して、システム全体のパフォーマンスに関連するコンテキスト・スイッチ・データを提供します。Linux* システムでは、インアクティブ待機時間収集は、カーネルバージョン 4.4 以降のドライバーを使用しない Perf* ベースの収集で利用可能です。インアクティブ時間の原因はカーネル 4.17 以降で利用可能です。

32 ビット Linux* システムでは、インテル® VTune™ プロファイラーはハードウェア・イベントベース・サンプリング・モードにドライバーを使用しない Perf* ベースの収集を使用します。

解析の設定と実行

次のようにスレッド化解析のオプションを設定します。

必要条件: プロジェクトを作成し、解析ターゲットを指定します。

  1. インテル® VTune™ プロファイラー・ツールバーの (スタンドアロン GUI)/ (Visual Studio* IDE) [解析の設定] ボタンをクリックします。

    [解析の設定] ウィンドウが表示されます。

  2. [どのように] ペインで、 ボタンをクリックして、[スレッド化] を選択します。

  3. 収集オプションを設定します。

    [ユーザーモード・サンプリングとトレース] モード

    同期オブジェクト解析でユーザーモード・サンプリングとトレース収集を有効にする場合に選択します。この収集モードのサンプリング間隔は 10 ミリ秒に固定されています。サンプリング間隔を変更するには、[コピー] ボタンをクリックしてカスタム解析設定を作成します。10 ミリ秒未満の間隔には、[ハードウェア・イベントベース・サンプリングとコンテキスト・スイッチ] モードを使用します。

    [ハードウェア・イベントベース・サンプリングとコンテキスト・スイッチ] モード

    [ハードウェア・イベントベース・サンプリングとコンテキスト・スイッチ] 収集を有効にする場合に選択します。

    [CPU サンプリング間隔 (ミリ秒)] では、CPU サンプル間の間隔をミリ秒単位で設定できます。ハードウェア・イベントベース・サンプリング・モードで指定可能な値は、0.01-1000 です。デフォルトで 1 ミリ秒が使用されます。

    収集オプションを変更する場合、右にある [オーバーヘッド] 分布図に注意してください。選択したオプションに応じて、発生するオーバーヘッドは動的に変化します。

    [詳細] ボタン

    この解析タイプのデフォルトの編集不可設定のリストを展開/折りたたみます。解析の設定を変更したり、追加の設定を有効にするには、既存の事前定義設定をコピーしてカスタム設定を作成する必要があります。インテル® VTune™ プロファイラーは、解析タイプ設定の編集可能なコピーを作成します。

    コマンドラインからスレッド化解析を実行するには、下部にある コマンドライン・ボタンを使用します。

  4. [開始] ボタンをクリックして解析を実行します。

データを表示

スレッド化解析の結果は、次のウィンドウ/ペインで構成される [スレッド化効率] ビューポイントに表示されます。

次にすることは?

  1. アプリケーションの有効な CPU 利用率を調査して、同期や並列ワーク割り当てのオーバーヘッドに関連する低い利用率の原因を特定するには、[サマリー] ウィンドウから開始します。フラグが示される問題に関連したリンクをクリックすると、詳しい情報が表示されます。例えば、[上位の待機オブジェクト] テーブルの同期オブジェクトをクリックすると、[ボトムアップ] ウィンドウのそのオブジェクトに移動します。

  2. 待機とシグナルスタック、およびタイムライン上の遷移を使用して、スレッド統合同期オブジェクトを解析します。スレッド化ランタイムに費やされた CPU 時間を調査して、非効率な利用率を分類します。

  3. CPU 利用率のボトルネックを排除し、アプリケーションの並列処理を改善するようにコードを変更します。

    待機中のシステム利用率が低い (赤いバー)、長い待機時間のオブジェクトにチューニング作業を集中します。並列処理の追加、バランス調整、または競合の削減を検討します。実行中のスレッド数が論理コア数と等しくなると、理想的な利用率 (緑のバー) が示されます。

  4. 解析を再度実行して、比較モードで最適化を検証し、改善の余地がある領域を特定します。

詳細および解釈のヒントは、「スレッド化効率ビュー」を参照してください。

関連情報