Gestion des performances

La gestion de la puissance et des performances des appareils Android peut contribuer à garantir que les applications fonctionnent de manière cohérente et fluide sur une large gamme de matériels. Dans Android 7.0 et versions ultérieures, les OEM peuvent implémenter la prise en charge d'indicateurs de performances durables qui permettent aux applications de maintenir des performances de périphérique cohérentes et de spécifier un noyau exclusif pour améliorer les performances des applications de premier plan gourmandes en CPU.

Performance soutenue

Pour les applications de longue durée (jeux, caméra, RenderScript , traitement audio), les performances peuvent varier considérablement à mesure que les limites de température de l'appareil sont atteintes et que les moteurs des systèmes sur puce (SoC) sont limités. Les développeurs d'applications créant des applications hautes performances et de longue durée sont limités car les capacités de la plate-forme sous-jacente constituent une cible mouvante lorsque l'appareil commence à chauffer.

Pour remédier à ces limitations, Android 7.0 a introduit la prise en charge de performances soutenues, permettant aux OEM de fournir des indications sur les capacités de performances des appareils pour les applications de longue durée. Les développeurs d'applications peuvent utiliser ces astuces pour régler les applications afin d'obtenir un niveau de performances de l'appareil prévisible et cohérent sur de longues périodes.

Architecture

Une application Android peut demander à la plate-forme d'entrer dans un mode de performances soutenues dans lequel l'appareil Android peut conserver un niveau de performances constant pendant des périodes prolongées.

Figure 1. Architecture du mode de performances soutenues

Mise en œuvre

Pour prendre en charge des performances soutenues sous Android 7.0 et versions ultérieures, les OEM doivent :

  • Apportez des modifications spécifiques à l'appareil au HAL d'alimentation pour verrouiller les fréquences maximales du CPU/GPU ou effectuer d'autres optimisations pour empêcher la limitation thermique.
  • Implémentez le nouvel indice POWER_HINT_SUSTAINED_PERFORMANCE dans Power HAL.
  • Déclarez la prise en charge en renvoyant TRUE via l'API isSustainedPerformanceModeSupported() .
  • Implémentez Window.setSustainedPerformanceMode .

Dans l'implémentation de référence Nexus, l'indicateur de puissance plafonne les fréquences maximales du CPU et du GPU aux niveaux durables les plus élevés. Gardez à l’esprit que l’abaissement de la barre MAX de la fréquence CPU/GPU réduira la fréquence d’images, mais cette fréquence inférieure est préférée dans ce mode en raison de sa durabilité. Par exemple, un appareil utilisant des horloges maximales normales peut être capable d'effectuer un rendu à 60 FPS pendant quelques minutes, mais une fois l'appareil réchauffé, il peut être limité à 30 FPS au bout de 30 minutes. Lors de l'utilisation du mode soutenu, l'appareil peut, par exemple, effectuer un rendu cohérent à 45 FPS pendant 30 minutes entières. L'objectif est d'avoir une fréquence d'images lors de l'utilisation du mode qui soit aussi élevée (ou supérieure) que la fréquence d'images lorsque le mode n'est pas utilisé, et cohérente dans le temps afin que les développeurs n'aient pas à poursuivre une cible en mouvement.

Nous recommandons fortement de mettre en œuvre le mode soutenu afin que l'appareil atteigne les performances soutenues les plus élevées possibles, et pas seulement les valeurs minimales requises pour réussir le test (par exemple, choisissez les limites de fréquence MAX les plus élevées possibles qui n'entraînent pas de limitation thermique de l'appareil au fil du temps).

Remarque : Le plafonnement des fréquences d'horloge MAX n'est pas nécessaire pour implémenter le mode soutenu.

Validation

Les OEM peuvent utiliser un test CTS (Android 7.0 et versions ultérieures) pour vérifier leur implémentation de l'API de performances soutenues. Le test exécute une charge de travail pendant environ 30 minutes et évalue les performances avec et sans le mode soutenu activé :

  • Lorsque le mode soutenu est activé, la fréquence d'images doit rester relativement constante (le test mesure le pourcentage de changement de fréquence d'images au fil du temps et nécessite un changement <5 %).
  • Avec le mode soutenu activé, la fréquence d'images ne doit pas être inférieure à la fréquence d'images au bout de 30 minutes avec le mode désactivé.

De plus, vous pouvez tester manuellement votre implémentation avec plusieurs charges de travail gourmandes en CPU et GPU pour vous assurer que l'appareil ne subit pas de limitation thermique après 30 minutes d'utilisation. Lors des tests internes, nous avons utilisé des exemples de charges de travail, notamment des jeux et des applications d'analyse comparative (par exemple, gfxbench ).

Noyaux exclusifs

Pour les charges de travail gourmandes en CPU et sensibles au temps, le fait d'être préempté par un autre thread peut faire la différence entre respecter ou non les délais de trame. Pour les applications qui ont des exigences strictes en matière de latence et de fréquence d'images (telles que les applications audio ou de réalité virtuelle), disposer d'un cœur de processeur exclusif peut garantir un niveau de performances acceptable.

Les appareils exécutant Android 7.0 ou version ultérieure peuvent désormais réserver explicitement un cœur pour l'application de premier plan, améliorant ainsi les performances de toutes les applications de premier plan et donnant aux applications avec des charges de travail de haute intensité plus de contrôle sur la façon dont leur travail est réparti entre les cœurs de processeur.

Pour prendre en charge un noyau exclusif sur un appareil :

  • Activez cpusets et configurez un cpuset qui contient uniquement l'application de premier plan.
  • Assurez-vous qu'un cœur (c'est le cœur exclusif) est réservé aux threads de ce cpuset .
  • Implémentez l'API getExclusiveCores pour renvoyer le numéro de cœur du cœur exclusif.

Pour déterminer quels processus sont planifiés sur quels cœurs, utilisez systrace lors de l'exécution d'une charge de travail et vérifiez qu'aucun thread d'espace utilisateur provenant d'applications autres que l'application de premier plan n'est planifié sur le cœur exclusif.

Pour afficher une implémentation de référence pour le Nexus 6P, reportez-vous à android//device/huawei/angler/power/power.c .