Средства диагностики параллелизма (Concurrency Runtime)

Visual Studio предоставляет расширенную поддержку отладки и профилирования многопоточных приложений.

Отладка

Отладчик Visual Studio включает окно параллельных стеков , окно параллельных задач и окно параллельного просмотра . Дополнительные сведения см. в пошаговом руководстве. Отладка параллельного приложения и практическое руководство. Использование окна параллельных часов.

Профилирование

Средства профилирования предоставляют три представления данных, которые отображают графические, табличные и числовые сведения о том, как многопоточное приложение взаимодействует с собой и с другими программами. Представления позволяют быстро определять проблемные области и перемещаться от точек на графических дисплеях в стеки вызовов, сайты вызова и исходный код. Дополнительные сведения см. в разделе Визуализатор параллелизма.

Трассировка событий

Среда выполнения параллелизма использует трассировку событий для Windows (ETW) для уведомления средств инструментирования, таких как профилировщики, при возникновении различных событий. Эти события включают в себя активацию или деактивацию планировщика, начало или конец контекста, когда он блокируется, разблокируется или уступает управление, а также начало или конец выполнения параллельного алгоритма.

Такие средства, как визуализатор параллелизма, используют эту функцию. Поэтому обычно не нужно работать с этими событиями напрямую. Однако эти события полезны при разработке пользовательского профилировщика или при использовании средств трассировки событий, таких как Набор средств производительности Windows.

Среда выполнения параллелизма вызывает эти события только когда трассировка включена. Вызовите функцию concurrency::EnableTracing, чтобы включить трассировку событий, и функцию concurrency::DisableTracing, чтобы отключить трассировку.

В следующей таблице описываются события, создаваемые средой выполнения при включении трассировки событий:

Мероприятие Описание Значение
конкурентность::ConcRT_ProviderGuid Идентификатор поставщика ETW для среды выполнения Concurrency Runtime. f7b697a3-4db5-4d3b-be71-c4d284e6592f
конкурентность::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
параллелизм::SchedulerEventGuid Помечает события, связанные с планировщиком задач. e2091f8a-1e0a-4731-84a2-0dd57c8a5261
конкурентность::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 одно и то же количество раз, чтобы отключить трассировку.

См. также

Среда выполнения с параллелизмом