Freigeben über


Analysieren von Frames mit GPU-Erfassungen

GPU (oder Frame) erfasst alle Direct3D 12-API-Aufrufe, die Ihre Anwendung vornimmt, in der Regel in einem einzigen Frame (siehe Erfassung einer GPU). PIX kann diese API-Aufrufe wiedergeben, um Informationen zu API-Aufrufparametern, Pipeline- und Ressourcenzuständen, Ressourceninhalten und mehr anzuzeigen.

Tipp

Es ist nicht immer möglich, dass PIX eine GPU-Erfassung erfolgreich durchführen kann, wenn ein Spiel Direct3D 12 auf ungültige Weise aufruft. PIX bemüht sich am besten, auch im Falle falscher Nutzungsmuster robust zu sein, aber dies ist zwangsläufig ein Fall von „Garbage in, Garbage Out”. Wenn Sie Schwierigkeiten beim Erstellen von GPU-Erfassungen haben, versuchen Sie, die D3D12-Debug-Schicht und GPU-basierte Überprüfung zu verwenden, um fehlerhafte API-Aufrufe zu finden und zu beheben.

Erstellen einer GPU-Erfassung

Starten Sie in der Verbindungsansicht entweder den gewünschten Prozess oder fügen Sie sie an (stellen Sie sicher, dass die relevante Option für die GPU-Erfassung aktiviert ist).

Konfigurieren Sie die GPU-Erfassungsoptionen nach Bedarf. Um die Erfassung zu übernehmen, klicken Sie entweder auf die Schaltfläche GPU-Erfassung erstellen in PIX, oder drücken Sie ALT+Druckbildschirm (oder F11, konfigurierbar in den PIX-Einstellungen). In der PIX-Benutzeroberfläche wird eine Vorschauminiatur der Erfassung angezeigt. An diesem Punkt können Sie Ihre Anwendung bei Bedarf beenden. Klicken Sie auf die Vorschauminiatur, um die Erfassung zu öffnen.

Programmgesteuerte Erfassungen

Mit der WinPixEventRuntime können Sie programmgesteuert eine Erfassung machen. Ausführliche Informationen finden Sie im Blogbeitrag Programmgesteuerte Erfassung.

Anzeigen von API-Aufrufen mit der Ereignisansicht

In der Ereignisansicht werden alle API-Aufrufe angezeigt, die in einer GPU-Erfassung aufgezeichnet wurden. Es gibt eine separate Liste für jede Direct3D 12-Warteschlange (Grafiken, Compute oder Kopie), die vom Spiel verwendet wurde.

Die Ereignisliste kann gefiltert werden, optional mithilfe regulärer Ausdrücke (klicken Sie auf die Schaltfläche mit der Bezeichnung .*). Standardmäßig werden nur Ereignisse angezeigt, die zu tatsächlicher Rendering-Arbeit für die GPU-Hardware geführt haben, anstatt einfach den Zustand für die Verwendung durch spätere Vorgänge vorzubereiten. Um Nicht-GPU-Ereignisse einzuschließen, klicken Sie auf die Schaltfläche mit der Bezeichnung !G.

Weitere Informationen zu jedem Ereignis, z. B. den vollständigen Satz von API-Aufrufparametern, finden Sie in der Ansicht Ereignisdetails. Diese Ansicht ist standardmäßig auf der Registerkarte Pipeline enthalten, kann aber auch über die Schaltfläche Layoutentwurfsmodus in der oberen rechten Ecke des HAUPT-PIX-Fensters zu Ihrem aktuellen Layout hinzugefügt werden.

Rahmenprofilerstellung

Wechseln Sie bei geöffneter GPU-Erfassung zur Registerkarte „Übersicht”. Hier sehen Sie einige grundlegende Details zur Erfassung.

Um mit der Profilerstellung zu beginnen, müssen Sie Zeitangaben sammeln. Klicken Sie dazu auf die Schaltfläche Anzeigedauerdaten sammel in der Ereignisansicht oben rechts oder klicken Sie auf Hier klicken, um die Analyse zu starten und Zeitangaben in der Zeitachsenansicht zu erfassen. Dadurch wird die GPU in der Erfassung ausgeführt und grundlegende Anzeigedauerdaten wie Ausführungsdauer (mit PixEvents kommentiert, wenn Ihre Anwendung sie hat) erfasst. Nach Abschluss des Vorgangs können Sie zusätzliche Daten sammeln, die in Zeitachsenspuren dargestellt werden sollen, z. B. Belegungsinformationen und andere GPU-spezifische Zähler.

Tipp

Um optimale Ergebnisse zu erzielen, interagieren Sie nicht mit Ihrem Computer, während PIX Zeitdaten sammelt; und schließen Sie alle anderen Anwendungen, die möglicherweise die GPU verwenden.

Sie können auch Indikatoren sehen, die nach API-Aufruf in der Ereignisansicht aufgeschlüsselt sind. Zum Aktivieren/Deaktivieren von Leistungsindikatoren klicken Sie auf die Schaltfläche Ereignislistenzähler (oben rechts in der Ereignisansicht).

Timing-Daten

Es gibt zwei Quellen für GPU-Anzeigedauerinformationen:

  1. Start-of-Pipe-Zeitstempel melden, wenn die GPU mit der Verarbeitung der einzelnen Arbeitsabschnitte beginnt. Beachten Sie, dass diese Daten nur verfügbar sind, wenn Windows 10, Build 14393 (oder höher) mit einem geeigneten Grafiktreiber ausgeführt wird (siehe Blogbeitrag Anforderungen). Timing-Daten dauern länger, um zu erfassen, wenn Start-of-Pipe-Zeitstempel nicht verfügbar sind.
  2. End-of-Pipe(EOP)-Zeitstempel melden, wenn die GPU die Verarbeitung der einzelnen Arbeitsabschnitte abgeschlossen hat.

Da GPUs massiv parallel und tief weitergeleitet werden, ist es üblich, dass mehrere Aufgaben gleichzeitig ausgeführt werden und benachbarte Vorgänge überlappen. PIX misst Zeit auf zwei verschiedene Arten, die Einblicke in das parallele Ausführungsmodell der Hardware bieten können:

  1. Die Ausführungsdauer wird vom Start-of-Pipe bis zum Zeitstempel End-of-Pipe gemessen. Auf diese Weise gemessen, funktionieren GPU-Arbeitselemente, die parallel zu früheren Elementen ausgeführt werden, möglicherweise länger als wenn sie isoliert ausgeführt wurden, aufgrund der Berücksichtigung der GPU.
  2. Die EOP-Dauer wird vom EOP-Zeitstempel (End-of-Pipe) des vorherigen Elements an den EOP-Zeitstempel dieses Elements gemessen. Arbeitsaufgaben, die parallel zu früheren Elementen ausgeführt werden, werden daher kürzer angezeigt als wenn sie isoliert ausgeführt wurden, und einige Elemente werden möglicherweise sogar als Null-Dauer gemeldet, wenn sie vollständig parallel zum vorherigen Element abgeschlossen wurden.

In der Zeitachsenansicht werden mindestens eine Spur mit der Anzeigedauer der einzelnen GPU-Vorgänge angezeigt. Es gibt eine separate Spur, die EOP-Dauerdaten für jede Warteschlange (Grafiken, Compute oder Kopie) enthält, die vom Spiel verwendet werden, sowie eine einzelne Spur mit Ausführungsdauer-Daten (sofern verfügbar) in allen Warteschlangen kombiniert.

Anzeigedauerinformationen in der PIX GPU-Erfassungszeitachsenansicht

Tipp

PIX unter Windows überlappt derzeit keine GPU-Arbeit in verschiedenen Warteschlangen, während die Anzeigedauer in GPU-Aufzeichnungen analysiert wird. Erwägen Sie, eine Timing-Erfassung zu erstellen, wenn Sie überlappende asynchrone Compute-Timing-Daten sehen möchten. Wenn in GPU-Erfassungen ein Spiel asynchrone Compute zum gleichzeitigen Ausführen von Rendering und Compute verwendet, misst PIX stattdessen zuerst und dann das andere. Dies kann zu einer kürzeren Dauer der Berichterstattung für jeden Teil der Arbeit im Vergleich zur Ausführung innerhalb des ursprünglichen Spiels (aufgrund der geringeren Belastung der GPU) führen, aber eine längere Gesamtzeit (aufgrund einer reduzierten Parallelisierung).

GPU-Leistungsindikatoren und Belegung

PIX macht hardwarespezifische Leistungsindikatoren verfügbar, die von IHVs über ein GPU-Plug-In bereitgestellt werden. Diese Indikatoren können entweder in der Ansicht Ereignislistenzähler (Schaltfläche zum Aktivieren oben rechts in der Ereignisansicht) oder in der Ansicht Zeitachsenindikatoren (Schaltfläche zum Aktivieren oben rechts in der Zeitachsenansicht) aktiviert und erfasst werden.

Auf einigen GPUs kann PIX auch Belegungsinformationen sammeln. GPUs werden in der Regel als Hierarchie wiederholter Blöcke erstellt, bei denen jede Ebene eine Ressource gemeinsam nutzen kann. Eine imaginäre GPU könnte z. B. wie folgt strukturiert sein:

Beispiel für eine Abbildung des GPU-Blocks

GPUs führen Shader aus, indem der Shader in Wellen unterteilt wird (diese werden auch als Verzerrungen oder Wellenfronten bezeichnet). Im obigen Diagramm kann jeder blaue Block eine Welle ausführen. Jeder grüne Block kann bis zu vier Wellen ausführen.

Da alle Blauen einen einzelnen Satz von Registern gemeinsam nutzen, kann, wenn eine Workload alle Register benötigt, jeweils nur eine Welle im grünen Block ausgeführt werden. In diesem Fall wäre die Belegung des grünen Blocks 1, von einer gesamt möglichen Belegung von 4.

Zu jedem Zeitpunkt können alle grünen Blöcke eine andere Anzahl von Wellen ausführen. Von den vier grünen Blöcken oben kann man 3 Wellen, weitere 2 Wellen und die verbleibende 1 Welle ausführen. PIX reduziert alle Daten auf einen einzelnen Wert – die maximale Belegung, die in diesem Beispiel 3 wäre.

Dies wird in PIX in der Belegungsspur vorgestellt, die die maximale Belegung zeigt, getrennt durch Shader-Phase. Das ist ein Hinweis darauf, wie viel Arbeit die GPU parallel ausführen kann – höhere Balken zeigen eine bessere GPU-Auslastung.

GPU-Zähler in der PIX GPU-Erfassungszeitachsenansicht

Debuggen von Rendering-Problemen

Wenn eine GPU-Aufnahme geöffnet ist, wechseln Sie zur Registerkarte Pipeline. Diese Registerkarte enthält eine Ereignisansicht, mehrere Zustands- und Ressourcenprüfungsansichten und eine Pipelineansicht .

Das Auswählen eines Ereignisses in der Ereignisansicht versorgt verschiedene Ansichten, insbesondere die Pipelineansicht, die verwendet werden kann, um Stammsignaturen und Pipelinestatus sowie gebundene Ressourcen zu prüfen. Die Pipelineansicht ist auch der Einstiegspunkt zum Shader-Debugging.

Tipp

Um die meisten Features auszuführen, müssen Sie mit der Analyse beginnen. Analyse ist, wie PIX Zeitdaten, Zustandsinformationen und Ressourcen sammelt. Es gibt viele Möglichkeiten, die Analyse zu starten, aber der allgemeine Weg ist über die Schaltfläche Analysewiedergabe starten oben rechts in der Anwendung. Stellen Sie sicher, dass die gewünschten GPU ausgewählt wurde.

Anzeigen von Direct3D 12-Objekten, -Parametern und -Zustand

Nachdem Sie ein Ereignis in der Ereignisansicht ausgewählt haben, zeigen die Ansichten Status und Pipeline (auf der Registerkarte Pipeline) Details zum Direct3D-Zustand zum Zeitpunkt dieses Ereignisses an. Dort können Sie anzeigen, welche Ressourcen an den Pipeline-, Shader-Code, Eingaben, Ausgaben und die aktuell gebundenen Render-Targets gebunden sind.

Direct3D-Pipelinestatus

Anzeigen der VS-Ausgabe in der Pipelineansicht

Shader-Debugging

Nachdem Sie ein entsprechendes Ereignis ausgewählt und die Analyse ausgeführt haben, können Sie die Shader debuggen. In der Pipelineansicht gibt es mehrere Möglichkeiten zum Initiieren des Shader-Debuggings:

  1. Wählen Sie den Shader-Eintrag unter der gewünschten Shader-Phase aus, und klicken Sie auf die grüne Wiedergabeschaltfläche. Stellen Sie vor dem Starten der Debug-Sitzung sicher, dass Sie die entsprechenden Shader-Parameter konfigurieren (z. B. Instanz- und Vertex-IDs für Vertex-Shader oder Pixelkoordinaten für Pixelshader).
  2. Klicken Sie mit der rechten Maustaste in einen Ressourcen-Viewer (z. B. VS-Ausgabe oder SRV/UAV/RTV), und wählen Sie die entsprechende Debug-Option aus.
  3. Klicken auf die Schaltfläche Pixel debuggen in der Pixeldetails-Ansicht beim Anzeigen einer geeigneten Ressource (z. B. SRV/UAV/RTV).

Tipp

Wenn Sie beim Debuggen die Shader-Quelle nicht sehen können, fehlen wahrscheinlich Debug-Informationen. Stellen Sie sicher, dass Sie die Shader-PDBs für Ihre Anwendung generieren und dass Sie PIX so konfiguriert haben, dass diese PDBs geladen werden.

Shader bearbeiten & fortfahren

HLSL-Shader-Code kann direkt innerhalb von PIX bearbeitet werden, sodass Sie sofort die Auswirkungen Ihrer Änderungen auf Rendering-Ergebnisse oder Leistung sehen können. Dies kann für die Prototyperstellung und Optimierung von Shadern nützlich sein, da sie die Bearbeitungszeit beim Ausprobieren verschiedener Ideen erheblich reduzieren kann.

Nachdem Sie einen Shader ausgewählt haben, können Sie dessen Code beliebig bearbeiten und dann auf Bearbeiten>Übernehmen klicken. Andere Ansichten (z. B. OM RTV 0) werden aktualisiert, um die Auswirkung Ihrer Änderung anzuzeigen. Möglicherweise ist es hilfreich, mehrere Instanzen der Pipelineansicht nebeneinander anzudocken, um Render-Target-Ergebnisse gleichzeitig mit dem Bearbeitungs-Shader-Code anzuzeigen.

Wenn Sie nicht mehr genau wissen, was Sie geändert haben, klicken Sie mit der rechten Maustaste auf den Shader-Code und wählen Sie Diff mit Original aus.

Tipp

PIX unter Windows unterstützt das Speichern geänderter Shader noch nicht in der Erfassungsdatei.

Debuggen von Schnellansichten

Render-Target-Visualisierungen sind in der Pipelineansicht verfügbar, wenn der Inhalt eines Render-Targets überprüft wird. Die Standardmäßige Bildschnellansicht zeigt das Bild einfach normal an und kann geändert werden, indem eine andere Visualisierung in der Visualisierungsansicht ausgewählt wird.

Pixelverlauf

Für jede pixelähnliche Ressource (z. B. RTVs, UAVs oder Tiefenpuffer) können Sie alle Vorgänge anzeigen, die sich auf ein bestimmtes Pixel auswirken, indem Sie den Pixelverlauf verwenden. Auf dies kann zugegriffen werden, indem Sie mit der rechten Maustaste auf das gewünschte Pixel klicken und Pixelverlauf anzeigen auswählen oder auf die Schaltfläche Pixelverlauf in der Pixeldetails-Ansicht klicken.

Hinweise zu Vorbehalten und sonstigen Notizen

  • Es ist nicht immer möglich, dass PIX eine GPU-Erfassung erfolgreich durchführen kann, wenn ein Spiel Direct3D 12 auf ungültige Weise aufruft. PIX bemüht sich am besten, auch im Falle falscher Nutzungsmuster robust zu sein, aber dies ist zwangsläufig ein Fall von „Garbage in, Garbage Out”. Wenn Sie Schwierigkeiten beim Erstellen von GPU-Erfassungen haben, dann versuchen Sie, die D3D12-Debug-Schicht und GPU-basierte Überprüfung zu verwenden, um fehlerhafte API-Aufrufe zu finden und zu beheben.
  • Windows-GPU-Erfassungen sind im Allgemeinen nicht für unterschiedliche GPU-Hardware- und Treiberversionen portierbar. In den meisten Fällen wird eine Erfassung, die auf einem Computer ausgeführt wird, ordnungsgemäß auf anderen ähnlichen GPUs aus derselben Hardwarefamilie wiedergegeben, und die Erfassung einiger Spiele kann sogar über GPUs von völlig unterschiedlichen Herstellern hinweg funktionieren, aber es ist auch möglich, dass etwas so trivial wie ein Treiberupgrade die Kompatibilität mit älteren Erfassungen beeinträchtigen könnte. PIX kann garantieren, dass die Wiedergabe nur erfolgreich ist, wenn die GPU und der Treiber genau gleich sind, daher warnt PIX vor dem Starten der Analyse, wenn keine perfekte Übereinstimmung vorliegt. Fahren Sie mit dieser Warnung auf eigenes Risiko fort.
  • PIX hat eingeschränkte Unterstützung für mehrere GPUs. GPU-Erfassungen werden immer auf einem einzelnen Adapter wiedergegeben, unabhängig davon, wie viele Adapter die Anwendung verwendet hat. PIX ermöglicht es Ihnen, den Wiedergabeadapter aus einem Dropdown-Angebot in der PIX-Symbolleiste auszuwählen. PIX versucht, den Wiedergabeadapter automatisch auszuwählen, wenn die Anwendung nur einen Adapter verwendet hat.
  • Bei nicht deterministischen ExecuteIndirect-Workloads sollten Sie die Einstellung ExecuteIndirect-Argumentpuffer verwenden aktivieren.