Compartir a través de


Herramientas de diagnóstico paralelo (Runtime de simultaneidad)

Visual Studio proporciona amplia compatibilidad para depurar aplicaciones de varios subprocesos y generar perfiles de estas.

Depuración

El depurador de Visual Studio incluye las ventanas Pilas paralelas, Tareas paralelas e Inspección paralela. Para obtener más información, vea Tutorial: Depuración de una aplicación paralela y Procedimientos para usar la ventana Inspección paralela.

Generación de perfiles

Las herramientas de generación de perfiles proporcionan tres vistas de datos en las que se muestra información gráfica, tabular y numérica sobre cómo interactúa una aplicación multiproceso con sí misma y con otros programas. Las vistas permiten identificar rápidamente las áreas problemáticas y navegar desde puntos de representaciones gráficas a pilas de llamadas, sitios de llamadas y código fuente. Para más información, consulte Visualizador de simultaneidad.

Seguimiento de eventos

El Runtime de simultaneidad usa Seguimiento de eventos para Windows (ETW) a fin de notificar a las herramientas de instrumentación, como los generadores de perfiles, cuando se producen varios eventos. Estos eventos incluyen cuándo se activa o desactiva un programador, cuándo empieza o finaliza un contexto, así como cuándo se bloquea, se desbloquea o se produce, y cuándo comienza o finaliza un algoritmo paralelo.

Herramientas como el Visualizador de simultaneidad utilizan esta función; por lo tanto, normalmente no es necesario trabajar directamente con estos eventos. Pero estos eventos son útiles cuando se desarrolla un generador de perfiles personalizado o cuando se usan herramientas de seguimiento de eventos, como el Kit de herramientas de rendimiento de Windows.

El Runtime de simultaneidad genera estos eventos solo cuando el seguimiento está habilitado. Llame a la función concurrency::EnableTracing para habilitar el seguimiento de eventos y a la función concurrency::DisableTracing para deshabilitarlo.

En la tabla siguiente se describen los eventos que genera el runtime cuando se habilita el seguimiento de eventos:

Evento Descripción Valor
concurrency::ConcRT_ProviderGuid El identificador del proveedor de ETW para el Runtime de simultaneidad. f7b697a3-4db5-4d3b-be71-c4d284e6592f
concurrency::ContextEventGuid Marca eventos relacionados con contextos. 5727a00f-50be-4519-8256-f7699871fecb
concurrency::PPLParallelForEventGuid Marca la entrada y la salida de las llamadas al algoritmo concurrency::parallel_for. 31c8da6b-6165-4042-8b92-949e315f4d84
concurrency::PPLParallelForeachEventGuid Marca la entrada y la salida de las llamadas al algoritmo concurrency::parallel_for_each. 5cb7d785-9d66-465d-bae1-4611061b5434
concurrency::PPLParallelInvokeEventGuid Marca la entrada y la salida de las llamadas al algoritmo concurrency::parallel_invoke. d1b5b133-ec3d-49f4-98a3-464d1a9e4682
concurrency::SchedulerEventGuid Marca los eventos relacionados con el Programador de tareas. e2091f8a-1e0a-4731-84a2-0dd57c8a5261
concurrency::VirtualProcessorEventGuid Marca los eventos relacionados con los procesadores virtuales. 2f27805f-1676-4ecc-96fa-7eb09d44302f

El Runtime de simultaneidad define los eventos siguientes, pero actualmente no los genera. El runtime reserva estos eventos para su uso futuro:

La enumeración concurrency::ConcRT_EventType especifica las posibles operaciones que realiza el seguimiento de un evento. Por ejemplo, en la entrada del algoritmo parallel_for, el runtime genera el evento PPLParallelForEventGuid y proporciona CONCRT_EVENT_START como operación. Antes de que el algoritmo parallel_for devuelva un valor, el runtime vuelve a generar el evento PPLParallelForEventGuid y proporciona CONCRT_EVENT_END como operación.

En el ejemplo siguiente se muestra cómo habilitar el seguimiento de una llamada a parallel_for. El runtime no realiza el seguimiento de la primera llamada a parallel_for porque no está habilitada. La llamada a EnableTracing permite al runtime realizar el seguimiento de la segunda llamada a 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();
}

El tiempo runtime realiza un seguimiento del número de veces que llama a EnableTracing y DisableTracing. Por lo tanto, si llama a EnableTracing varias veces, deberá llamar a DisableTracing el mismo número de veces para deshabilitar el seguimiento.

Consulte también

Runtime de simultaneidad