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


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

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

Отладка

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

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

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

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

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

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

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

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

Мероприятие Description Значение
параллелизм::ConcRT_ProviderGuid Идентификатор поставщика ETW для среды выполнения параллелизма. f7b697a3-4db5-4d3b-be71-c4d284e6592f
параллелизм::ContextEventGuid Помечает события, связанные с контекстами. 5727a00f-50be-4519-8256-f7699871fecb
concurrency::P PLParallelForEventGuid Помечает вход и выход для вызовов параллелизма::p arallel_for algorithm. 31c8da6b-6165-4042-8b92-949e315f4d84
concurrency::P PLParallelForeachEventGuid Помечает вход и выход для вызовов алгоритма параллелизма::p arallel_for_each . 5cb7d785-9d66-465d-bae1-4611061b5434
параллелизм::P PLParallelInvokeEventGuid Помечает вход и выход для вызовов алгоритма параллелизма::p arallel_invoke . d1b5b133-ec3d-49f4-98a3-464d1a9e4682
параллелизм::SchedulerEventGuid Помечает события, связанные с планировщиком задач. e2091f8a-1e0a-4731-84a2-0dd57c8a5261
параллелизм::VirtualProcessorEventGuid Помечает события, связанные с виртуальными процессорами. 2f27805f-1676-4ecc-96fa-7eb09d44302f

Среда выполнения параллелизма определяет, но в настоящее время не вызывает следующие события. Среда выполнения резервирует эти события для дальнейшего использования:

Перечисление параллелизма::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 одно и то же количество раз, чтобы отключить трассировку.

См. также

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