Herramientas de diagnóstico paralelo (Runtime de simultaneidad)
Visual Studio proporciona amplia compatibilidad con la depuración y la generación de perfiles de las aplicaciones multiproceso.
Depuración
El depurador de Visual Studio incluye la ventana de Pilas paralelas , la ventana de Tareas paralelas , y la ventana de Inspección paralela .Para obtener más información, vea Tutorial: Depurar una aplicación paralela y Cómo: Utilizar la Ventana Inspección paralela.
Generación de perfiles
Las herramientas de generación de perfiles proporcionan tres vistas de datos que muestran información numérica, gráfica y tabular sobre cómo una aplicación multithreading interactúa con sí misma y con otros programas.Las vistas le permiten identificar áreas problemáticas rápidamente y navegar de los puntos en las presentaciones gráficas a las pilas de llamadas, sitios de llamada y código fuente.Para obtener más información, vea Visualizador de simultaneidad.
Seguimiento de eventos
El runtime de simultaneidad usa el seguimiento de eventos para Windows (ETW) para notificar a las herramientas de instrumentación, por ejemplo, a los generadores de perfiles, cuándo tienen lugar los distintos eventos.Estos eventos incluyen cuando se activa o desactiva un programador, cuando se inicia, finaliza, se bloquea, se desbloquea o produce resultados un contexto y cuando se inicia o finaliza un algoritmo paralelo.
Las herramientas como Visualizador de simultaneidad utilizan esta funcionalidad; por consiguiente, no suele ser necesario trabajar con estos eventos directamente.Sin embargo, estos eventos son útiles cuando se está desarrollando un generador de perfiles personalizado o cuando se usan las herramientas de seguimiento de eventos, como Xperf.
El runtime de simultaneidad genera estos eventos solo cuando está habilitado el seguimiento.Llame a la función de el concurrency::EnableTracing para habilitar la traza de eventos y la función de el concurrency::DisableTracing para deshabilitar el seguimiento.
En la tabla siguiente se describen los eventos que genera el runtime cuando se habilita el seguimiento de eventos:
Evento |
Descripción |
Valor |
---|---|---|
Identificador del proveedor ETW del runtime de simultaneidad. |
f7b697a3-4db5-4d3b-be71-c4d284e6592f |
|
Marca los eventos relacionados con los contextos. |
5727a00f-50be-4519-8256-f7699871fecb |
|
Marca la entrada y la salida de las llamadas al algoritmo de concurrency::parallel_for . |
31c8da6b-6165-4042-8b92-949e315f4d84 |
|
Marca la entrada y la salida de las llamadas al algoritmo de concurrency::parallel_for_each . |
5cb7d785-9d66-465d-bae1-4611061b5434 |
|
Marca la entrada y la salida de las llamadas al algoritmo de concurrency::parallel_invoke . |
d1b5b133-ec3d-49f4-98a3-464d1a9e4682 |
|
Marca los eventos relacionados con el Programador de tareas. |
e2091f8a-1e0a-4731-84a2-0dd57c8a5261 |
|
Marca los eventos relacionados con los procesadores virtuales. |
2f27805f-1676-4ecc-96fa-7eb09d44302f |
El runtime de simultaneidad define, pero no genera realmente, los siguientes eventos.El runtime reserva estos eventos para uso futuro:
La enumeración de concurrency::ConcRT_EventType especifica las posibles operaciones que un evento sigue.Por ejemplo, en la entrada del algoritmo parallel_for, el runtime genera el evento PPLParallelForEventGuid y proporciona CONCRT_EVENT_START como la operación.Antes de que el algoritmo parallel_for devuelva un resultado, el runtime genera el evento PPLParallelForEventGuid y proporciona CONCRT_EVENT_END como la operación.
En el ejemplo siguiente se muestra cómo habilitar el seguimiento para una llamada a parallel_for.El runtime no realiza el seguimiento de la primera llamada a parallel_for porque el seguimiento no está habilitado.La llamada a EnableTracing permite al runtime hacer un 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 runtime realiza el seguimiento del número de veces que se llama a EnableTracing y DisableTracing.Por consiguiente, si se llama a EnableTracing varias veces, se debe llamar a DisableTracing el mismo número de veces para deshabilitar el seguimiento.