Поделиться через


Средства диагностики параллельного выполнения (среда выполнения с параллелизмом)

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

Отладка

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

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

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

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

Среда выполнения с параллелизмом использует Трассировку событий 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.

// 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.

См. также

Основные понятия

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