Средства диагностики параллельного выполнения (среда выполнения с параллелизмом)
Visual Studio обеспечивает расширенную поддержку отладки и профилирования многопоточных приложений.
Отладка
Отладчик Visual Studio включает окно Параллельные стеки, окно Параллельные задачи и окно Контроль параллельных данных. Дополнительные сведения см. в разделах Пошаговое руководство. Отладка параллельного приложения и Практическое руководство. Использование окна параллельных контрольных значений.
Профилирование
Средства профилирования предоставляют три представления данных, отображающих графическую, табличную и числовую информацию о том, как многопоточное приложение взаимодействует с самим собой и с другими программами. Представления позволяют быстро определить необходимые области и перейти из точек на графических изображениях к стекам вызовов, местам вызовов и исходному коду. Для получения дополнительной информации см. Визуализатор параллелизма.
Трассировка событий
Среда выполнения с параллелизмом использует Трассировку событий Windows (ETW), чтобы уведомлять средства инструментирования, например профилировщики, о различных событиях. К этим событиям может относится активация или отключение планировщика, запуск, окончание, блокировка, разблокировка или передача контекста, а также запуск и окончание параллельного алгоритма.
Эту функцию используют такие средства, как Визуализатор параллелизма; обычно не требуется работать с этими событиями непосредственно. Однако эти события полезны при разработке пользовательского профилировщика или при использовании таких средств трассировки событий, как Xperf.
Среда выполнения с параллелизмом создает эти события только при включенной трассировке. Чтобы включить трассировку событий, следует вызвать функцию concurrency::EnableTracing, а чтобы выключить — функцию concurrency::DisableTracing.
В следующей таблице перечислены события, которые создает среда выполнения при включенной трассировке.
Событие |
Описание |
Значение |
---|---|---|
Идентификатор поставщика ETW для среды выполнения с параллелизмом. |
f7b697a3-4db5-4d3b-be71-c4d284e6592f |
|
Отмечает события, связанные с контекстами. |
5727a00f-50be-4519-8256-f7699871fecb |
|
Отмечает входы и выходы вызовов алгоритма concurrency::parallel_for. |
31c8da6b-6165-4042-8b92-949e315f4d84 |
|
Отмечает входы и выходы вызовов алгоритма concurrency::parallel_for_each. |
5cb7d785-9d66-465d-bae1-4611061b5434 |
|
Отмечает входы и выходы вызовов алгоритма concurrency::parallel_invoke. |
d1b5b133-ec3d-49f4-98a3-464d1a9e4682 |
|
Отмечает события, связанные с планировщиком заданий. |
e2091f8a-1e0a-4731-84a2-0dd57c8a5261 |
|
Отмечает события, связанные с виртуальными процессорами. |
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.