Arm TechDays 2019

Auf in Cloud und Infrastruktur: Das ist Arms Neoverse-Universum

20. Februar 2019, 14:00 Uhr | Frank Riemenschneider

Fortsetzung des Artikels von Teil 1

Die Neoverse-E1-CPU

Arm
Multithreading bei der Neoverse-E1-CPU. Die Software denkt, sie würde auf zwei getrennten CPUs laufen.
© Arm

Neben der auf maximale Rechenleistung optimierten Neoverse-N1-CPU präsentierte Arm noch eine zweite neue CPU, die Neoverse-E1. Diese wurde auf maximalen Datendurchsatz in Anwendungen wie z.B. Wireless/Wireline-Points oder Datenaggregation in einem Local-Edge-Netzwerk entwickelt. Im Vergleich zu Arms Cortex-A53, der bislang in diesem Marktsegment dominiert, wurde der Durchsatz bei identischer Taktfrequenz und Fertigung um Faktor 2.7 erhöht, die Rechenleistung um Faktor 2.1. Der Wirkungsgrad (Durchsatz/W) stieg um Faktor 2.4.

Auch wenn es gewisse Ähnlichkeiten mit einem Cortex-A55 gibt, so unterscheidet sich die E1-Mikroarchitektur doch viel stärker vom Cortex-A55 als der Neoverse-N1 vom Cortex-A76. Der wichtigste Unterschied besteht in der Einführung eines symetrischen Multithreadings und in der Out-of-Order-Befehlsausführung, um Speicherlatenzen auffangen zu können. Tatsächlich dominieren Cache-Misses die CPU-Taktzyklen bei der Datenpaketverarbeitung. Gegenüber einem Cortex-A55 reduziert der Neoverse-E1 den Anteil der Taktzyklen, in welchen die CPU-Pipeline blockiert ist („Stall“) in unterschiedlichen repräsentativen Workloads um bis zu Faktor 3.

Ein typisches Neoverse-E1-Cluster besteht aus bis zu 8 CPUs, einem Snoop-Filter, bis zu 4 MB L3-Cache, der Stromversorgung, Bus-Schnittstellen zu Edge- und Cloud-Anwendungen und einen Accelerator-Coherency-Port (ACP, ein AXI-Slave-Port) für die Anbindung von etwaigen Hardware-Beschleunigern mit Cache-Stashing-Unterstützung.

Die Neoverse-E1-Mikroarchitektur

Präsentiert wurde der E1 von Sujat Jami, Senior Principal Engineer bei Arm in Chandler, Arizona. Vor seiner Zeit bei Arm arbeitete Jami 8 Jahre bei Marvell, wo er mit seinem Team auf Basis einer Arm-Architekturlizenz die Armada-Prozessoren für Enterprise-Anwendungen entwickelte.

Die zwei Threads erscheinen aus Softwaresicht funktional wie zwei separate CPUs, d.h. der Status mit Allzweckregistern, Vektor-Registern und System-Registern wird pro Thread repliziert. Jeder Thread kann somit auf unterschiedlichen Exception-Ebenen (EL) laufen, unterschiedliche Betriebssysteme laufen lassen u.s.w. Beide Threads können zudem simultan ausgeführt werden, d.h. Instruktionen beider Threads können parallel in die Pipelines eingespeist und abgearbeitet werden (Bild 5). Die Rechenzeit wird den Threads nach einem Round-Robin-Verfahren zugeteilt.

Die Out-of-Order-CPU kommt mit 2 Befehlsdekodern und 6 Ausführungseinheiten daher und weist insgesamt eine 10-stufige Integer-Pipeline auf (Bild 6).

Anbieter zum Thema

zu Matchmaker+
Arm
Die Pipeline der Neoverse-E1-CPU.
© Arm

Arbeitete der L1-Befehls-Cache beim Cortex-A53 noch 2-fach-assoziativ, wurde er wie beim A55 auch beim E1 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 32 KB oder 64 KB ausgeführt werden.

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.

Der mit Paritätsbit geschützte L1-Daten-Cache arbeitet wie beim A55 4-fach-assoziativ und vollständig exklusiv statt pseudo-exklusiv, wodurch Fläche gespart wird, da die Daten nicht im L2-Cache dupliziert werden müssen. 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 E1 wie der A55 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 E1 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 beinhaltet 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

Wie beim A55 wird der optionale L2-Cache pro Core (0, 64 oder 256 KB) 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. 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 E1, 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 E1 ist sie hingegen akzeptabel, da er noch einen relativ eng an den Core angebundenen L3-Cache hat, den es beim A53 nicht gibt.

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.

Gegenüber einem Cortex-A53 ist mit den beschriebenen Änderungen die Speicherbandbreite um Faktor 4.9 gestiegen.

Optimierte Pipeline im Backend

Der E1 kann wie in Bild 6 ersichtlich ist parallel 3 Instruktionen, die in einer 8 Befehle umfassenden Reservation-Station gespeichert sind, parallel abarbeiten. Wie beim A55 gibt es auch beim E1 zwei 64-bit-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 Integer-Divisionen mit einem Radix-16-Dividierer. Damit können parallel weder zwei Multiplikationen noch zwei Divisionen ausgeführt werden, sondern etwa eine Multiplikation und eine 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 einen eigenen 128-bit-Registersatz. Damit können pro Taktzyklus sechzehn 8-bit-Integer-, acht 16-bit-Integer-, vier 32-bit-Integer- oder Gleitkomma-Operationen mit einfacher Genauigkeit oder zwei 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 E1 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. Pro Taktzyklus können beim E1 acht 16-bit-FP16-Befehle ausgeführt werden.

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 schon beim N1 erwähnte INT8-Skalarprodukt, welche diverse herkömmliche Instruktionen zu seiner Berechnung zusammenfasst und damit die Latenzzeiten wesentlich reduziert. Konkret wird durch die Tatsache, dass 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. Pro Taktzyklus können 16 INT8-Instruktionen abgearbeitet werden. Nicht zuletzt wird eine verbundene Multiplikation-Addition (FMA), statt wie beim A53 in zwei Schritten, beim E1 in einem Schritt ausgeführt, was die Latenzzeit von 8 auf 4 Taktzyklen reduziert.

Die Leistungsaufnahme einer E1-CPU beträgt inklusive 32 KB L1-Cache und 128 KB L2-Cache nur 183 mW bei 2,5 GHz Taktfrequenz und einer Core-Versorgungsspannung von 0,75 V. Die Fläche Silizium beträgt in TSMCs 7-nm-Implementierung pro Core in dieser Konfiguration nur 0,46 mm2.


  1. Auf in Cloud und Infrastruktur: Das ist Arms Neoverse-Universum
  2. Die Neoverse-E1-CPU
  3. Neoverse-Referenzdesigns
  4. Neoverse-N1-Hyperscale-Referenzdesign
  5. Neoverse-Entwicklungsboard
  6. Fazit

Das könnte Sie auch interessieren

Verwandte Artikel

ARM Germany GmbH