並列診断ツール (コンカレンシー ランタイム)

Visual Studio は、マルチ スレッド アプリケーションのデバッグおよびプロファイリングを広範にサポートします。

デバッグ

Visual Studio デバッガーには、[Parallel Stacks (並列スタック)] ウィンドウ、[Parallel Tasks (並列タスク)] ウィンドウ、[Parallel Watch (並列ウォッチ)] ウィンドウがあります。 詳細は、チュートリアル: 並列アプリケーションのデバッグと、方法: 並列ウォッチ ウィンドウを使用するを参照してください。

プロファイル

プロファイリング ツールには、マルチスレッド アプリケーションとその他のプログラムとの対話方法に関する、グラフィカルで表形式の数値情報を表示する 3 つのデータビューが用意されています。 ビューを使用すると、関心のある領域をすばやく特定したり、グラフィカルな表示のポイントから呼び出し履歴、呼び出しサイト、ソース コードに移動できます。 詳細については、「コンカレンシー ビジュアライザー」を参照してください。

イベント トレーシング

同時実行ランタイムは Windows イベント トレーシング (ETW) を使用して、さまざまなイベントが発生したときにプロファイラーなどのインストルメンテーション ツールに通知します。 これらのイベントには、スケジューラがアクティブ化または非アクティブ化されたとき、コンテキストの開始、終了、ブロック、ブロック解除、または生成が発生したとき、および並列アルゴリズムが開始または終了するタイミングが含まれます。

同時実行ビジュアライザーなどのツールは、この機能を使用します。そのため、通常、これらのイベントを直接操作する必要はありません。 ただし、これらのイベントは、カスタム プロファイラーを開発している場合や、Windows パフォーマンス ツールキットなどのイベント トレース ツールを使用する場合に役立ちます。

同時実行ランタイムは、トレースが有効になっている場合にのみ、これらのイベントを発生させます。 Concurrency:: EnableTracing 関数を呼び出してイベントのトレースを有効にし、concurrency::DisableTracing 関数を呼び出してトレースを無効にします。

次の表では、イベント トレースが有効な場合にランタイムによって発生するイベントについて説明します。

イベント 説明 Value
concurrency::ConcRT_ProviderGuid 同時実行ランタイムの ETW プロバイダーの 識別子。 f7b697a3-4db5-4d3b-be71-c4d284e6592f
concurrency::ContextEventGuid コンテキストに関連するイベントをマークします。 5727a00f-50be-4519-8256-f7699871fecb
concurrency::PPLParallelForEventGuid concurrency::parallel_for アルゴリズム呼び出しへの開始と終了をマークします。 31c8da6b-6165-4042-8b92-949e315f4d84
concurrency::PPLParallelForeachEventGuid concurrency::parallel_for_each アルゴリズム呼び出しへの開始と終了をマークします。 5cb7d785-9d66-465d-bae1-4611061b5434
concurrency::PPLParallelInvokeEventGuid concurrency::parallel_invoke アルゴリズム呼び出しへの開始と終了をマークします。 d1b5b133-ec3d-49f4-98a3-464d1a9e4682
concurrency::SchedulerEventGuid タスク スケジューラに関連するイベントをマークします。 e2091f8a-1e0a-4731-84a2-0dd57c8a5261
concurrency::VirtualProcessorEventGuid 仮想プロセッサに関連するイベントをマークします。 2f27805f-1676-4ecc-96fa-7eb09d44302f

同時実行ランタイムは、以下のイベントを定義していますが、現在は発生しません。 ランタイムは、今後使用するためにこれらのイベントを予約します。

Concurrency:: ConcRT_EventType 列挙は、イベントが追跡する可能性のある操作を指定します。 例えば、parallel_for のアルゴリズムの入り口で、ランタイムは PPLParallelForEventGuid イベントを発生させ、CONCRT_EVENT_START を操作として提供します。 parallel_for アルゴリズムが戻る前に、ランタイムは再び PPLParallelForEventGuid イベントを発生させ、CONCRT_EVENT_END を操作として提供します。

次の例は、parallel_for の呼び出しのトレースを有効にする方法を示しています。 ランタイムは、parallel_for の最初の呼び出しをトレースしません。これは、トレースが有効になっていないためです。 EnableTracing を呼び出すと、ランタイムは parallel_for の 2 回目のへの呼び出しをトレースできます。

// etw.cpp
// compile with: /EHsc 
#include <ppl.h>

using namespace concurrency;

int wmain()
{
   // Perform some parallel work. 
   // Event tracing is disabled at this point.
   parallel_for(0, 10000, [](int i) {
      // TODO: Perform work.
   });

   // Enable tracing for a second call to parallel_for.
   EnableTracing();
   parallel_for(0, 10000, [](int i) {
      // TODO: Perform work.
   });   
   DisableTracing();
}

ランタイムは、EnableTracingDisableTracing を呼び出す回数を追跡します。 したがって、EnableTracing を複数回呼び出す場合は、トレースを無効にするために、同じ回数だけ DisableTracing を呼び出す必要があります。

関連項目

コンカレンシー ランタイム