Neue Mikroarchitektur für Cortex-M KI auf Mikrocontrollern mit Armv8.1-M und Helium

Mit dem Cortex-M4 brachte Arm erstmals DSP-Instruktionen in die MCU-Welt. Die vom Arm9E geerbten Befehle sind jedoch limitiert. Mit der Mikroarchitektur Armv8.1-M und den Helium-Vektor-Erweiterungen soll sogar künstliche Intelligenz von der Cloud mittels MCU auf das Endgerät gebracht werden können.

Die Armv8.1-M-Architektur ist eine Erweiterung der aktuellen Armv8-M-Architektur, die erstmals Arms Sicherheitstechnologie TrustZone in Mikrocontroller-CPUs brachte und heute in Cortex-M33 und Cortex-M23 implementiert ist. Sie bringt viele neue Funktionen mit sich, darunter neue Vektor-Instruktionen für Signalverarbeitungsanwendungen, die so genannte M-Profil-Vektor-Erweiterung (MVE) mit dem Codenamen Helium. Neben Helium gibt es viele weitere architektonische Erweiterungen unter anderem für mehr Sicherheit und Debugging-Unterstützung, zusätzliche Erweiterungen des Befehlssatzes für Schleifen und Verzweigungen (Low Overhead Branch Extension), Gleitkommazahlen mit halber Genauigkeit, Erweiterung des Befehlssatzes für das TrustZone Management der Gleitkommaeinheit (FPU) und ein neues Speicherattribut in der Speicherschutzeinheit (MPU). Die Verbesserungen im Debugging umfassen eine Performance-Monitoring-Einheit (PMU) und werden später im Detail beschrieben. Sie konzentrieren sich im Wesentlichen auf die Entwicklung von Signalverarbeitungsanwendungen. Dazu gibt es Neuerungen für Verbesserungen der Zuverlässigkeit, Verfügbarkeit und Wartbarkeit (RAS-Funktionen).

Viele Anwendungen im Bereich der künstlichen Intelligenz (KI) und im Bereich des maschinellen Lernens (ML) sind heute auf einem Mikrocontroller am Geräteendpunkt undenkbar, auch wenn es natürlich Ausnahmen gibt, die sogar schon heute auf Cortex-M0+-CPUs laufen. Entweder muss man diese rechenintensiven Operationen in der Cloud ablaufen lassen, was Nachteile zum Beispiel im Bereich der Latenzzeiten mit sich bringt und natürlich auch eine stabile drahtlose oder drahtgebundene Verbindung ins Rechenzentrum voraussetzt.

Ist die Cloud aus welchen Gründen auch immer nicht einsetzbar und Anforderung an die Rechenleistung für heutige Cortex-M-Produkte zu hoch, sind Applikationsprozessoren vom Typ Cortex-A, FPGAs oder GPU-Architekturen, wie sie zum Beispiel Nvidia in die Autoindustrie liefert, alternativlos. Für viele Anwendungen dürfte sich dies mit Armv8.1-M-CPUs ändern, da insbesondere die digitale Signalverarbeitungsleistung zum Beispiel bei Matrizen-Berechnungen gegenüber heutigen MCUs exponentiell verbessern wird - ML in der Egde auf einer MCU erscheint für deutlich mehr Anwendungen realistisch.

Helium: Die Vektor- Erweiterungen (MVE)

Helium ist eine optionale Erweiterung, die eine höhere Signalverarbeitungsleistung für Arm-Cortex-M-Prozessoren ermöglicht.

Durch die Kombination von Helium mit der neuen sogenannten Low-Overhead-Branch-Extension (Details dazu später) kann die Signalverarbeitung mit Armv8.1-M-Prozessoren um ein Vielfaches besser sein als mit den traditionellen SIMD-Befehlen in Armv7-M und Armv8.0-M, wobei eine kleine Prozessorgröße mit ausgezeichneter Energieeffizienz beibehalten wird. Potentielle Anwendungen sind Audiogeräte, Sensor-Hubs (Sensorfusion), Wearables, Keyword-Spotting und Sprachsteuerung, Leistungselektronik und Steuerungen (Signalverarbeitung), Kommunikation, zum Beispiel NB-IoT, und Standbildverarbeitung, zum Beispiel Kamera.

Mit Helium könnten viele Anwendungen, die bisher einen Cortex-M-Prozessor mit dediziertem DSP einsetzten, die beiden Prozessorsysteme zu einem einzigen Prozessor zusammenführen. Das hat viele Vorteile:

  • Vereinfachung der Softwareentwicklung - erforderlich ist nur eine einzige Toolchain, eine einzige Architektur und der Software-Overhead für die Kommunikation zwischen den beiden Prozessorsystemen wird reduziert.
  • Reduzieren der Komplexität des Silizium-Designs - es ist nur ein einziges Speichersystem erforderlich, wodurch ein schnellerer SoC-Designzyklus ermöglicht und die Kosten gesenkt werden.

Es ist auch möglich, einige der älteren eigenständigen DSP-Produkte in Embedded-Systemen zu ersetzen:

  • Cortex-M-Prozessoren sind sehr vielseitig und können allgemeine Nicht-DSP-Workloads mit höherer Leistung ausführen als viele ältere DSPs.
  • Die hohe Code-Dichte der Cortex-M-Prozessoren ermöglicht eine Senkung der Systemkosten.

Auf Cortex-A-Prozessoren sind derartige SIMD-Instruktionen schon seit langer Zeit im Rahmen der sogenannten Neon-Technologie verfügbar. Auch wenn es Ähnlichkeiten zwischen Helium und Neon gibt (beide verwenden 128 Bit große Vektor-Befehle, beide verwenden Register in der Gleitkommaeinheit für SIMD-Anweisungen und einige Vektoranweisungen existieren sowohl in Neon als auch in Helium) handelt es sich bei Helium um ein vollständig neues Design speziell für kleine Prozessoren, dazu gibt es viele neue architektonische Merkmale, die in Neon nicht verfügbar sind.

Es gibt jedoch viele wesentliche Unterschiede zwischen Helium und Neon: Helium arbeitet aus Platz- und Energieeffizienz-Gründen bei 128 Bit Registerbreite statt mit 16 mit nur 8 Vektor-Registern, was nur halb so groß ist wie die Neon-Vektor-Registerbank. Einige Operationen in Helium verwenden sowohl Vektorregister als auch Register in der skalaren Registerbank (skalare Register enthalten nur einen einzelnen Datenwert wie Integer-Zahlen, die als Datenwerte wie auch als Adressen verwendbar sind).

Helium unterstützt dazu mehr Datentypen als Neon (Neon unterstützt 8 bis 64 Bit Integer, Festkomma und Gleitkomma mit halber, einfacher und doppelter Genauigkeit; bei Helium kommt zum Beispiel 128-bit-Integer dazu, Details dazu später). Helium unterstützt weiterhin viele neue Funktionen wie Schleifenprädiktion, Per-Lane-Prädiktion, komplexe Mathematik und Scatter-Gather-Speicherzugriffe.

Die Prädikation ist ein architektonisches Merkmal, das eine Alternative zu bedingten Verzweigungsbefehlen bietet. Die Prädiktion funktioniert, indem sie Anweisungen aus beiden Pfaden des Zweiges ausführt und nur diesen Anweisungen aus dem zurückgelegten Pfad erlaubt, den architektonischen Zustand zu ändern. Die Anweisungen aus dem zurückgelegten Pfad dürfen den architektonischen Zustand ändern, weil sie mit einem Prädikat verbunden (prädikiert) sind, einem booleschen Wert, der von der Anweisung verwendet wird um zu steuern, ob die Anweisung den architektonischen Zustand ändern darf oder nicht.

Vektorprozessoren verwenden replizierte Lanes der Vektoreinheit, um auf Datenebene parallelisieren zu können. Jede Lane enthält einen Teil des Vektor-Registersatzes, einen Datenpfad von jeder Vektorfunktionseinheit und einen oder mehrere Ports in der Speicherhierarchie. Bei jedem Zyklus empfangen die Lanes identische Steuersignale und führen für jede Vektoranweisung mehrere Elementaroperationen aus. Mehrere Lanes ermöglichen es einer Vektoreneinheit, einen hohen Datendurchsatz ohne die Verwendung komplizierter Logik zu erreichen, die normalerweise für hohe Datenraten notwendig ist.

Helium beinhaltet über 150 neue skalare und Vektoranweisungen. Architektonisch gibt es viele Implementierungsoptionen: Die einfachste Option ist deren Entfall. Eine Armv8.1-M-CPU enthält in diesem Fall einen Integer-Core mit ebenfalls optionaler skalarer FPU (optional mit Unterstützung von doppelter Genauigkeit).

Die zweite Option ist eine auf Integer-Arithmetik limitiertes Helium mit optionaler skalarer FPU (optional mit Unterstützung von doppelter Genauigkeit). Und schließlich kann Helium für Integer- und Gleitkomma-Arithmetik implementiert werden, welche in der Vektorverarbeitung einfache und halbe Genauigkeit ermöglicht. Dazu kommt wieder eine skalare FPU (optional mit Unterstützung für doppelte Genauigkeit).

Aufgrund der Vielzahl der von Helium abgedeckten Anweisungen ist es unmöglich, alle in diesem Artikel zu behandeln. Hier sind einige Highlights, zusätzlich zu den Möglichkeiten der Vektorverarbeitung:

  • Lade- und Speicheranweisungen (VLD2/VST2 mit Schritten von 2 und VLD4/VST4 mit Schritten von 4) für versetzt angeordnete Datenstrukturen (Interleaving). Dabei werden die Daten in einer bestimmten Reihenfolge angeordnet, um einen höheren Durchsatz zu erreichen.
  • Gather-Load/Scatter-Store bei Vektoren: Speicherzugriff von Elementen in einem Vektorregister mit Adressversatz jedes Elements im Vektor, der über Elemente in einem anderen Vektorregister definiert wird. Dies ermöglicht es Software, beliebige Speicherzugriffsmuster zu verarbeiten und kann verwendet werden, um spezielle Adres-sierungsmodi wie die zirkuläre Adressierung zu emulieren, die häufig in der Signalverarbeitung verwendet werden. Dies kann auch dazu beitragen, den nicht sequentiellen Zugriff auf Datenelemente in Arrays in verschiedenen Datenverarbeitungsaufgaben zu beschleunigen. Gather-Scatter ist eine Art der Speicheradressierung, die häufig bei der Adressierung von Vektoren in linearen Algebraoperationen auftritt. Es ist das Vektoräquivalent der indirekten Registeradressierung, wobei Gather indizierte Lesezugriffe und Scatter indizierte Schreibzugriffe beinhaltet.
  • Vektorverarbeitung von komplexen Zahlen mit Unterstützung von Ganzzahlen (8 bit, 16 Bit und 32 bit) und Gleitkomma (32 bit) - zum Beispiel VCADD, VCMUL, VCMLA-Befehle,
  • Lane-Prädikation,
  • Bit-Integer-Unterstützung.

Um die Siliziumfläche und Leistungsaufnahme des Prozessors zu reduzieren, wird die Registerbank in der FPU für die Vektorverarbeitung wiederverwendet (Bild 1).

Die Integererweiterungen ermöglicht die Berechnung von 8-, 16- und 32-bit-Festkommazahlen. 16- und 32-bit-Festkommaformate werden häufig in traditionellen Signalverarbeitungsanwendungen, wie der Audioverarbeitung, verwendet. Das 8-bit-Festkommaformat kann für maschinelles Lernen (ML) wie die Berechnung neuronaler Netze, sowie für die Bildverarbeitung wichtig sein.