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