Partager via


Débogage du code GPU

Vous pouvez déboguer du code C++ qui s’exécute sur l’unité de traitement graphique (GPU). La prise en charge du débogage GPU dans Visual Studio inclut la détection de conditions de concurrence, le lancement de processus et leur connexion, ainsi que l'intégration dans les fenêtres de débogage.

Plateformes prises en charge

Le débogage est pris en charge sur Windows 7, Windows 8, Windows 10, Windows 11, Windows Server 2008 R2, Windows Server 2012 et Windows Server 2016. Pour le débogage sur l’émulateur logiciel, Windows 8, Windows 10, Windows 11 ou Windows Server 2012, Windows Server 2016 est requis. Pour le débogage sur le matériel, vous devez installer les pilotes de votre carte graphique. Tous les fournisseurs de matériel n’implémentent pas toutes les fonctionnalités du débogueur. Consultez la documentation du fournisseur pour connaître les limitations.

Note

Les fournisseurs de matériel indépendants qui souhaitent prendre en charge le débogage GPU dans Visual Studio doivent créer une DLL qui implémente l’interface VSD3DDebug et cible leurs propres pilotes.

Configuration du débogage GPU

Le débogueur ne peut pas s’arrêter sur le code processeur et le code GPU dans la même exécution d’application. Par défaut, le débogueur s’arrête sur le code CPU. Pour déboguer du code GPU, utilisez l’une des deux étapes suivantes :

  • Dans la liste Debug Type dans la barre d’outils Standard , choisissez GPU uniquement.

  • Dans l’Explorateur de solutions, dans le menu contextuel du projet, choisissez Propriétés. Dans la boîte de dialogue Pages de propriétés , sélectionnez Débogage, puis sélectionnez GPU uniquement dans la liste Type du débogueur .

Lancement et connexion à des applications

Vous pouvez utiliser les commandes de débogage Visual Studio pour démarrer et arrêter le débogage GPU. Pour plus d’informations, consultez Navigation dans le code avec le débogueur. Vous pouvez également attacher le débogueur GPU à un processus en cours d’exécution, mais uniquement si ce processus exécute du code GPU. Pour plus d’informations, consultez Attacher aux processus en cours d’exécution.

Exécuter la vignette actuelle sur curseur et exécuter sur curseur

Lorsque vous déboguez sur le GPU, vous avez deux options d’exécution à l’emplacement du curseur. Les commandes des deux options sont disponibles dans le menu contextuel de l’éditeur de code.

  1. La commande Exécuter au curseur exécute votre application jusqu’à ce qu’elle atteigne l’emplacement du curseur, puis s’arrête. Cela n’implique pas que le thread actuel s’exécute jusqu’au curseur ; cela signifie plutôt que le premier thread qui atteint le point du curseur déclenche l’arrêt. Voir Navigation dans le code avec le débogueur

  2. La commande Exécuter la vignette actuelle jusqu'au curseur exécute votre application jusqu’à ce que tous les threads de la vignette actuelle atteignent le curseur, puis s’interrompent.

Débogage de Windows

En utilisant certaines fenêtres de débogage, vous pouvez examiner, marquer et figer des threads GPU. Pour plus d’informations, consultez :

Exceptions de synchronisation des données

Le débogueur peut identifier plusieurs conditions de synchronisation de données pendant l’exécution. Lorsqu’une condition est détectée, le débogueur entre dans l’état de pause. Vous avez deux options : Arrêter ou continuer. À l’aide de la boîte de dialogue Exceptions, vous pouvez configurer la détection par le débogueur de ces conditions et pour quelles conditions il interrompra l'exécution. Pour plus d’informations, consultez Gestion des exceptions avec le débogueur. Vous pouvez également utiliser la boîte de dialogue Options pour spécifier que le débogueur doit ignorer les exceptions si les données écrites ne modifient pas la valeur des données. Pour plus d’informations, consultez Général, Débogage, Boîte de dialogue Options.

Résolution des problèmes

Spécification d’un accélérateur

Les points d’arrêt dans le code GPU ne sont atteints que si le code s’exécute sur l’accélérateur accelerator::direct3d_ref (REF). Si vous ne spécifiez pas d’accélérateur dans votre code, l’accélérateur REF est automatiquement sélectionné comme type d’accélérateur de débogage dans les propriétés du projet. Si votre code sélectionne explicitement un accélérateur, l’accélérateur REF ne sera pas utilisé pendant le débogage et les points d’arrêt ne seront pas atteints, sauf si votre matériel GPU prend en charge le débogage. Vous pouvez résoudre ce problème en écrivant votre code afin qu’il utilise l’accélérateur REF pendant le débogage. Pour plus d’informations, consultez les propriétés du projet et l'utilisation des objets accelerator et accelerator_view et Paramètres de projet pour une Configuration de Débogage C++.

Points d’arrêt conditionnels

Les points d’arrêt conditionnels dans le code GPU sont pris en charge, mais aucune expression ne peut être évaluée sur l’appareil. Lorsqu’une expression ne peut pas être évaluée sur l’appareil, elle est évaluée sur le débogueur. Le débogueur est susceptible de s’exécuter plus lentement que l’appareil.

Erreur : il existe un problème de configuration avec le type d’accélérateur de débogage sélectionné.

Cette erreur se produit lorsqu’il existe une incohérence entre les paramètres du projet et la configuration du PC sur lequel vous déboguez. Pour plus d’informations, consultez Paramètres du projet pour une configuration de débogage C++.

Erreur : le pilote de débogage du type d’accélérateur de débogage sélectionné n’est pas installé sur l’ordinateur cible.

Cette erreur se produit si vous déboguez sur un PC distant. Le débogueur ne peut pas déterminer avant l’exécution si les pilotes sont installés sur le PC distant. Les pilotes sont disponibles auprès du fabricant de la carte graphique.

Erreur : La détection et la récupération du délai d’expiration (TDR) doivent être désactivées sur le site distant.

Il est possible que les calculs AMP C++ dépassent l’intervalle de temps par défaut défini par le processus de détection et de récupération du délai d’attente Windows (TDR). Lorsque cela se produit, le calcul est annulé et les données sont perdues. Pour plus d’informations, consultez Gestion des RDR en C++ AMP.