Neue High-End-CPU Arm Cortex-A77 – Schneller auch ohne Moore‘s Law

RISC-V-Prozessorkerne von Andes Technology werden vom Markt schnell aufgenommen.

Auf dem TechDay von Arm stellte sein Chefarchitekt den neuen Cortex-A77-Applikationsprozessor vor. Obwohl die grundlegende Mikroarchitektur vom Cortex-A76 übernommen wurde, konnte die Rechenleistung bei identischer Fertigung und gleicher Taktfrequenz um 20 % gesteigert werden. Wie ist das möglich?

Die Entwicklungszentren für Cortex-A befinden sich, wie schon mehrfach erwähnt, neben Austin in Texas in Arms Firmenzentrale in Cambridge sowie im wunderschönen Sophia-Antipolis in der Nähe von Nizza, dort wo vor zehn Jahren noch Texas Instruments seine OMAP-Prozessoren designte. Die Generationen Cortex-A73 und -75 stammten beide aus Frankreich, während die Energiespar-Varianten Cortex-A53 und -A55 aus Cambridge kamen. Der letzte Austin-Prozessor war der Cortex-A76, der sich sowohl in Smartphone-SoCs befindet, aber auch in der AE-Ausführung in Automotive-SoCs zum Einsatz kommt. Da der Chefarchitekt des A76, Mike Filippo sich nunmehr um die Neoverse-CPUs für Infrastruktur-Anwendungen kümmert, wurde das A77-Projekt unter dem Codenamen Deimos” von seinem Kollegen Chris Abernathy (Bild 1) geleitet, der ebenfalls in Austin ansässig ist.

Während der A76 nach vier Jahren Arbeit eine von Grund auf neu aufgebaute Mikroarchitektur implementiert bekam, baut der Cortex-A77 auf der des A76 auf, was wenig überraschend ist: Schon 2018 hatte Filippo angekündigt, dass der A76 Basis für mindestens zwei weitere CPU-Generationen darstellen wird, der Cortex-A77 ist die Nummer 1.

Im Vergleich zu seinem Vorgänger Cortex-A75 erreichte der A76 seinerzeit eine Steigerung der Integer-Rechenleistung um 35 % im bekannten und auch von Intel akzeptierten Benchmark SPECInt_2006, allerdings konnte der A75 in einem 10-nm-Prozess »nur« mit 2,8 GHz getaktet werden, während der Zielprozess des A76 7 nm und eine Taktfrequenz von 3 GHz zugrunde gelegt wurde. Der Cortex-A77 erreicht nunmehr eine Steigerung der Integer-Rechenleistung um 23 % im selben 7-nm-Prozess bei gleicher Taktfrequenz, die somit ausschließlich über Verbesserungen an der Mikroarchitektur erreicht wurden. Bei der Gleitkomma-Rechenleistung wurde sogar eine Steigerung um 35 % (SPECFP_2006) bzw. 25 % (SPECFP_2017) erreicht, die Energieeffizienz ist dabei etwas besser als beim Cortex-A76, da »nur« 20 % mehr Leistungsaufnahme zu Buche stehen. Alle Werte wurden für einen Core gemessen, d. h. die Single-Thread-Rechenleistung. Die Siliziumfläche wird gegenüber dem Cortex-A76 um rund 17 % größer, die Gründe dafür folgen später.

Die L1-Caches für Befehle und Daten sind 64 KB groß und der L2-Cache pro Core kann wahlweise auf 256 KB oder 512 KB konfiguriert werden, dazu kann ein geteilter bis 4 MB großer L3-cache eindesignt werden. Zusammen mit einem “kleinen” Cortex-A55 kann der Cortex-A77 in einem DynamIQ-Custer betrieben werden.

Die Mikroarchitektur im Überblick

Die superskalare Out-of-Order-CPU kommt statt mit vier jetzt mit sechs Befehlsdekodern und statt mit acht jetzt mit 10 Ausführungseinheiten daher (Bild 2). Im Frontend hat Arm erneut seine mit dem A76 eingeführte Einheit für die Sprungvorhersage und das Laden einer Instruktion eingebaut, welche predict-directed fetch genannt wird, da die Sprungvorhersage Daten direkt in die Befehlsabrufeinheit einspeist. Dies ist ein Ansatz, der einen höheren Datendurchsatz sowie eine geringere Stromaufnahme zur Folge hat.

Die Sprungvorhersage setzt dabei einen hybriden indirekten Prädiktor ein. Der Prädiktor ist von der Fetch-Einheit entkoppelt und seine wichtigsten Strukturen arbeiten unabhängig vom Rest der CPU. Er wird statt von den dreistufigen Branch-Target-Caches des A76 nur noch von zweistufigen Caches unterstützt: einem jetzt 64 statt 16 Einträge umfassenden L1-BTB (beim A76 hieß dieser noch nanoBTB) mit einem Taktzyklus Latenzzeit und einem jetzt 8000 statt 6000 umfassenden Haupt-BTB. Der 64 Einträge umfassende microBTB des Cortex-A76 als 2. Hierarchiestufe konnte wegen des vergrößerten nano-BTB folgerichtig entfallen.

Die Trefferquote hinsichtlich richtig prognostizierter Verzweigungen im Programmablauf soll sich gegenüber dem A76 nochmals gesteigert haben, dazu wurde die Bandbreite der Sprungvorhersage auf 64 Byte/Taktzyklus verdoppelt, was bedeutet, dass der Prefetcher bis zu 16 Instruktionen pro Taktzyklus holen kann (Arms Befehle sind 32 bit breit, Thumb-Anweisungen nur 16 bit) was ein früheres Prefetching bei L1-Cache-Misses ermöglicht und die gefürchteten Bubbles (=Pipeline-Stalls) bei angesprungenen Verzweigungen im Fall der Annahme, dass nicht verzweigt wird, verhindert.

Eine Neuheit stellt der zusätzlich eingeführte Macro-Op-Cache (Mop) dar, der einen 1,5 K Einträge (ca. 50 KB) großen Befehls-Cache für dekodierte Instruktionen, die sogenannten Macro-Ops, darstellt und an ähnliche Implementierungen in Intels und AMDs x86-CPUs erinnert. Im Fall eines Cache-Hits wird die Rename-Stufe in der Pipeline direkt aus dem Mop gefüttert, er ist somit quasi ein L0-Cache und seine Trefferrate soll laut Arm bei mehr als 85 % liegen. Die Latenzzeit im Fall einer Sprungbefehlvorhersage beträgt im besten Fall nur noch 10 Taktzyklen statt 11 Taktzyklen wie beim A76, ein sensationeller Wert, der z.B. 30 % unter den 16 Taktzyklen von Intels Skylake-CPUs oder Samsungs Armv8-basierter CPU-Eigenentwicklung M3 liegt. Der Mop nimmt rund die Hälfte der Fläche des 64 K großen L1-Caches ein.

Die Verzweigungseinheit kann pro Taktzyklus acht 16-bit-Instruktionen verarbeiten, welche in eine Fetch-Warteschlange vor dem Laden eines Befehls münden. Diese Warteschlange umfasst zwölf Blöcke. Die Fetch-Einheit selbst arbeitet nur mit halbem Datendurchsatz, also pro Taktzyklus werden maximal vier 16-bit-Instruktionen geladen. Im Falle einer fehlerhaft vorhergesagten Verzweigung kann diese durch diese Architektur vor der restlichen Pipeline verborgen werden, ohne die Fetch-Einheit und den Rest der CPU zu blockieren.

Die Dekodier- und Registerumbenennungsblöcke können sechs pro Taktzyklus verarbeiten, also breiter als der A76 mit vier und erst recht als der A73 mit zwei und der A75 mit drei Instruktionen. Um einen zu großen Anstieg der Leistungsaufnahme zu verhindern, wurde ein Port-sharing-Mechanismus implementiert.

Am Ausgang der Dekodierer finden sich die Macro-Ops, die im Schnitt laut Arm um den Faktor 1,06 größer als die ursprünglichen Befehle sind. Die Registerumbenennung erfolgt getrennt für Integer/ASIMD/Flag-Operationen in separaten Einheiten, die mit Clock-Gating von der Taktversorgung abgeschnitten werden, wenn sie nicht benötigt werden. Dies führt zu enormen Energieeinsparungen. Benötigt die Dekodierung beim A77 zwei Taktzyklen, so benötigt die Registerumbenennung nur einen Taktzyklus. Die Makro-Ops werden mit einem Verhältnis von 1,2 Micro-Op pro Instruktion zu Micro-Ops erweitert, am Ende der Stufe werden bis zu 10 Micro-Ops pro Taktzyklus ausgegeben, was gegenüber A76, A73 und A75 eine Steigerung von 25 %, 67 % bzw. 150 % darstellt (8 Micro-Ops/Taktzyklus für A76, 6 Micro-Ops/Taktzyklus für A75 und 4 Micro-Ops/Taktzyklus für A73).

Die Commit-Puffergröße des A77 beträgt nunmehr 160 statt 128 Einträge, wobei der Puffer in zwei Strukturen für die Befehlsverwaltung und Registerrückgewinnung aufgeteilt ist – Arm nennt es hybrides Commit-System. Dies erlaubt eine noch größere Code-Parallelisierung.

Die Ausführungseinheiten

Der Integer-Teil enthält wie bisher zwei Lade/Speichereinheiten, jedoch zwei statt einer Pipeline für Verzweigungen, was ja angesichts der Verdoppelung der Sprungvorhersage-Bandbreite im Front-End sehr sinnvoll erscheint.

Es gibt nunmehr statt zwei drei ALUs, die in der Lage sind, einfache arithmetische Operationen in einem Taktzyklus und komplexere wie Logik-Operationen, Test/Compare-Operationen oder Verschiebeoperationen in zwei Taktzyklen durchzuführen, und wie beim A76 eine komplexe Pipelines mit Multiplikations-, Divisions- und CRC-Operationen.

Die Latenzzeit von Integer-Multiplikationen der komplexten ALU wurde von 4 auf 2-3 Taktzyklen reduziert. Dies zusammen führt zu einer 50-%-Erhöhung des Durchsatzes im Integer-Teil. Der für Gleitkomma- und Vektoroperationen (ASIMD) zuständige Teil enthält wie beim A76 zwei Pipelines, ergänzt wurde eine zweite Pipeline für die AES-Verschlüsselung.

Laden und Speichern von Daten

Der Daten-Cache ist fest auf 64 KB festgelegt und ist 4-fach assoziativ. Die Latenzzeit bleibt bei vier Zyklen. Der 64 KB große L1-Befehls-Cache liest bis zu 32 Bytes/Taktzyklus, gleiches gilt für den L1-Daten-Cache in beide Richtungen. Der L1 ist ein Writeback-Cache. Der L2-Cache ist in 256 oder 512 KB Größe konfigurierbar und weist datenseitig die gleichen 2 × 32 Byte/Taktzyklus-Schreib- und Leseschnittstellen zum L3-Cache der DSU auf. Ein bis zu 25 % größeres Fenster für In-Flight-Lade- und Speicheroperationen (beim A76 betrugen diese 68 bzw. 72) führen zu noch mehr Parallelität auf Speicherebene. Die Bandbreite von Lade- und Speicheroperationen konnte verdoppelt werden, indem die beiden Store-Daten-Pipelines nun dedizierte Ausführungsports haben, zuvor wurden sie mit den ALUs geteilt. Wie man im Bild sieht, können parallel zwei µOps für die Adresserzeugung und 2 µOps für Datenspeicherungen verarbeitet werden. Die Befehlswarteschlangen wurden zur Aufrechterhaltung der Energieeffizienz vereinheitlicht.

Der A77 bekam einen nochmals gegenüber dem A76 optimierten Daten-Prefetcher mit neuen Engines für eine höhere Genauigkeit, er kann desweiteren größere maximale Adress-Distanzen arbeiten, um eine höhere Bandbreitenauslastung im DRAM zu ermöglichen. Dies bedeutet, dass die Prefetcher sich wiederholende Zugriffsmuster über größere virtuelle Adressbereiche erkennen können als zuvor.

Systembezogenes Prefetching bedeutet eine verbesserte Toleranz gegenüber unterschiedlichen Speicher-Subsystemimplementierungen, dynamische Abstände für unterschiedliche Latenzen und dynamisch angepasste Aggressivität basierend auf der DynamIQ-L3-Auslastung.

Im Allgemeinen verspricht Arm einen Anstieg der IPC (Instruktionen pro Taktzyklus) bei Integer-Anweisungen um 23 % und bei Gleitkomma-/Vektoroperationen um 35 %. Letzteres ist überraschend, da Arm im Backend die Gleitkomma-Pipelines gegenüber dem A76 unverändert gelassen hat. Die einzige Erklärung, die mir dazu einfällt ist, dass SPECInt FP deutlich speicherlastiger als das Integer-Pendant ist, so dass hier die Verbesserungen am Speichersystem durchschlagen.

In Summe soll der A77 dann eine knapp 20 % höhere GeekBench4-Benchmark-Performance und ebenfalls knapp 20 % mehr beim LMBENCH (Mittel von Lesen, Schreiben) bringen (Bild 3).