並列診断ツール (コンカレンシー ランタイム)
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();
}
ランタイムは、EnableTracing
と DisableTracing
を呼び出す回数を追跡します。 したがって、EnableTracing
を複数回呼び出す場合は、トレースを無効にするために、同じ回数だけ DisableTracing
を呼び出す必要があります。