CPU- und GPU-Frame-Verarbeitungszeiten schätzen

Die geschätzten Frame-Verarbeitungszeiten (Frame-Times) für CPU und GPU sind wichtig, um die Leistung Ihrer App zu verstehen und Engpässe zu finden. Wenn Sie eine App mit AGI profilieren, stellt System Profiler Tracedaten bereit, mit denen Sie die Frame-Zeiten schätzen können.

CPU-Zeiten

In AGI können Sie die gesamten und aktiven CPU-Frame-Zeiten im CPU-Track eines Systemprofils ansehen.

CPU-Gesamtzeit

Um die gesamte CPU-Zeit zu messen, die für die Verarbeitung aufgewendet wurde, wählen Sie den Zeitraum aus, der die Zeit zwischen aufeinanderfolgenden Ereignissen zum Einreichen von Frames umfasst. Die Ereignisse für die Frame-Übermittlung sind eglSwapBuffers (für OpenGL) und vkQueuePresentKHR (für Vulkan).

Ein Screenshot von eglSwapBuffer-Ereignissen.
Abbildung 1. Zeit zwischen zwei eglSwapBuffer-Ereignissen.


Ein Screenshot eines vkQueuePresentKHR-Ereignisses.
Abbildung 2: Zeit zwischen zwei vkQueuePresentKHR-Ereignissen.

Diese Messung ist eine Schätzung der gesamten CPU-Zeit,stellt aber nicht unbedingt die aktive CPU-Zeit dar. Bei GPU-gebundenen Apps wartet die CPU beispielsweise möglicherweise darauf, dass die GPU ihre Arbeit beendet, bevor sie einen neuen Frame sendet. Das passiert oft, wenn ein dequeueBuffer-, eglSwapBuffer- (für OpenGL) oder vkQueuePresent-Ereignis (für Vulkan) einen großen Teil der CPU-Zeit in Anspruch nimmt. Die Wartezeit ist in der CPU-Gesamtzeit, aber nicht in der aktiven CPU-Zeit enthalten.

Ein Screenshot, der eine große Menge an Leerlauf während der Ereignisse „dequeueBuffer“ und „eglSwapBuffer“ zeigt.
Abbildung 3: Eine große Menge an CPU-Leerlauf während dequeueBuffer- und eglSwapBuffer-Ereignissen.

Aktive CPU-Zeit

Die aktive CPU-Zeit gibt an, wann die CPU den App-Code ausführt, ohne sich im Leerlauf zu befinden.

Um die aktive CPU-Zeit zu messen, sehen Sie sich die Running-Abschnitte direkt über den CPU-Ereignissen an. Zählen Sie alle Abschnitte des Traces zwischen den beiden Ereignissen für die Frame-Übermittlung, die sich im Status Wird ausgeführt befinden. Achten Sie darauf, dass Sie funktionierende Threads einfügen.

Ein Screenshot von zwei Zeiträumen der CPU-Zeit, die zur Messung der aktiven CPU-Zeit verwendet werden können.
Abbildung 5. Zwei Zeiträume für die CPU-Zeit, die zum Messen der aktiven CPU-Zeit verwendet werden können.


Ein Screenshot einer Multithread-App, die andere Arbeitsthreads hat, während der Hauptthread inaktiv ist.
Abbildung 6: Eine Multithread-App, die andere Arbeitsthreads hat, während der Hauptthread inaktiv ist.

Eine weitere Möglichkeit, die aktive CPU-Zeit zu messen, besteht darin, sich die App-Slices in den CPU-Tracks anzusehen. Diese Abschnitte geben an, wann die CPU ausgeführt wird. Sie entsprechen den Abschnitten Wird ausgeführt.

Ein Screenshot, der den Ausführungsstatus eines angepinnten Threads zeigt, der mit dem CPU-Track übereinstimmt.
Abbildung 7. Der Ausführungsstatus des angepinnten Threads stimmt mit dem CPU-Track überein.

Um App-Slices leichter zu identifizieren, können Sie Ihrer App ATrace-Marker hinzufügen. Diese werden dann im CPU-Track des System Profiler angezeigt.

Ein Screenshot von ATrace-Slices, die auf einem CPU-Track angezeigt werden.
Abbildung 8. ATrace-Abschnitte auf einem CPU-Track

GPU-Framezeiten schätzen

Um die GPU-Frame-Zeiten zu schätzen, können Sie entweder GPU-Slices oder GPU-Zähler im System Profiler verwenden. Die Schätzung ist genauer, wenn GPU-Slices verwendet werden.

GPU-Slices

Wenn System Profiler Informationen zu GPU-Slices verfügbar hat, können Sie sehr genaue Informationen zur GPU-Frame-Zeit erhalten, indem Sie die Gesamtzeit messen, die Ihre App für Aufgaben benötigt, die mit einem einzelnen Frame verknüpft sind.

Mali-Geräte

Auf Mali-Geräten haben GPU-Slices die Tracks fragment, non-fragment und gelegentlich supplementary non-fragment. Bei weniger komplexen Frames erfolgt die Arbeit mit Fragmenten und ohne Fragmente sequenziell. Die Arbeit eines Frames lässt sich also von der eines anderen unterscheiden, indem man nach Lücken zwischen aktiver GPU-Arbeit sucht.

Wenn Sie mit der Arbeit vertraut sind, die an die GPU gesendet wird, können Sie alternativ anhand des Musters der gesendeten Renderdurchläufe Informationen dazu erhalten, wann ein Frame beginnt und endet.

Ein Screenshot von mehreren Frames, die nacheinander ausgeführt werden.
Abbildung 9. Mehrere Frames werden nacheinander ausgeführt.
Ein Screenshot, auf dem die AGI auf die Arbeit eines einzelnen Frames gezoomt ist.
Abbildung 10. Herangezoomt auf die Arbeit eines einzelnen Frames.

Bei Apps mit einem stärker parallelisierten GPU-Workflow können Sie die GPU-Frame-Zeiten ermitteln, indem Sie für jeden Slice im Bereich Selection (Auswahl) nach allen Frames mit derselben submissionID (ID für die Einreichung) suchen.

Bei Vulkan-basierten Apps können mehrere Einreichungen verwendet werden, um einen Frame zu erstellen. Behalten Sie die Einreichungs-IDs im Blick, indem Sie den Vulkan Events-Track verwenden, der für jede Einreichung einen Slice enthält. Wenn Sie einen Einreichungsabschnitt auswählen, werden alle GPU-Aktivitätsabschnitte hervorgehoben, die der Einreichung entsprechen.

Ein Screenshot einer parallelisierten GPU-Arbeitslast, bei der sich die Arbeit an einem Frame mit der Arbeit an einem anderen Frame überschneiden kann.
Abbildung 11. Eine parallelisierte GPU-Arbeitslast, bei der sich die Arbeit an einem Frame mit der an einem anderen überschneiden kann.


Ein Screenshot, auf dem mehrere Vulkan-Ereignisse für einen Frame ausgewählt sind.
Abbildung 12. Für einen Frame wurden mehrere Vulkan-Ereignisse ausgewählt.

Adreno-Geräte

Auf Adreno-Geräten werden GPU-Slices im Track GPU Queue 0 angezeigt und immer sequenziell dargestellt. Sie können sich also alle Slices ansehen, die die Rendering-Passes für einen Frame darstellen, und damit die GPU-Framezeiten messen.

Ein Screenshot von mehreren Frames, die nacheinander ausgeführt werden.
Abbildung 13. Mehrere Frames werden nacheinander ausgeführt.
Ein Screenshot, auf dem AGI in einem Frame mit mehreren Rendering-Durchgängen vergrößert dargestellt wird.
Abbildung 14. Herangezoomter Frame mit mehreren Rendering-Durchgängen.

Ähnlich wie im zuvor beschriebenen Mali-Szenario enthält der Vulkan Events-Track Informationen zu den Aufgaben, die zum Rendern des Frames übergeben werden, wenn die App Vulkan verwendet. Klicken Sie auf die mit dem Frame verknüpften Vulkan Events-Slices, um die Render-Passes hervorzuheben.

Ein Screenshot einer Vulkan-basierten App, in der Vulkan-Ereignisse des Frames ausgewählt sind.
Abbildung 15. Eine Vulkan-basierte App, in der Vulkan-Ereignisse für einen Frame ausgewählt sind.

In einigen Szenarien sind die GPU-Framegrenzen schwieriger zu unterscheiden, da die App stark GPU-gebunden ist. Wenn Sie in diesen Szenarien mit der Arbeit vertraut sind, die an die GPU gesendet wird, können Sie das Muster erkennen, mit dem Renderdurchläufe ausgeführt werden, und anhand dieser Informationen die Framegrenzen bestimmen.

Ein Screenshot einer stark GPU-gebundenen App mit einem Renderpass-Muster, das hilft, Framegrenzen zu erkennen.
Abbildung 16. Eine stark GPU-gebundene App mit einem Renderpass-Muster, das hilft, Framegrenzen zu erkennen.

GPU-Zähler

Wenn in einem Trace keine Informationen zu GPU-Slices verfügbar sind, können Sie die GPU-Frame-Zeit anhand der Tracks für GPU-Zähler schätzen.

Mali-Geräte

Auf Mali-Geräten können Sie den GPU-Auslastungs-Track verwenden, um die GPU-Frame-Zeit für eine App zu schätzen, die nicht GPU-intensiv ist. Bei Apps, die weniger GPU-intensiv sind, gibt es regelmäßige Phasen mit hoher und niedriger GPU-Aktivität anstelle einer durchgehend hohen Aktivität. Um die GPU-Framezeiten anhand des Tracks GPU-Auslastung zu schätzen, messen Sie die Dauer der Zeiträume mit hoher Aktivität im Track.

Screenshot der GPU-Nutzung und der GPU-Warteschlangentracks auf einem Mali-Gerät
Abbildung 17. Die GPU-Auslastungs- und GPU-Warteschlangentracks auf einem Mali-Gerät.

Wenn die App GPU-intensiver ist, kann die GPU-Auslastung durchgehend sehr hoch sein. In diesem Fall können Sie die Tracks fragment queue utilization (Auslastung der Fragmentwarteschlange) und non-fragment queue utilization (Auslastung der Nicht-Fragmentwarteschlange) verwenden, um die GPU-Aktivität zu überwachen und die GPU-Framezeiten zu schätzen. Wenn Sie nach Mustern in Fragment- und Nicht-Fragment-Tracks suchen, können Sie eine grobe Schätzung der Framegrenzen erhalten und damit die GPU-Framezeit messen.

Ein Screenshot von Fragment- und Nicht-Fragment-Tracks.
Abbildung 18. Fragment- und Nicht-Fragment-Tracks.

Adreno-Geräte

Wenn die App auf Adreno-Geräten nicht GPU-intensiv ist, können Sie die GPU-Frame-Zeiten auf dieselbe Weise schätzen wie bei Mali-Geräten im vorherigen Abschnitt.

Screenshot des Prozentsatzes der GPU-Auslastung und der GPU-Warteschlangentracks auf einem Adreno-Gerät.
Abbildung 19. Der Prozentsatz der GPU-Auslastung und die GPU-Warteschlangentracks auf einem Adreno-Gerät.

Wenn die App GPU-intensiver ist und die GPU-Auslastung durchgehend hoch ist, können Sie die Tracks Vertex Instructions / Second (Vertex-Anweisungen / Sekunde) und Fragment Instructions / Second (Fragment-Anweisungen / Sekunde) verwenden, um die GPU-Framezeiten zu schätzen. Wenn Sie nach Mustern in den Aktivitätsstufen dieser Tracks suchen, können Sie grob schätzen, wo die Grenzen eines Frames liegen, und damit die GPU-Frame-Zeit messen.

Ein Screenshot der Vertex-Anleitung / des zweiten Tracks.
Abbildung 20. Vertex Instructions / Second

Diese anderen Tracks können ähnliche Informationen enthalten:

  • Gerenderte Eckpunkte pro Sekunde
  • Schattierte Fragmente / Sekunde
  • % Time Shading Vertices (Prozentsatz der Zeit-Shading-Knoten)
  • % Time Shading Fragments (Prozentsatz der Zeit-Shading-Fragmente)