Leistungsmanagement

Durch die Verwaltung der Leistung und Leistung von Android-Geräten kann sichergestellt werden, dass Anwendungen auf einer breiten Palette von Hardware konsistent und reibungslos ausgeführt werden. In Android 7.0 und höher können OEMs Unterstützung für Hinweise zur dauerhaften Leistung implementieren, die es Apps ermöglichen, eine konsistente Geräteleistung aufrechtzuerhalten, und einen exklusiven Kern angeben, um die Leistung für CPU-intensive Anwendungen im Vordergrund zu verbessern.

Nachhaltige Leistung

Bei lang laufenden Anwendungen (Spiele, Kamera, RenderScript , Audioverarbeitung) kann die Leistung dramatisch schwanken, wenn die Temperaturgrenzen des Geräts erreicht werden und SoC-Engines (System on Chip) gedrosselt werden. App-Entwicklern, die hochleistungsfähige, langlebige Apps erstellen, sind begrenzt, da die Fähigkeiten der zugrunde liegenden Plattform ein bewegliches Ziel sind, wenn das Gerät zu heiß wird.

Um diese Einschränkungen zu beheben, wurde mit Android 7.0 die Unterstützung einer dauerhaften Leistung eingeführt, sodass OEMs Hinweise zu den Leistungsfähigkeiten der Geräte für lang laufende Anwendungen geben können. App-Entwickler können diese Hinweise verwenden, um Anwendungen für eine vorhersehbare, konsistente Geräteleistung über lange Zeiträume hinweg abzustimmen.

Die Architektur

Eine Android-Anwendung kann die Plattform auffordern, in einen Dauerleistungsmodus zu wechseln, in dem das Android-Gerät über längere Zeiträume ein konstantes Leistungsniveau aufrechterhalten kann.

Abbildung 1. Architektur des Sustained-Performance-Modus

Implementierung

Um eine dauerhafte Leistung in Android 7.0 und höher zu unterstützen, müssen OEMs:

  • Nehmen Sie gerätespezifische Änderungen am Power-HAL vor, um entweder die maximalen CPU-/GPU-Frequenzen zu sperren oder andere Optimierungen durchzuführen, um thermische Drosselung zu verhindern.
  • Implementieren Sie den neuen Hinweis POWER_HINT_SUSTAINED_PERFORMANCE in Power HAL.
  • Deklarieren Sie die Unterstützung, indem Sie TRUE über die API isSustainedPerformanceModeSupported() zurückgeben.
  • Implementieren Sie Window.setSustainedPerformanceMode .

In der Nexus-Referenzimplementierung begrenzt der Leistungshinweis die maximalen Frequenzen von CPU und GPU auf das höchste nachhaltige Niveau. Bedenken Sie, dass eine Senkung des MAX-Balkens bei der CPU-/GPU-Frequenz zu einer Verringerung der Bildrate führt. Diese niedrigere Rate wird in diesem Modus aufgrund ihrer Nachhaltigkeit jedoch bevorzugt. Beispielsweise kann ein Gerät, das normale maximale Taktraten verwendet, einige Minuten lang möglicherweise mit 60 FPS rendern, nach dem Aufheizen des Geräts kann es jedoch nach 30 Minuten auf 30 FPS gedrosselt werden. Im Dauermodus kann das Gerät beispielsweise über die gesamten 30 Minuten konstant mit 45 FPS rendern. Das Ziel ist eine Bildrate bei Verwendung des Modus, die genauso hoch (oder höher) ist als die Bildrate bei Nichtverwendung des Modus und über die Zeit konstant bleibt, sodass Entwickler kein sich bewegendes Ziel verfolgen müssen.

Wir empfehlen dringend, den Dauermodus so zu implementieren, dass das Gerät die höchstmögliche Dauerleistung erreicht – und nicht nur die Mindestwerte, die zum Bestehen des Tests erforderlich sind (wählen Sie beispielsweise die höchstmöglichen MAX-Frequenzobergrenzen, die nicht dazu führen, dass das Gerät im Laufe der Zeit thermisch drosselt).

Hinweis : Für die Implementierung des Dauermodus ist keine Begrenzung der MAX-Taktraten erforderlich.

Validierung

OEMs können einen CTS-Test (Android 7.0 und höher) verwenden, um ihre Implementierung der API für nachhaltige Leistung zu überprüfen. Der Test führt eine Arbeitslast etwa 30 Minuten lang aus und vergleicht die Leistung mit und ohne aktiviertem Dauermodus:

  • Bei aktiviertem Dauermodus muss die Bildrate relativ konstant bleiben (der Test misst den Prozentsatz der Änderung der Bildrate über die Zeit und erfordert eine Änderung von <5 %).
  • Bei aktiviertem Dauermodus darf die Bildrate nicht niedriger sein als die Bildrate am Ende von 30 Minuten bei deaktiviertem Modus.

Darüber hinaus können Sie Ihre Implementierung manuell mit mehreren CPU- und GPU-intensiven Arbeitslasten testen, um sicherzustellen, dass das Gerät nach 30 Minuten Nutzung nicht thermisch gedrosselt wird. Bei internen Tests verwendeten wir Beispiel-Workloads, darunter Spiele und Benchmarking-Apps (z. B. gfxbench ).

Exklusive Kerne

Bei CPU-intensiven, zeitkritischen Workloads kann die Unterbrechung durch einen anderen Thread den Unterschied zwischen der Einhaltung von Frame-Deadlines und der Nichteinhaltung von Frame-Deadlines ausmachen. Bei Apps, die strenge Latenz- und Bildratenanforderungen haben (z. B. Audio- oder Virtual-Reality-Apps), kann ein exklusiver CPU-Kern ein akzeptables Leistungsniveau garantieren.

Geräte mit Android 7.0 oder höher können jetzt einen Kern explizit für die oberste Vordergrundanwendung reservieren, wodurch die Leistung aller Vordergrund-Apps verbessert wird und Apps mit hoher Arbeitslast mehr Kontrolle darüber erhalten, wie ihre Arbeit auf die CPU-Kerne verteilt wird.

So unterstützen Sie einen exklusiven Kern auf einem Gerät:

  • Aktivieren Sie cpusets und konfigurieren Sie ein cpuset , das nur die oberste Vordergrundanwendung enthält.
  • Stellen Sie sicher, dass ein Kern (dies ist der exklusive Kern) für Threads aus diesem cpuset reserviert ist.
  • Implementieren Sie die getExclusiveCores-API, um die Kernnummer des exklusiven Kerns zurückzugeben.

Um festzustellen, welche Prozesse auf welchen Kernen geplant sind, verwenden Sie systrace während der Ausführung einer Arbeitslast und stellen Sie sicher, dass keine Userspace-Threads von anderen Anwendungen als der obersten Vordergrundanwendung auf dem exklusiven Kern geplant sind.

Eine Referenzimplementierung für das Nexus 6P finden Sie unter android//device/huawei/angler/power/power.c .