Estimer les temps de traitement des frames du CPU et du GPU

Estimer les temps de traitement des frames (frame times) du processeur et du GPU est essentiel pour comprendre les performances de votre application et identifier les goulots d'étranglement. Lorsque vous profilez une application avec AGI, System Profiler fournit des données de trace que vous pouvez utiliser pour estimer les temps de frame.

Temps CPU

Dans AGI, vous pouvez afficher les temps de frame CPU total et actif dans le canal CPU d'un profil système.

Temps CPU total

Pour mesurer le temps total passé par le processeur, sélectionnez la période qui inclut le temps écoulé entre les événements d'envoi de frame successifs. Les événements d'envoi de frame sont eglSwapBuffers (pour OpenGL) et vkQueuePresentKHR (pour Vulkan).

Capture d'écran des événements eglSwapBuffer.
Figure 1. Intervalle entre deux événements eglSwapBuffer.


Capture d'écran d'un événement vkQueuePresentKHR.
Figure 2. Intervalle entre deux événements vkQueuePresentKHR.

Cette mesure est une estimation du temps CPU total,mais ne représente pas nécessairement le temps CPU actif. Par exemple, dans les applications liées au GPU, le processeur peut attendre que le GPU ait terminé son travail avant d'envoyer un nouveau frame. Cela se produit souvent lorsqu'un événement dequeueBuffer, eglSwapBuffer (pour OpenGL) ou vkQueuePresent (pour Vulkan) occupe une grande partie du temps de processeur. Le temps d'attente est inclus dans le temps CPU total, mais pas dans le temps CPU actif.

Capture d'écran montrant une grande quantité d'inactivité pendant les événements dequeueBuffer et eglSwapBuffer.
Figure 3. Une grande quantité de CPU inactif pendant les événements dequeueBuffer et eglSwapBuffer.

Temps CPU actif

Le temps CPU actif détermine quand le processeur exécute le code de l'application sans être à l'état d'inactivité.

Pour mesurer le temps de CPU actif, affichez les segments Running (En cours d'exécution) juste au-dessus des événements de CPU. Comptez toutes les parties de la trace entre les deux événements d'envoi de frame qui sont dans l'état Running (En cours d'exécution). Assurez-vous d'inclure des threads de travail.

Capture d'écran de deux périodes de temps CPU pouvant être utilisées pour mesurer le temps CPU actif.
Figure 5 : Deux périodes de temps de processeur pouvant être utilisées pour mesurer le temps de processeur actif.


Capture d'écran d'une application multithread qui comporte d'autres threads actifs alors que le thread principal est inactif.
Figure 6 : Application multithread qui comporte d'autres threads actifs lorsque le thread principal est inactif.

Une autre façon de mesurer le temps CPU actif consiste à afficher les segments d'application dans les canaux CPU. Ces tranches indiquent quand le processeur est en cours d'exécution et correspondent aux tranches Running (En cours d'exécution).

Capture d'écran montrant l'état d'exécution d'un thread épinglé correspondant au canal de processeur.
Figure 7 : L'état d'exécution du thread épinglé correspond au canal de processeur.

Pour identifier plus facilement les tranches d'application, vous pouvez ajouter des repères ATrace à votre application. Les repères s'affichent alors dans le canal CPU du Profileur système.

Capture d'écran des tranches ATrace affichées sur un canal de processeur.
Figure 8 : Tranches ATrace affichées sur un canal de processeur.

Estimer les temps de frame du GPU

Pour estimer les délais de frame du GPU, vous pouvez utiliser des tranches de GPU ou des compteurs de GPU dans le Profileur système. L'estimation est plus précise lorsque vous utilisez des tranches de GPU.

Tranches de GPU

Si des informations sur les tranches de GPU sont disponibles dans l'outil de profilage système, vous pouvez obtenir des informations très précises sur le temps de rendu du GPU en mesurant la durée totale pendant laquelle votre application travaille sur des tâches associées à un seul frame.

Appareils Mali

Sur les appareils Mali, les tranches de GPU comportent des pistes fragment, non-fragment et parfois non-fragment supplémentaires. Pour les frames moins complexes, le travail de fragment et de non-fragment est séquentiel. Vous pouvez donc distinguer le travail d'un frame de celui d'un autre en recherchant des lacunes entre le travail GPU actif.

Si vous connaissez le travail envoyé au GPU, vous pouvez également identifier le schéma des passes de rendu envoyées pour obtenir des informations sur le début et la fin d'un frame.

Capture d'écran de plusieurs frames exécutés séquentiellement.
Figure 9. Plusieurs images exécutées de manière séquentielle.
Capture d'écran montrant un zoom avant sur le travail d'un frame individuel avec l'IA générative
Figure 10. Zoom avant sur le travail d'un cadre individuel.

Pour les applications dont le workflow GPU est plus fortement parallélisé, vous pouvez obtenir les temps de frame du GPU en recherchant tous les frames ayant le même ID de soumission dans le volet Sélection pour chaque tranche.

Pour les applications basées sur Vulkan, plusieurs envois peuvent être utilisés pour composer un frame. Gardez une trace des ID d'envoi à l'aide du canal Événements Vulkan, qui contient une tranche pour chaque envoi. Si vous sélectionnez un segment d'envoi, tous les segments d'activité du GPU correspondant à l'envoi seront mis en surbrillance.

Capture d'écran d'une charge de travail GPU parallélisée, où le travail sur un frame peut se chevaucher avec un autre.
Figure 11 Charge de travail GPU parallélisée, où le travail sur un frame peut se chevaucher avec un autre.


Capture d'écran de plusieurs événements Vulkan sélectionnés pour un frame.
Figure 12 Plusieurs événements Vulkan sélectionnés pour un frame.

Appareils Adreno

Sur les appareils Adreno, les tranches de GPU apparaissent dans la piste GPU Queue 0 et sont toujours représentées de manière séquentielle. Vous pouvez donc examiner toutes les tranches qui représentent les passes de rendu d'un frame et les utiliser pour mesurer les temps de frame du GPU.

Capture d'écran de plusieurs frames exécutés séquentiellement.
Figure 13. Plusieurs images exécutées de manière séquentielle.
Capture d'écran montrant un zoom sur un frame avec plusieurs passes de rendu.
Figure 14. Zoom avant sur un frame avec plusieurs passes de rendu.

Comme pour le scénario Mali décrit précédemment, si l'application utilise Vulkan, le canal Événements Vulkan fournit des informations sur le travail envoyé pour exécuter le frame. Pour mettre en surbrillance les passes de rendu, cliquez sur les tranches Événements Vulkan associées au frame.

Capture d'écran d'une application basée sur Vulkan dans laquelle les événements Vulkan de frame sont sélectionnés.
Figure 15 Application basée sur Vulkan dans laquelle les événements Vulkan d'un frame sont sélectionnés.

Dans certains cas, il est plus difficile de distinguer les limites des frames du GPU, car l'application est fortement liée au GPU. Dans ces scénarios, si vous connaissez le travail envoyé au GPU, vous pouvez identifier le modèle avec lequel les passes de rendu sont exécutées et déterminer les limites de frame à partir de ces informations.

Capture d'écran d'une application fortement liée au GPU avec un modèle de passage de rendu qui permet d'identifier les limites de frame.
Figure 16 Application fortement liée au GPU avec un modèle de passage de rendu qui aide à identifier les limites de frame.

Compteurs du GPU

Si les informations sur les tranches de GPU ne sont pas disponibles dans une trace, vous pouvez estimer le temps de frame du GPU à l'aide des pistes du compteur GPU.

Appareils Mali

Sur les appareils Mali, vous pouvez utiliser le canal Utilisation du GPU pour estimer le temps de frame du GPU pour une application qui n'est pas gourmande en GPU. Lorsque les applications sont moins gourmandes en GPU, elles présentent des périodes régulières d'activité GPU élevée et faible, au lieu d'une activité constamment élevée. Pour estimer les temps de frame du GPU à l'aide du canal Utilisation du GPU, mesurez la durée des périodes d'activité élevée dans le canal.

Capture d'écran des pistes d'utilisation et de file d'attente du GPU sur un appareil Mali.
Figure 17 Utilisation du GPU et pistes de file d'attente du GPU sur un appareil Mali.

Si l'application est plus gourmande en GPU, l'utilisation du GPU peut être très élevée de manière constante. Dans ce cas, vous pouvez utiliser les pistes Utilisation de la file d'attente de fragments et Utilisation de la file d'attente non fragmentée pour surveiller l'activité du GPU et estimer les délais de frame du GPU. En recherchant des tendances dans les pistes fragment et non-fragment, vous pouvez obtenir une estimation approximative de l'emplacement des limites d'un frame et l'utiliser pour mesurer le temps de frame du GPU.

Capture d'écran des pistes de fragment et non de fragment.
Figure 18 Fragment et non-fragment : pistes.

Appareils Adreno

Sur les appareils Adreno, si l'application n'est pas gourmande en GPU, vous pouvez estimer les délais de frame du GPU de la même manière que pour les appareils Mali dans la section précédente.

Capture d'écran du pourcentage d'utilisation du GPU et des pistes de file d'attente du GPU sur un appareil Adreno.
Figure 19 Pourcentage d'utilisation du GPU et pistes de file d'attente du GPU sur un appareil Adreno.

Si l'application est plus gourmande en GPU et que son pourcentage d'utilisation du GPU est constamment élevé, vous pouvez utiliser les canaux Instructions de vertex/seconde et Instructions de fragment / seconde pour estimer les délais de frame du GPU. En recherchant des tendances dans les niveaux d'activité de ces pistes, vous pouvez obtenir une estimation approximative des limites d'un frame et l'utiliser pour mesurer le temps de frame du GPU.

Capture d'écran des instructions Vertex / Deuxième piste.
Figure 20. Le canal Vertex Instructions / Seconde.

Ces autres pistes peuvent fournir des informations similaires:

  • Vertices ombrés / seconde
  • Fragments ombrés / seconde
  • % Temps d'ombrage des sommets
  • % Temps de fragments d'ombrage