並列診断ツール (同時実行ランタイム)

更新 : 2010 年 6 月

Microsoft Visual Studio 2010 には、マルチスレッド アプリケーションのデバッグとプロファイリングを行うための広範なサポートが用意されています。

デバッグ

Visual Studio デバッガーには、新しく [並列スタック] ウィンドウおよび [並列タスク] ウィンドウが追加されました。 詳細については、「チュートリアル: 並行アプリケーションのデバッグ」を参照してください。

プロファイル

Visual Studio Team Developer Edition プロファイリング ツールには、マルチスレッド アプリケーションの動作および他のプログラムとの相互動作について、3 種類のデータ ビュー (それぞれグラフィカルな情報、表形式の情報、および数値情報を表示) が用意されています。 これらのビューにより、対象となる領域をすばやく特定し、グラフィカル表示上のポイントから呼び出し履歴、呼び出しサイトおよびソース コードに移動できます。 詳細については、「同時実行ビジュアライザー」を参照してください。

イベント トレーシング

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

同時実行ビジュアライザー などのツールではこの機能が利用されるため、通常、これらのイベントを直接使用する必要はありません。 ただし、カスタム プロファイラーを開発する場合や、Xperf などのイベント トレーシング ツールを使用する場合、これらのイベントは便利です。

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

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

イベント

説明

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 も同じ回数呼び出す必要があります。

参照

概念

同時実行ランタイム

履歴の変更

日付

履歴

理由

2010 年 6 月

イベント トレーシングに関する情報を追加。

情報の拡充