Stima i tempi di elaborazione dei frame di CPU e GPU

La stima dei tempi di elaborazione dei frame di CPU e GPU (tempi frame) è essenziale per comprendere le prestazioni della tua app e individuare i colli di bottiglia. Quando profila un'app con AGI, System Profiler fornisce dati di traccia che puoi usare per stimare le durate frame.

Tempi di CPU

In AGI, puoi visualizzare le durate frame della CPU totali e attive nel canale della CPU di un profilo di sistema.

Tempo di CPU totale

Per misurare il tempo totale di CPU speso, seleziona l'intervallo di tempo che include il tempo trascorso tra gli eventi successivi di invio dei frame. Gli eventi di invio dei frame sono eglSwapBuffers (per OpenGL) e vkQueuePresentKHR (per Vulkan).

Uno screenshot di diversi eventi eglSwapBuffer.
Figura 1. Diversi eventi eglSwapBuffer.


Uno screenshot di un evento vkQueuePresentKHR.
Figura 2. Un evento vkQueuePresentKHR.

Questa misurazione è una stima del tempo di CPU totale,ma non rappresenta necessariamente il tempo di CPU attivo. Ad esempio, nelle app associate alla GPU, la CPU potrebbe attendere il completamento del lavoro della GPU prima di inviare un nuovo frame. Questo accade spesso quando un evento dequeueBuffer, eglSwapBuffer (per OpenGL) o vkQueuePresent (per Vulkan) richiede una grande parte del tempo di CPU. Il tempo di attesa è incluso nel tempo di CPU totale, ma non nel tempo di CPU attivo.

Uno screenshot che mostra un numero elevato di inattività durante gli eventi dequeueBuffer ed eglSwapBuffer.
Figura 3. Un numero elevato di inattività durante gli eventi dequeueBuffer e eglSwapBuffer.

Tempo di CPU attivo

Il tempo di CPU attivo determina quando la CPU esegue il codice dell'app senza essere in stato di inattività.

Per misurare il tempo di CPU attivo, visualizza le sezioni In esecuzione subito sopra gli eventi CPU. Conta tutte le parti della traccia tra i due eventi di invio frame che sono in stato In esecuzione. Assicurati di includere thread di lavoro.

Uno screenshot di due periodi di tempo di CPU che possono essere utilizzati per misurare il tempo di CPU attivo.
Figura 5. Due periodi di tempo di CPU che possono essere utilizzati per misurare il tempo di CPU attivo.


Uno screenshot di un'app con più thread che ha un thread in esecuzione mentre il thread principale è inattivo.
Figura 6. Un'app multithread che ha un thread funzionante mentre il thread principale è inattivo.

Un altro modo per misurare il tempo di CPU attivo è visualizzare le sezioni dell'app nei percorsi della CPU. Queste sezioni indicano quando la CPU è in esecuzione e corrispondono alle sezioni Running.

Uno screenshot che mostra lo stato di esecuzione di un thread bloccato che corrisponde al canale CPU.
Figura x. Lo stato di esecuzione del thread bloccato corrisponde al canale della CPU.

Per identificare le sezioni dell'app, puoi aggiungere indicatori ATrace alla tua app. Gli indicatori verranno visualizzati nel monitoraggio CPU del System Profiler.

Screenshot di un indicatore ATrace in un canale CPU.
Figura 8. Un indicatore ATrace in un canale CPU.

Stima i tempi frame della GPU

Per stimare la durata dei frame della GPU, puoi utilizzare sezioni GPU o contatori GPU in System Profiler. La stima è più precisa quando si utilizzano sezioni GPU.

Sezioni GPU

Se System Profiler dispone di informazioni sulle sezioni GPU, puoi ottenere informazioni molto accurate sulla durata frame della GPU misurando la quantità totale di tempo che la tua app dedica alle attività associate a un singolo frame.

Dispositivi in Mali

Sui dispositivi Mali, le sezioni GPU hanno tracce frammenti, non frammenti e, a volte, tracce non frammenti supplementari. Per i frame meno complessi, il lavoro con frammenti e non è sequenziale, pertanto è possibile distinguere il lavoro di un frame dall'altro cercando gli intervalli tra il lavoro di una GPU attiva.

In alternativa, se conosci il lavoro inviato alla GPU, identificare il pattern dei pass di rendering inviati fornisce informazioni su quando inizia e termina un frame.

Screenshot di più frame eseguiti in sequenza.
Figura 9. Più frame eseguiti in sequenza.
Uno screenshot in cui AGI viene aumentato lo zoom sul lavoro di un singolo frame.
Figura 10. Aumentando lo zoom sul lavoro di una singola cornice.

Per le app con un flusso di lavoro GPU con più paralleli, puoi ottenere le durate dei frame della GPU cercando tutti i frame che hanno lo stesso submissionID nel riquadro Selezione per ogni sezione.

Per le app basate su Vulkan, è possibile utilizzare più contenuti inviati per comporre un frame. Tieni traccia degli ID inviati utilizzando la traccia Eventi Vulkan, che contiene una sezione per ciascun invio. Se selezioni una sezione di invio, verranno evidenziate tutte le sezioni di attività GPU corrispondenti all'invio.

Uno screenshot di un carico di lavoro della GPU parallelizzato, in cui il lavoro su un frame può sovrapporsi a quello di un altro.
Figura 11. Un carico di lavoro della GPU parallelizzato, in cui il lavoro su un frame può sovrapporsi a un altro.


Screenshot di diversi eventi Vulkan per un frame selezionato.
Figura 12. Diversi eventi Vulkan per un fotogramma selezionato.

Dispositivi Adreno

Sui dispositivi Adreno, le sezioni GPU vengono visualizzate nella traccia Coda GPU 0 e sono sempre rappresentate in sequenza, quindi puoi esaminare tutte le sezioni che rappresentano le tessere di rendering per un frame e utilizzarle per misurare la durata dei frame della GPU.

Screenshot di più frame eseguiti in sequenza.
Figura 13. Più frame eseguiti in sequenza.
Uno screenshot in cui AGI viene aumentato lo zoom su un frame con più passaggi di rendering.
Figura 14. Aumentato lo zoom su un frame con più passaggi di rendering.

Analogamente allo scenario in Mali descritto in precedenza: se l'app utilizza Vulkan, il canale Eventi Vulkan fornisce informazioni sul lavoro inviato per eseguire il frame. Per evidenziare le tessere di rendering, fai clic sulle sezioni Eventi Vulkan associate al frame.

Uno screenshot di un'app basata su Vulkan con eventi Vulkan per un frame selezionato.
Figura 15. Un'app basata su Vulkan con eventi Vulkan per un frame selezionato.

In alcuni scenari è più difficile distinguere i limiti dei frame della GPU perché l'app è fortemente legata alla GPU. In questi scenari, se conosci il lavoro inviato alla GPU, puoi identificare il pattern con cui vengono eseguite le pass di rendering e determinare i limiti dei frame a partire da queste informazioni.

Uno screenshot di un'app fortemente legata alla GPU con un pattern di pass per il rendering che aiuta a identificare i limiti dei frame.
Figura 16. Un'app fortemente legata alla GPU con un pattern di passaggio del rendering che aiuta a identificare i limiti dei frame.

Contatori GPU

Se le informazioni sulle sezioni GPU non sono disponibili in una traccia, puoi stimare la durata frame della GPU utilizzando le tracce del contatore GPU.

Dispositivi in Mali

Sui dispositivi Mali, puoi utilizzare il canale di utilizzo GPU per stimare la durata frame della GPU per un'app che non richiede un uso intensivo della GPU. Quando le app utilizzano meno GPU, le app hanno periodi regolari di attività della GPU elevata e bassa, invece di un'attività costantemente elevata. Per stimare la durata frame della GPU utilizzando il tracciamento Utilizzo GPU, misura la durata dei periodi di attività elevata nel canale.

Uno screenshot dell'utilizzo della GPU e delle tracce delle code GPU su un dispositivo in Mali.
Figura 17. Tracce dell'utilizzo della GPU e delle code della GPU su un dispositivo in Mali.

Se l'app utilizza maggiormente la GPU, puoi utilizzare le tracce frammento e non-frammento per stimare la durata frame della GPU. Cercando pattern nei livelli di attività delle tracce frammento e non-frammento, puoi ottenere una stima approssimativa di dove si trovano i limiti di un frame e utilizzarla per misurare la durata frame della GPU.

Uno screenshot di tracce con frammenti e non.
Figura 18. Tracce frammenti e non frammenti.

Dispositivi Adreno

Sui dispositivi Adreno, se l'app non utilizza un utilizzo intensivo di GPU, puoi stimare la durata dei frame della GPU come faresti con i dispositivi Malli nella sezione precedente.

Uno screenshot dell'utilizzo della GPU e delle tracce della coda GPU su un dispositivo Adreno.
Figura 19. Monitoraggio dell'utilizzo della GPU e della coda GPU su un dispositivo Adreno.

Se l'app utilizza un utilizzo più intensivo della GPU, puoi utilizzare le tracce Istruzioni/secondo Vertex e Istruzioni per frammento / secondo per stimare la durata dei frame della GPU. Cercando pattern nei livelli di attività di questi canali, puoi ottenere una stima approssimativa dei limiti di un frame e utilizzarla per misurare la durata frame della GPU.

Uno screenshot delle istruzioni / seconda traccia di Vertex.
Figura 20. La traccia Vertex Instructions / Second.

Le altre tracce potrebbero fornire informazioni simili:

  • Vertici ombreggiati / secondo
  • Frammenti ombreggiati / secondo
  • % vertici di ombreggiatura temporale
  • % frammenti di tempo