ARMs neuer Low-Power-Core »Ananke« tritt Nachfolge von Cortex-A53 an

Schon im Jahr 2012 stellte ARM mit dem Cortex-A53 die erste 64-bit-Low-Power-CPU vor. Seitdem gab es auf der High-Performance-Seite A57, A72, A73 und A75, aber der A53 blieb. Endlich gibt es mit dem Cortex-A55 einen Nachfolger, die Ähnlichkeiten zum A53 sind jedoch frappierend.

Fünf Jahre ohne Update, eine in der schnelllebigen Zeit der Mikroelektronik fast eine Ewigkeit. Der Cortex-A53, ursprünglich als »Little-Kompagion« für den »Big« A57 in LITTLE.Big-Clustern entwickelt, wurde jedoch mehr und mehr zum Selbstläufer. Insbesondere in Octa-Core-Konfigurationen – der chinesischen Glückszahl 8 – wurde er für asiatische Mobil-SoC-Hersteller wie MediaTek zum Garanten eines rasanten Aufstiegs. Aber auch in der Embedded-Welt wie in NXPs i.MX-Chips fand der A53 seinen Platz, verkörperte er jedoch in einer Kombination von 64-bit-Architektur, geringem Flächenbedarf und hoher Energieeffizienz bis zuletzt eine attraktive Kombination für ARMs Lizenznehmer.

Zumindest für die Halbleiterhersteller, die zukünftig auf DynamIQ-Architekturen [1] setzen wollen, ist jedoch jetzt zwangsweise Schluss mit dem A53. Sein als Partner für den Cortex-A75 [2] aber auch Standalone-CPU gedachter Nachfolger ist der unter dem Codenamen »Ananke« entwickelte Cortex-A55. Er ist dem A53 in vielen Dingen sehr ähnlich ist. Er weist jedoch diverse Optimierungen an aus Systemsicht kritischen Stellen sowie auch dem Speichersystem auf und wurde auf dem ARM TechDay 2017 in Cambridge enthüllt.

Wie aus Bild 1 ersichtlich ist, hat der A55, wie auch der A53, ein Dual-Issue-Design mit einer 8-stufigen In-Order-Pipeline. Laut ARM handelt es sich dabei um einen »Sweet Spot« bezüglich der sich widersprechenden Zielen höhere Taktfrequenz (= längere Pipeline) und Leistungsaufnahme/Flächenbedarf auf dem Chip (= kürzere Pipeline).

Die größte Veränderung fand im Backend statt, wo jetzt separate Ausführungseinheiten für Lade- und Speicher-operationen bereitstehen, so daß anders als beim A53 diese parallel ausgeführt werden können.

Dieser vermeintliche Vorteil erweist sich jedoch bei In-Order-Designs in vielerlei Fällen als hinfällig, nämlich bei Cache-Misses oder falsch vorhergesagten Sprüngen. Muss nämlich auf Befehle oder Daten, von wo auch immer, gewartet werden, wird solange die ganze CPU blockiert. Anders formuliert: Bei Designs wie dem A55 ist es oberkritisch, dafür zu sorgen, dass jederzeit Instruktionen und/oder Daten zur Verarbeitung bereitstehen. Deshalb setzte ARM seinen Fokus auf die Verbesserung des schon beim A53 nicht schlechten Speichersystems.

Befehls-Cache vierfach-assoziativ 

Arbeitete der L1-Befehls-Cache beim Cortex-A53 noch 2-fach-assoziativ, wurde er beim A55 zu einer 4-fach-Assoziativität verändert. Wie zur Reduktion der Latenzzeiten bei L1-Caches üblich, ist der Cache Virtually Indexed und Physically Tagged (VIPT), allerdings wurde der L1-TLB auf 15 Einträge vergrößert und unterstützt zudem unterschiedliche Page-Größen. Der L1-Cache kann mit 16 KB, 32 KB oder 64 KB ausgeführt werden, beim A53 waren 8 KB bis 64 KB möglich. 

Die Treffsicherheit der Sprungvorhersage für bedingte Verzweigungen wurde durch die Implementierung von neuronalen Netzwerk-Algorithmen verbessert, dazu wurde eine Vorhersage für den Abbruch von Schleifen implementiert, welche eine Fehlvorhersage am Ende einer Schleife vermeiden soll. Vor dem »Hauptvorhersage-Block« für bedingte Sprünge wurden sogenannte Mikro-Vorhersageblöcke implementiert, deren Treffsicherheit geringer ist, die jedoch ohne jede Latenzzeit mehrfach nacheinander ausgeführt werden können. Der Vorteil ist ein Geschwindigkeitsgewinn durch die Reduktion von Kontrollflusskonflikten und damit potentieller Pipeline-Lücken sogar in kleinen Schleifen. Eine weitere Vorhersage für indirekte Verzweigungen wird nur aktiviert, wenn sie benötigt wird. Dies spart Energie, da indirekte Verzweigungen relativ selten auftreten. Sie nutzt wie beim Cortex-A75 einen 2-Wege-BTAC mit 256 Einträgen.

Der L1-Daten-Cache arbeitet wie beim A53 immer noch 4-fach-assoziativ, ist jedoch nunmehr vollständig exklusiv statt pseudo-exklusiv, wodurch Fläche gespart wird, da die Daten nicht mehr im L2-Cache dupliziert werden müssen. Die Größe kann auf 16, 32 oder 64 KB eingestellt werden, beim A53 startete er bereits mit 8 KB und endete ebenfalls bei 64 KB.

Während der A53 mit einen PIPT-Cache (physically indexed, physically tagged) arbeitete, der sowohl für Index als auch Tag physikalische Adressen nutzt, arbeitet der A55 wie der A75 mit einem VIPT-L1-Datencache bei dem für den Index eine virtuelle Adresse genutzt wird. Der Vorteil gegenüber dem PIPT ist die geringere Latenzzeit, da die Cache-Zeile parallel mit der TLB-Übersetzung aufgelöst werden kann. Das Tag kann natürlich immer noch nicht verglichen werden, bevor die physikalische Adresse verfügbar ist. Ein mögliches Problem ist Aliasing, was bedeutet, dass mehrere virtuelle Adressen auf dieselbe physikalische Adresse zeigen können. Der A55 stellt in Hardware sicher, dass alle Updates auf dieser physikalischen Adresse in-order ausgeführt werden, indem sich zu jedem Zeitpunkt nur eine Kopie der physikalischen Adresse im Cache befindet. Während der Cache hardwareseitig 4-fach-assoziativ ausgeführt ist, wird er von der Software als 8-fach-assoziativer PIPT-Cache gesehen.

Der Micro-TLB wuchs von 10 auf 16 Einträge und ein größerer Speicher-Puffer mit höherem Datendurchsatz in den L1-Datencache erhöhen die Geschwindigkeit insbesondere für Anwendungen, die zahlreiche Speicheroperationen ausführen. Die Latenzzeiten für das sogenannte Pointer-Chasing - das Einlesen von Daten über verkettete Zeigerstrukturen - konnte von 3 auf 2 Taktzyklen reduziert werden. Neben den Verbesserungen am L1-Datencache selbst wurde auch der Daten-Prefetcher optimiert. Er erkennt komplexere Muster von Cache-Misses, hat eine größere Bandbreite und kann Daten aus L1- und L3-Cache laden.

L2-Cache mit voller CPU-Geschwindigkeit 

Um zu DynamIQ kompatibel zu sein, wird der L2-Cache mit voller CPU-Taktfrequenz betrieben. Die Latenzzeit geht damit gegenüber dem A53, der ja einen zwischen allen CPUs eines Clusters geteilten L2-Cache aufweist, von 12 auf 6 Taktzyklen zurück. Die L2-Größen sind zu 0,64 KB, 128 KB oder 256 KB konfigurierbar, wobei in Embedded-Märkten wohl eher die kleineren Größen aus Kostengründen und für ein mehr deterministisches Verhalten zu erwarten sind. Der L2-TLB wuchs, da der L2-Cache nunmehr Teil jeder einzelnen CPU ist, folgerichtig von 512 auf 1024 Einträge. Im Gegensatz zum L1-Cache wird hier kein VIPT-Datencache, sondern ein PIPT-Cache verwendet, der sowohl für Index als auch Tag physikalische Adressen nutzt. Der Vorteil ist die einfachere Implementierung und ein geringerer Energieverbrauch. Der Nachteil des PIPT, die größere Latenzzeit, spielt beim L2-Cache eine untergeordnete Rolle, da im Gegensatz zum L1 genug Zeit zur Verfügung steht, die physikalische Adresse vom TLB zu bekommen, bevor der Tag verglichen wird.

Während der geteilte L2-Cache beim Cortex-A53 noch 16-fach assoziativ arbeitete, um die Anzahl der Cache-Misses zu minimieren, weist der des A55, wie beim L1, eine 4-fach-Assoziativität auf. Die Folge ist eine minimierte Zugriffs-Latenzzeit, was wie schon erwähnt bei In-Order-Mikroarchitekturen sehr wichtig ist, um Blockaden der Pipeline zu minimieren. Der Nachteil ist eine größere Wahrscheinlichkeit von Cache-Misses, die beim A53 nicht akzeptabel war. Beim A55 ist sie hingegen akzeptabel, da er noch einen relativ eng an den Core angebundenen L3-Cache hat, den es beim A53 nicht gibt. Ein L3-Cache führt abgesehen davon bei In-Order-Designs grundsätzlich zu Steigerungen der Rechenleistung, beim A55 soll für eine jeweilige Verdoppelung der L2-Cache-Größe eine Steigerung um 5 % meßbar sein.

Abschließend soll beim Thema Speichersystem nochmals auf die getrennten Ausführungseinheiten für Lade- und Speicherinstruktionen eingegangen werden. Die gemeinsame Einheit für beide Operationen hat sich A53 als der Flaschenhals im Backend herausgestellt, weshalb es nur konsequent war, auf Kosten von Leistungsaufnahme und Siliziumfläche auf dem Chip eine zweite Einheit zu implementieren, über welche nunmehr Lade- und Speicherbefehle parallel abgearbeitet werden können. Um die Komplexität und die beschriebenen Nachteile nicht zu groß werden zu lassen, ist jede Einheit auf einen Befehlstyp limitiert, somit kann die eine nur Lade- und die andere nur Speicherbefehle ausführen - ein wesentlicher Unterschied zum Cortex-A75. 

Optimierte Pipeline

Bild 2 zeigt die Pipelines der einzelnen Ausführungseinheiten. Wie beim A53 gibt es auch beim A55 zwei Integer-AL-Einheiten, die funktional identisch sind. Dies bedeutet, sie können beide Basis-Operationen wie Additionen oder Bit-Verschiebungen ausführen, aber nur eine Integer-Multiplikation und MAC-Operation, während die andere mit einem Radix-16-Dividierer für Integer-Divisionen ausgestattet ist. Damit können parallel weder zwei Multiplikationen noch zwei Divisionen ausgeführt werden, sondern etwa eine Multiplikation und eine Division/Addition/Bit-Verschiebeoperation. Auch wenn die Pipeline 2 Stufen umfasst, ist es wichtig zu wissen, daß viele Operationen in nur 1 Taktzyklus abgearbeitet werden können. 

Die beiden 64-bit-Gleitkomma/NEON-Vektor-Pipelines haben wie in Bild 3 einen eigenen 128-bit-Registersatz. Damit können pro Taktzyklus acht 8-bit-Integer-, vier 16-bit-Integer-, zwei 32-bit-Integer- oder Gleitkomma-Operationen mit einfacher Genauigkeit oder eine 64-bit-Integer- oder Gleitkomma-Operation mit doppelter Genauigkeit ausgeführt werden. Ein Programmierer kann seine Anwendung somit zwischen Rechenleistung und Genauigkeit ausbalancieren.

Mit der im A55 implementierten Architektur ARMv8.2. wurden auch Gleitkommaoperationen mit halber Genauigkeit, also 16 bit Datengröße, eingeführt. Damit reduziert sich der benötigte Platz in Caches und Hauptspeicher, was logischerweise den Datendurchsatz erhöht. Beim A53 war es zwar auch möglich, Daten im Gleitkommaformat mit halber Genauigkeit zu laden, allerdings mussten diese vor der Verarbeitung intern noch ins Format mit einfacher Genauigkeit umgewandelt werden, was zusätzlichen Overhead und Latenzzeiten generiert hat.

Im Speziellen nutzen viele Algorithmen für neuronale Netzwerke zur Erhöhung der Ausführungsgeschwindigkeit dieses FP16 genannte Datenformat erst recht, wenn das Training vorbei ist. Um diese Algorithmen weiter zu beschleunigen, wurde mit ARMv8.2. noch eine weitere Instruktion eingeführt, nämlich das INT8-Skalarprodukt, welche diverse herkömmliche Instruktionen zu seiner Berechnung zusammenfasst und damit die Latenzzeiten wesentlich reduziert. Konkret wird durch die Tatsache, daß nur eine Instruktion in die Pipeline eingespeist wird statt mehrere wie beim A53, laut ARM eine Vervierfachung der Geschwindigkeit erreicht, wenn man die Verbesserungen am Speichersystem noch mit berücksichtigt, sogar eine Verfünffachung. Nicht zuletzt wird eine verbundene Multiplikation-Addition (FMA), statt wie beim A53 in zwei Schritten, beim A55 in einem Schritt ausgeführt, was die Latenzzeit von 8 auf 4 Taktzyklen reduziert. 

Fazit

»Anake« ist nicht mehr als ein optimierter Cortex-A53, aber eben auch nicht weniger. Beim SPECINT2006-Benchmark erreicht der Cortex-A55 bei gleicher Frequenz und gleicher Chip-Fertigung eine um 18 % höhere Rechenleistung als der A53, die natürlich teilweise auch DynamIQ geschuldet ist, während die Leistungsaufnahme gleichzeitig nur um 3 % zulegt. Die Energieeffizienz steigt somit um 15 %. In anderen Benchmarks ist der Zugewinn an Rechenleistung noch deutlich höher, wie unter anderem beim Gleitkommazentrierten SPECFP2006 um 38 % und beim GeekBench4 um 21 %. Beim JMCStream, der den Speicher-Datendurchsatz misst, wird der A53 sogar um 97 % übertroffen. Dazu kommen die in [1] beschriebenen Vorteile von DynamIQ (Thema Fehler-Reporting, RAS,…), welche unter anderem ASIL-D-Anwendungen möglich machen - ein mit Big.LITTLE und Cortex-A53 undenkbares Szenario.

Ob der Cortex-A55 eine Lebensdauer von 5 Jahren aufweisen wird wie sein Vorgänger A53, wage ich trotzdem zu bezweifeln. Spätestens, wenn die Chip-Fertigung in Richtung 7 nm oder sogar darunter geht, dürfte ARM über weitere Optimierungen nachdenken, wie eine dritte ALU-Pipeline oder Lade-/Speichereinheiten, die wie beim A75 beide Operationen verarbeiten und damit eine höhere Flexibilität erlauben. Derzeit ist das Design jedoch im Hinblick auf die Energieeffizienz und Kostenoptimierung das Maß aller Dinge. Man muss eine Glaskugel lesen, um dem A55 einen ähnlichen Erfolg wie seinem Vorgänger zu prognostizieren. (fr)

Referenzen 

Riemenschneider, F.: DynamIQ ersetzt big.LITTLE. DESIGN&ELEKTRONIK 2017, Heft 7, Seite 34 ff.

Riemenschneider, F.: Cortex-A75 macht Single-Thread-Apps glücklich. DESIGN&ELEKTRONIK 2017, Heft 8, Seite 33 ff.