平行診斷工具 (並行執行階段)

Visual Studio 可廣泛支援多執行緒應用程式的偵錯與分析。

偵錯

Visual Studio 調試器包含平行堆疊視窗、平行工作視窗和平行監看式視窗。 如需詳細資訊,請參閱 逐步解說:偵錯平行應用程式 及 如何:使用平行監看式視窗。

性能分析

分析工具提供三個數據檢視,可顯示多線程應用程式如何與其他程式互動的圖形化、表格式和數值資訊。 檢視可讓您快速識別關注的區域,以及從圖形顯示上的點巡覽至呼叫堆棧、呼叫網站和原始程式碼。 如需詳細資訊,請參閱並行視覺化檢視。

事件追蹤

並行運算執行階段使用 Windows 事件追蹤(ETW)以便在發生各種事件時通知分析工具,例如效能剖析器。 這些事件包括排程器被啟動或停用、上下文開始、結束、被阻塞、解除阻塞或產生,以及平行演算法的開始或結束。

並行可視化檢視之類的工具會利用這項功能;因此,您通常不需要直接使用這些事件。 不過,當您開發自定義分析工具或使用 Windows Performance Toolkit 之類的事件追蹤工具時,這些事件很有用。

只有在啟用追蹤時,並行運行時間才會引發這些事件。 呼叫 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。

// 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 相同的次數,才能停用追蹤。

另請參閱

並行執行階段