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

Il est essentiel d'estimer les temps de traitement des frames (temps de frame) du CPU et du GPU pour comprendre les performances de votre application et identifier les goulots d'étranglement. Lorsque vous profilez une application avec AGI, le Profileur système fournit des données de trace que vous pouvez utiliser pour estimer les durées des frames.

Temps CPU

Dans AGI, vous pouvez afficher les temps de frame CPU totaux et actifs dans la piste CPU d'un profil système.

Temps CPU total

Pour mesurer le temps CPU total passé, sélectionnez la plage de temps qui inclut le temps entre les événements d'envoi de frames 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. Temps écoulé entre deux événements eglSwapBuffer.


Capture d'écran d'un événement vkQueuePresentKHR.
Figure 2. Temps écoulé 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 termine 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 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é lors des événements dequeueBuffer et eglSwapBuffer.
Figure 3. Une grande quantité de processeur est inactive lors des événements dequeueBuffer et eglSwapBuffer.

Temps CPU actif

Le temps CPU actif détermine le moment où le processeur exécute le code de l'application sans être en état d'inactivité.

Pour mesurer le temps de processeur actif, consultez les tranches En cours d'exécution juste au-dessus des événements de processeur. Comptez toutes les parties de la trace entre les deux événements d'envoi de frame qui sont à l'état Running (En cours d'exécution). Assurez-vous d'inclure les 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 CPU pouvant être utilisées pour mesurer le temps CPU 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 de travail lorsque le thread principal est inactif.

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

Capture d'écran montrant l'état d'exécution d'un thread épinglé correspondant à la piste du processeur.
Figure 7. L'état d'exécution du thread épinglé correspond à la piste du processeur.

Pour identifier les tranches d'application, vous pouvez ajouter des repères ATrace à votre application. Ces repères s'afficheront dans la piste CPU du profileur système.

Capture d'écran des tranches ATrace affichées sur une piste de processeur.
Figure 8 : Tranches ATrace affichées sur une piste de CPU.

Estimer les temps de frame du GPU

Pour estimer les temps de frame du GPU, vous pouvez utiliser des tranches 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 le Profiler système dispose d'informations sur les tranches de GPU, vous pouvez obtenir des informations très précises sur le temps de frame du GPU en mesurant le temps total que votre application consacre aux tâches associées à un seul frame.

Appareils Mali

Sur les appareils Mali, les tranches GPU comportent des pistes fragment, non-fragment et parfois supplementary non-fragment. Pour les frames moins complexes, le travail de fragment et de non-fragment est séquentiel. Il est donc possible de distinguer le travail d'un frame de celui d'un autre en recherchant les écarts entre les travaux GPU actifs.

Si vous connaissez le travail soumis au GPU, vous pouvez identifier le modèle des passes de rendu soumises 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 frames sont exécutés de manière séquentielle.
Capture d'écran montrant l'AGI avec un zoom sur le travail d'une image individuelle.
Figure 10. Zoom avant sur le travail d'un seul frame.

Pour les applications dont le workflow GPU est plus fortement parallélisé, vous pouvez obtenir les temps de rendu GPU en recherchant tous les frames qui ont le même submissionID 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. Suivez les ID de soumission à l'aide de la piste Événements Vulkan, qui contient un segment pour chaque soumission. 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 chevaucher celui d'un autre.
Figure 11 : Charge de travail GPU parallélisée, où le travail sur un frame peut chevaucher celui d'un autre.


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

Appareils Adreno

Sur les appareils Adreno, les tranches de GPU apparaissent dans la piste File d'attente GPU 0 et sont toujours représentées de manière séquentielle. Vous pouvez ainsi 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 frames sont exécutés de manière séquentielle.
Capture d'écran d'AGI avec zoom sur un frame comportant plusieurs passes de rendu.
Figure 14. Zoom sur un frame avec plusieurs passes de rendu.

Comme pour le scénario Mali décrit précédemment, si l'application utilise Vulkan, la piste Événements Vulkan fournit des informations sur le travail soumis pour exécuter le frame. Pour mettre en évidence 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 du 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 scénarios, il est plus difficile de distinguer les limites des frames GPU, car l'application est fortement liée au GPU. Dans ces scénarios, si vous connaissez le travail soumis au GPU, vous pouvez identifier le modèle d'exécution des passes de rendu et déterminer les limites de trame à partir de ces informations.

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

Compteurs de 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 de GPU.

Appareils Mali

Sur les appareils Mali, vous pouvez utiliser la piste 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 de la piste Utilisation du GPU, mesurez la durée des périodes de forte activité dans la piste.

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

Si l'application utilise davantage le GPU, son utilisation peut être constamment très élevée. Dans ce cas, vous pouvez utiliser les pistes Utilisation de la file d'attente des fragments et Utilisation de la file d'attente non fragmentée pour surveiller l'activité du GPU et estimer les temps de frame du GPU. En recherchant des modèles dans les pistes fragment et non-fragment, 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 pistes fragmentées et non fragmentées.
Figure 18. Pistes fragment et non-fragment.

Appareils Adreno

Sur les appareils Adreno, si l'application n'est pas gourmande en GPU, vous pouvez estimer les temps 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. Le pourcentage d'utilisation du GPU et la file d'attente du GPU sont suivis sur un appareil Adreno.

Si l'application est plus gourmande en GPU et que le pourcentage d'utilisation du GPU est constamment élevé, vous pouvez utiliser les pistes Instructions Vertex/seconde et Instructions de fragment / seconde pour estimer les temps 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 de la piste "Instructions Vertex / Second".
Figure 20. Piste Vertex Instructions / Second.

Ces autres pistes peuvent fournir des informations similaires :

  • Sommets ombrés / seconde
  • Fragments ombrés / seconde
  • % de sommets d'ombrage temporel
  • % de fragments d'ombrage temporel