スレッド化解析を使用して、アプリケーションが利用可能なプロセッサー計算コアをどの程度効率的に利用しているか特定し、スレッドランタイムの非効率性、またはスレッドを待機させてプロセッサーの利用効率を妨げるスレッド同期の競合を調査します。
スレッド化解析は、インテル® VTune™ プロファイラーで使用されていた [並行性解析] と [ロックと待機解析] タイプを組み合わせた、新しい解析タイプです。
インテル® VTune™ プロファイラーは、インテル® VTune™ Amplifier の後継バージョンであり、名称が変更されました。
インテル® VTune™ プロファイラーは、スレッド化効率の主な測定として有効な CPU 利用率メトリックを使用します。このメトリックは、アプリケーションが利用可能な論理コアをどのように利用しているかを示します。スループット・コンピューティングでは、通常、物理コアごとに 1 つの論理コアを使用します。
スレッド化解析の次の情報から、低い CPU 利用率の原因を考えることができます。
スレッド解析は、スレッド待機時間の収集と解釈に違いがある 2 つの収集モードを提供します。
ユーザーモードのサンプリングとトレース収集モードでは、インテル® VTune™ プロファイラーは、ランタイム中に呼び出しをインターセプトし、同期オブジェクトを検出するスレッドの相互作用フローを作成するスレッド化およびブロック化 API をインストルメントします。[ユーザーモード・サンプリングとトレース] 収集モードを使用して、各同期オブジェクトのアプリケーションへの影響を予測し、アプリケーションが同期オブジェクトやブロック化 API で待機している時間を理解できます。この解析では、タイムライン・ビューで同期オブジェクトを解放および取得するスレッドから別のスレッドへの実行フローとスレッドの相互作用を示します。
このモードのオーバーヘッドがアプリケーションに影響を及ぼす場合、ハードウェア・イベントベース・サンプリングとコンテキスト・スイッチ・モードを試してください。
マルチタスク・オペレーティング・システムは、すべてのソフトウェア・スレッドをタイムスライスで実行します (スレッド実行クァンタ)。ハードウェア・イベントベース・サンプリングとコンテキスト・スイッチ・モードでは、スレッドがプロセッサー上にスケジュールされ、プロセッサーからスケジュール・アウトされるたびに (スレッドクァンタム境界で) プロファイラーが制御を取得します。このモードはスレッドが非アクティブとなった原因を判断します。オペレーティング・システムのスケジューラーが、現在のスレッドをプリエンプトして別の優先度の高いスレッドを実行する場合、明示的な同期要求またはいわゆるスレッドクァンタムの終了が原因です。
スレッドが非アクティブを維持する時間を測定し、これは非アクティブ待機時間と呼ばれます。非アクティブな待機時間は、非アクティブである原因によって区分されます。
コンテキスト・スイッチ情報はコールスタックで収集されるため、呼び出しパスと待機関数による非アクティブな待機時間を原因を調査できます。ハードウェア・イベントベースのサンプリングとコンテキスト・スイッチ・モードは、同期オブジェクトや I/O 操作によって待機するコード内の場所を示します。
[ハードウェア・イベントベース・サンプリングとコンテキスト・スイッチ] モードは、ハードウェア・イベントベース・サンプリング収集を使用し、システム上で実行されるすべてのプロセスを解析して、システム全体のパフォーマンスに関連するコンテキスト・スイッチ・データを提供します。Linux* システムでは、カーネルバージョン 4.4 以降でドライバーを使用しない Perf* ベースの収集を使用して、非アクティブな待機時間を収集できます。非アクティブ時間の原因は、カーネル 4.17 以降で利用できます。
32 ビット Linux* システムでは、インテル® VTune™ プロファイラーはハードウェア・イベントベース・サンプリング・モードにドライバーを使用しない Perf ベースの収集を使用します。
次のようにスレッド化解析のオプションを設定します。
要件: プロジェクトを作成して解析ターゲットを指定します。
インテル® VTune™ プロファイラー・ツールバーの (スタンドアロン GUI)/ (Visual Studio* IDE) [解析の設定] ボタンをクリックします。
[解析の設定] ウィンドウが表示されます。
[どのように] ペインで、 ボタンをクリックして、[スレッド化] を選択します。
収集オプションを設定します。
[ユーザーモード・サンプリングとトレース] モード |
同期オブジェクト解析にユーザーモードのサンプリングとトレース収集を行う際に選択します。この収集モードのサンプリング間隔は 10 ミリ秒に固定されています。サンプリング間隔を変更するには、[コピー] ボタンをクリックしてカスタム解析設定を作成します。10 ミリ秒未満の間隔には、[ハードウェア・イベントベース・サンプリングとコンテキスト・スイッチ] モードを使用します。 |
[ハードウェア・イベントベース・サンプリングとコンテキスト・スイッチ] モード |
ハードウェア・イベントベース・サンプリングとコンテキスト・スイッチの収集を有効にする際に選択します。 [CPU サンプリング間隔 (ミリ秒)] では、CPU サンプル間の間隔をミリ秒単位で設定できます。ハードウェア・イベントベース・サンプリング・モードで指定可能な値は、0.01-1000 です。デフォルトで 1 ミリ秒が使用されます。 注収集オプションを変更する場合、右にある [オーバーヘッド] 分布図に注意してください。選択したオプションに応じて、発生するオーバーヘッドは動的に変化します。 |
[詳細] ボタン |
この解析タイプのデフォルトの編集不可設定のリストを展開/折りたたみます。解析の設定を変更したり、追加の設定を有効にするには、既存の事前定義設定をコピーしてカスタム設定を作成する必要があります。インテル® VTune™ プロファイラーは、解析タイプ設定の編集可能なコピーを作成します。 |
コマンドラインからスレッド化解析を実行するには、下部にある コマンドライン・ボタンを使用します。
[開始] ボタンをクリックして解析を実行します。
スレッド化解析の結果は、次のウィンドウ/ペインで構成される [スレッド化効率] ビューポイントに表示されます。
[サマリー] ウィンドウには、CPU 時間とプロセッサー利用率を特定する、アプリケーション全体の実行に関する統計情報が表示されます。
[ボトムアップ] ウィンドウには、ホットスポット関数のボトムアップ・ツリー、CPU 時間、および関数ごとの CPU 利用率が表示されます。
[トップダウン・ツリー] ウィンドウには、呼び出しツリー内のホットスポット関数、関数のみのパフォーマンス・メトリック (セルフ値)、および関数とその子関数のパフォーマンス・メトリック (合計値) が表示されます。
[呼び出し元/呼び出し先] ウィンドウには、選択した関数の親関数と子関数が表示されます。
[プラットフォーム] ウィンドウには、CPU と GPU 利用率、フレームレート、メモリー帯域幅、およびユーザータスク (対応するメトリックが収集されている場合 ) に関する詳細情報が表示されます。
アプリケーションの有効な CPU 利用率を調査して、同期や並列ワーク割り当てのオーバーヘッドに関連する低い利用率の原因を特定するには、[サマリー] ウィンドウから開始します。フラグが示される問題に関連したリンクをクリックすると、詳しい情報が表示されます。例えば、[上位の待機オブジェクト] テーブルの同期オブジェクトをクリックすると、[ボトムアップ] ウィンドウのそのオブジェクトに移動します。
待機とシグナルスタック、およびタイムライン上の遷移を使用して、スレッド統合同期オブジェクトを解析します。スレッド化ランタイムに費やされた CPU 時間を調査して、非効率な利用率を分類します。
CPU 利用率のボトルネックを排除し、アプリケーションの並列処理を改善するようにコードを修正します。
待機中のシステム利用率が低い (赤いバー) 、長い待機時間のオブジェクトにチューニング作業を集中します。並列処理の追加、バランス調整、または競合の削減を検討します。実行中のスレッド数が論理コア数と等しくなると、理想的な利用率 (緑のバー) が示されます。
解析を再度実行して、比較モードで最適化を検証し、改善の余地がある領域を特定します。
詳細および解釈のヒントは、「スレッド化効率ビュー」を参照してください。