Debuggen von GPU-Code

Sie können C++-Code debuggen, der im Grafikprozessor (Graphics Processing Unit, GPU) ausgeführt wird. Die GPU-Debugunterstützung in Visual Studio umfasst die Raceerkennung, das Starten von Prozessen bzw. Anfügen an Prozesse sowie die Integration in die Debugfenster.

Unterstützte Plattformen

Das Debuggen wird auf Windows 7, Windows 8, Windows 10, Windows 11, Windows Server 2008 R2, Windows Server 2012 und Windows Server 2016 unterstützt. Für Debuggen im Softwareemulator ist Windows 8, Windows 10, Windows Server 11 oder Windows Server 2012, Windows Server 2016 erforderlich. Für das Debuggen auf der Hardware müssen Sie die Treiber für Ihre Grafikkarte installieren. Nicht alle Hardwarehersteller implementieren sämtliche Debuggerfunktionen. Weitere Informationen zu Einschränkungen finden Sie in der Dokumentation des Herstellers.

Hinweis

Unabhängige Hardwareanbieter, die GPU-Debugging in Visual Studio unterstützen möchten, müssen eine DLL erstellen, mit der die VSD3DDebug-Schnittstelle implementiert wird und die auf ihre eigenen Treiber ausgerichtet ist.

Konfigurieren von GPU-Debugging

Der Debugger kann nicht beim CPU- und GPU-Code in der gleichen App-Ausführung unterbrechen. Standardmäßig unterbricht der Debugger beim CPU-Code. Um den GPU-Code zu debuggen, verwenden Sie einen dieser beiden Schritte:

  • Wählen Sie in der Liste Debugtyp auf der Symbolleiste Standard die Option Nur GPU aus.

  • Öffnen Sie im Projektmappen-Explorer das Kontextmenü für das Projekt, und wählen Sie Eigenschaften aus. Wählen Sie im Dialogfeld Eigenschaftenseiten die Option Debuggen und dann in der Liste Debuggertyp die Option Nur GPU aus.

Starten von und Anfügen an Anwendungen

Sie können die Visual Studio-Debuggingbefehle verwenden, um das GPU-Debugging zu starten und zu beenden. Weitere Informationen finden Sie unter Navigieren im Code mit dem Debugger. Sie können den GPU-Debugger auch an einen laufenden Prozess anfügen, jedoch nur, wenn dieser Prozess GPU-Code ausführt. Weitere Informationen finden Sie unter Anfügen an laufende Prozesse.

Befehle "Aktuelle Kachel bis zum Cursor ausführen" und "Ausführen bis Cursor"

Wenn Sie im Grafikprozessor debuggen, stehen Ihnen zwei Möglichkeiten zum Ausführen bis zur Cursorposition zur Verfügung. Die Befehle für beide Optionen sind im Kontextmenü des Code-Editors verfügbar.

  1. Mit dem Befehl Ausführen bis Cursor wird die App ausgeführt, bis sie die Cursorposition erreicht und dann angehalten wird. Dies bedeutet nicht, dass der aktuelle Thread bis zur Cursorposition ausgeführt wird, sondern vielmehr, dass der erste Thread, der die Cursorposition erreicht, die Unterbrechung auslöst. Weitere Informationen finden Sie unter Navigieren im Code mit dem Debugger.

  2. Mit dem Befehl Aktuelle Kachel bis zum Cursor ausführen wird die App ausgeführt, bis alle Threads in der aktuellen Kachel die Cursorposition erreichen und dann angehalten werden.

Debugfenster

Wenn Sie bestimmte Debugfenster verwenden, können Sie GPU-Threads überprüfen, kennzeichnen und einfrieren. Weitere Informationen finden Sie unter:

Ausnahmen bei Datensynchronisierung

Der Debugger kann mehrere Datensynchronisierungsbedingungen während der Ausführung erkennen. Wenn eine Bedingung erkannt wird, wechselt der Debugger in den Unterbrechungszustand. Sie haben zwei Optionen: Unterbrechen oder Weiter. Im Dialogfeld Ausnahmen können Sie konfigurieren, ob der Debugger diese Bedingungen erkennen soll und bei welchen Bedingungen eine Unterbrechung ausgelöst werden soll. Weitere Informationen finden Sie unter Verwalten von Ausnahmen mit dem Debugger. Sie können im Dialogfeld Optionen auch angeben, ob der Debugger Ausnahmen ignorieren soll, wenn geschriebene Daten den Wert der Daten nicht ändern. Weitere Informationen finden Sie unter General, Debugging, Options Dialog Box.

Problembehandlung

Festlegen einer Zugriffstaste

Haltepunkte im GPU-Code werden nur erreicht, wenn der Code auf der REF-Zugriffstaste accelerator::direct3d_ref ausgeführt wird. Wenn Sie keine Zugriffstaste im Code angeben, wird die REF-Zugriffstaste automatisch als Debuggingbeschleunigungstyp in den Projekteigenschaften ausgewählt. Wenn der Code explizit eine Zugriffstaste auswählt, wird die REF-Zugriffstaste nicht beim Debuggen verwendet und die Haltepunkte werden nicht erreicht, es sei denn, die GPU-Hardware verfügt über Debugunterstützung. Um dieses Problem zu beheben, schreiben Sie den Code so, dass die REF-Zugriffstaste beim Debuggen verwendet wird. Weitere Informationen finden Sie unter „Projekteigenschaften“ und Verwenden von accelerator- und accelerator_view-Objekten sowie unter Projekteinstellungen für eine C++-Debugkonfiguration.

Bedingte Haltepunkte

Bedingte Haltepunkte im GPU-Code werden unterstützt, jedoch kann nicht jeder Ausdruck auf dem Gerät ausgewertet werden. Wenn ein Ausdruck nicht auf dem Gerät ausgewertet werden kann, wird er im Debugger ausgewertet. Der Debugger wird wahrscheinlich langsamer ausgeführt als das Gerät.

Fehler: Bei der Konfiguration des ausgewählten Debugbeschleunigungstyps ist ein Problem aufgetreten.

Dieser Fehler tritt auf, wenn es zwischen den Projekteinstellungen und der Konfiguration des PCs, auf dem Sie debuggen, eine Inkonsistenz gibt. Weitere Informationen finden Sie unter Projekteinstellungen für eine C++-Debugkonfiguration.

Fehler: Der Debugtreiber für den ausgewählten Debugbeschleunigungstyp ist nicht auf dem Zielcomputer installiert.

Dieser Fehler tritt auf, wenn Sie auf einem Remotecomputer debuggen. Der Debugger kann bis zur Laufzeit nicht bestimmen, ob die Treiber auf dem Remotecomputer installiert sind. Die Treiber sind vom Hersteller der Grafikkarte erhältlich.

Fehler: Auf der Remotesite muss TDR (Timeout Detection and Recovery) deaktiviert sein.

Es ist möglich, dass die C++ AMP-Berechnungen das Standardzeitintervall überschreiten, das durch den Windows-TDR-Prozess (Timeout Detection and Recovery) festgelegt wird. Wenn dies geschieht, wird die Berechnung abgebrochen und die Daten gehen verloren. Weitere Informationen finden Sie unter Behandlung von TDRs in C++ AMP.