Ferramentas de diagnóstico em paralelo (Tempo de Execução de Simultaneidade)
Visual Studio fornece amplo suporte à depuração e analisar aplicativos multi-threaded.
Depuração
O depurador do Visual Studio inclui a janela de Pilhas Paralelas , a janela de Tarefas Paralelas , e a janela de Inspeção Paralela . Para obter mais informações, consulte Instruções passo a passo: depurando um aplicativo paralelo e Como usar a janela Inspeção Paralela.
Criação de Perfil
As ferramentas de criação de perfil fornece três exibições de dados que exibem informações gráfico, tabulares e numérica sobre como um aplicativo multi-threaded interage com se e com outros programas. As exibições permitem que você identifique rapidamente áreas de intervenção, e para navegar em pontos em exibições gráficas para pilhas de chamadas, a sites da chamada, e no código-fonte. Para obter mais informações, consulte Visualizador de Simultaneidade.
Rastreamento de eventos
O tempo de execução de simultaneidade usa Rastreamento de Eventos do Windows (ETW) para notificar ferramentas de gerenciamento, como perfiladores, quando vários eventos ocorrem. Esses eventos incluem quando um agendador é ativado ou desativado, quando um contexto começa, termina, o bloqueia, desbloquear, ou continua e, quando um algoritmo paralelo inicia ou termina.
Ferramentas como Visualizador de Simultaneidade utilizam essa funcionalidade; em virtude disso, você normalmente não precisa trabalhar com esses eventos diretamente. No entanto, esses eventos são úteis quando você estiver desenvolvendo um evento personalizado ou quando você usa ferramentas de rastreamento de eventos como Xperf.
O tempo de execução de simultaneidade gerencie esses eventos somente quando o rastreamento é habilitado. Chame a função de concurrency::EnableTracing para habilitar o rastreamento de eventos e a função de concurrency::DisableTracing para desabilitar o rastreamento.
A tabela a seguir descreve os eventos que o tempo de execução aumenta quando o rastreamento de eventos é habilitado:
Evento |
Descrição |
Valor |
---|---|---|
O identificador do provedor ETW do tempo de execução de simultaneidade. |
f7b697a3-4db5-4d3b-be71-c4d284e6592f |
|
Marca os eventos relacionados aos contextos. |
5727a00f-50be-4519-8256-f7699871fecb |
|
Marca a entrada e a saída com chamadas para o algoritmo de concurrency::parallel_for . |
31c8da6b-6165-4042-8b92-949e315f4d84 |
|
Marca a entrada e a saída com chamadas para o algoritmo de concurrency::parallel_for_each . |
5cb7d785-9d66-465d-bae1-4611061b5434 |
|
Marca a entrada e a saída com chamadas para o algoritmo de concurrency::parallel_invoke . |
d1b5b133-ec3d-49f4-98a3-464d1a9e4682 |
|
Marca os eventos relacionados a Agendador de tarefas. |
e2091f8a-1e0a-4731-84a2-0dd57c8a5261 |
|
Marca os eventos relacionados aos processadores virtuais. |
2f27805f-1676-4ecc-96fa-7eb09d44302f |
O tempo de execução de simultaneidade define, mas não aumenta atualmente, os seguintes eventos. O tempo de execução reserva esses eventos para uso futuro:
A enumeração de concurrency::ConcRT_EventType especifica as operações possíveis que um evento rastreia. Por exemplo, na entrada do algoritmo de parallel_for , o tempo de execução gerencie o evento de PPLParallelForEventGuid e fornece CONCRT_EVENT_START como a operação. Antes do algoritmo de parallel_for retorna, o tempo de execução novamente gerencie o evento de PPLParallelForEventGuid e fornece CONCRT_EVENT_END como a operação.
O exemplo a seguir ilustra como habilitar o rastreamento para uma chamada a parallel_for. O tempo de execução não rastreia a primeira chamada a parallel_for porque o rastreamento não habilitado. A chamada para EnableTracing permite que o tempo de execução para rastrear o segundo chamada para 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();
}
O tempo de execução controla o número de vezes que você chama EnableTracing e DisableTracing. Em virtude disso, se você chamar EnableTracing várias vezes, você deve chamar DisableTracing o mesmo número de vezes para desabilitar o rastreamento.