Partager via


Outils de diagnostic parallèles (runtime d'accès concurrentiel)

Visual Studio fournit une prise en charge complète des applications de débogage et de profilage multithread.

Débogage

Le débogueur Visual Studio inclut la fenêtre Stacks parallèles, la fenêtre Tâches parallèles et la fenêtre Espion parallèle. Pour plus d’informations, consultez Procédure pas à pas : débogage d’une application parallèle et guide pratique pour utiliser la fenêtre Espion parallèle.

Profilage

Les outils de profilage fournissent trois vues de données qui affichent des informations graphiques, tabulaires et numériques sur la façon dont une application multithread interagit avec elle-même et avec d’autres programmes. Les vues vous permettent d’identifier rapidement les zones de préoccupation et de naviguer à partir de points sur les affichages graphiques pour appeler des piles, des sites d’appel et du code source. Pour plus d’informations, consultez Visualiseur concurrentiel.

Suivi de l'événement

Le runtime d’accès concurrentiel utilise le suivi des événements pour Windows (ETW) pour notifier les outils d’instrumentation, tels que les profileurs, lorsque différents événements se produisent. Ces événements incluent lorsqu’un planificateur est activé ou désactivé, lorsqu’un contexte commence, se termine, bloque, débloque ou génère, et lorsqu’un algorithme parallèle commence ou se termine.

Les outils tels que le visualiseur concurrentiel utilisent cette fonctionnalité ; par conséquent, vous n’avez généralement pas besoin d’utiliser ces événements directement. Toutefois, ces événements sont utiles lorsque vous développez un profileur personnalisé ou lorsque vous utilisez des outils de suivi d’événements tels que windows Performance Toolkit.

Le runtime d’accès concurrentiel déclenche ces événements uniquement lorsque le suivi est activé. Appelez la fonction concurrency ::EnableTracing pour activer le suivi d’événements et la fonction concurrency ::D isableTracing pour désactiver le suivi.

Le tableau suivant décrit les événements que le runtime déclenche lorsque le suivi des événements est activé :

Événement Description active
concurrency ::ConcRT_ProviderGuid Identificateur du fournisseur ETW pour le runtime d’accès concurrentiel. f7b697a3-4db5-4d3b-be71-c4d284e6592f
concurrency ::ContextEventGuid Marque les événements liés aux contextes. 5727a00f-50be-4519-8256-f7699871fecb
concurrency ::P PLParallelForEventGuid Marque l’entrée et la sortie des appels à l’algorithme concurrency ::p arallel_for . 31c8da6b-6165-4042-8b92-949e315f4d84
concurrency ::P PLParallelForeachEventGuid Marque l’entrée et la sortie des appels à l’algorithme concurrency ::p arallel_for_each . 5cb7d785-9d66-465d-bae1-4611061b5434
concurrency ::P PLParallelInvokeEventGuid Marque l’entrée et la sortie des appels à l’algorithme concurrency ::p arallel_invoke . d1b5b133-ec3d-49f4-98a3-464d1a9e4682
concurrency ::SchedulerEventGuid Marque les événements liés au planificateur de tâches. e2091f8a-1e0a-4731-84a2-0dd57c8a5261
concurrency ::VirtualProcessorEventGuid Marque les événements liés aux processeurs virtuels. 2f27805f-1676-4ecc-96fa-7eb09d44302f

Le runtime d’accès concurrentiel définit, mais ne déclenche pas actuellement les événements suivants. Le runtime réserve ces événements pour une utilisation ultérieure :

L’énumération concurrency ::ConcRT_EventType spécifie les opérations possibles qu’un événement suit. Par exemple, à l’entrée de l’algorithme parallel_for , le runtime déclenche l’événement PPLParallelForEventGuid et fournit CONCRT_EVENT_START comme opération. Avant que l’algorithme parallel_for ne retourne, le runtime déclenche à nouveau l’événement PPLParallelForEventGuid et fournit CONCRT_EVENT_END comme opération.

L’exemple suivant montre comment activer le suivi pour un appel à parallel_for. Le runtime n’effectue pas le suivi du premier appel, parallel_for car il n’est pas activé. Appel permettant au EnableTracing runtime d’effectuer le suivi du deuxième appel vers 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();
}

Le runtime effectue le suivi du nombre de fois que vous appelez EnableTracing et DisableTracing. Par conséquent, si vous appelez EnableTracing plusieurs fois, vous devez appeler DisableTracing le même nombre de fois pour désactiver le suivi.

Voir aussi

Concurrency Runtime