Ultra-Low-Power-Prozessor mit RISC-V IoT-Prozessor für KI-Applikationen

Hohe Rechenleistung kombiniert mit dynamischen Energiemanagement entsteht ein KI-IoT-Prozessor im Batteriebetrieb.
Hohe Rechenleistung kombiniert mit dynamischen Energiemanagement entsteht ein KI-IoT-Prozessor im Batteriebetrieb.

RISC-V erlaubt es den Befehlssatz zu erweitern. Mit speziellen Befehlen zur Vektorverarbeitung lassen sich z.B. hohe Rechenleistungen realisieren, wie sie für neuronale Netze benötigt werden. Kombiniert mit einem dynamischen Energiemanagement entsteht so ein KI-IoT-Prozessor für den Batteriebetrieb.

Was würde passieren, wenn IoT-Sensoren und -Geräte anfangen würden, informationsreiche Signale wie Töne, Vibrationen und Bilder zu verarbeiten – dafür begannen wir uns im Jahr 2016 zu interessieren. Damals produzierten IoT-Sensoren in der Regel nur geringe Datenmengen: Temperatur- oder Feuchtigkeitswerte oder nur den Zustand eines digitalen Signals.

Die ersten Einsätze von IoT-Funksensoren hatten gezeigt, welch große Bedeutung der Batteriebetrieb hat. Ohne eine sehr lange Lebensdauer der Batterie haben die Betriebskosten eines Funksensors viele mögliche Geschäftsmodelle schnell zerstört. Um die anschließend zunehmende Nachfrage nach Energiespartechniken zu decken, wurden mehrere Low-Power-Funktechniken (LPWAN – Low Power Wide Area Network) wie Sigfox, LoRa und LTE Cat NB1 (NB-IOT) entwickelt.

Diese Netzwerke opfern Bandbreite und Latenzzeiten, um große Funkzellen und einen geringen Energiebedarf am Funksensorknoten zu erreichen. Bei der Betrachtung dieser Netzwerke stellten wir fest, dass sie grundsätzlich nicht mit der Übertragung informationsreicher Signale kompatibel sind. Um Sensoren, die informationsreiche Signale verarbeiten, an diese Netzwerke anzuschließen, müssten große Mengen an Informationen direkt in der Sensorschaltung verarbeitet werden. Und um den Batteriebetrieb aufrechtzuerhalten, müsste die Signalverarbeitung mit einem so niedrigen Energieeinsatz erfolgen, den die derzeit verfügbaren Low-Power-Mikrocontrollern nicht erreichen können.

Rechenleistung nach Bedarf

Beim Blick auf die Art der Verarbeitung, die im Sensor durchgeführt werden müsste, lässt sich eine große Spannweite feststellen. Um beispielsweise ein Schall- oder ein Vibrationssignal zu verarbeiten, würde ein erheblicher Teil der Rechenlast von der Signalverarbeitung, der Rauschunterdrückung, der Echokompensation, der Merkmal-Extraktion und sogar der Strahlformung in Multi-Mikrofonanlagen herrühren. Nur ein kleiner Teil der Rechenleistung würde tatsächlich für die Inferenzoperation benötigt.

Die Kombination mehrerer Signaltypen, z.B. Ton und Bild, würde eine noch größere Rechenleistung im Prozessor erfordern. Die meisten Algorithmen weisen einen gewissen Grad an Parallelität auf, einige eignen sich sogar sehr gut für eine parallele Verarbeitung, andere weniger.

Leistungsaufnahme an die Betriebsart anpassen

IoT-Geräte verbringen die meiste Zeit damit, auf ein externes oder zeitgesteuertes Ereignis zu warten und nichts zu tun. Wenn das Ereignis eintritt, muss das IoT-Gerät so schnell wie möglich aufwachen, eine Verarbeitung durchführen und so schnell wie möglich in den Ruhezustand versetzt werden. Im obigen Audiobeispiel bedeutet ein zu langsames Aufwachen, dass der erste Teil eines Tonsignals fehlt, was die Fähigkeit beeinträchtigt, ihn zu erkennen.

In einigen Fällen kann die benötigte Rechenleistung nach dem Aufwachen gering sein, z.B. bei der Netzwerkwartung, und in einigen Fällen ist die Rechenlast erheblich, wenn z.B. ein Sensorsignal verarbeitet werden muss. Die Zeit, die für den Übergang zwischen diesen Leistungszuständen und die angemessene und schnelle Skalierung des Energiebedarfs aufgewendet wird, ist entscheidend für die Gesamt-Energieeffizienz des IoT-Gerätes.

Um diese Anforderungen erfüllen zu können, wird ein Prozessor benötigt, der einige der Eigenschaften eines Mikrocontrollers aufweist, z.B. schnelle Leistungszustandsänderungen und extrem niedrige Stromaufnahme im Bereitschaftsbetrieb, aber der bei Bedarf eine Rechenleistung erreichen kann, wie sie ein High-end-Prozessor mit mehreren Kernen bietet.

Um diese High-end-Rechenleistung zu erreichen, mussten wir die Parallelität der Rechenlast ausnutzen, dies jedoch in einer Weise, die extrem feinkörnig ist und große Beschleunigungsfaktoren auch für »schwierige« Algorithmen zulässt. Schließlich müssen die Übergänge zwischen den Leistungsstufen extrem schnell erfolgen, um sicherzustellen, dass beim Wechsel zwischen verschiedenen Zuständen keine Energie verschwendet wird.

Im Februar 2018 kündigte GreenWaves Technologies einen IoT-Anwendungsprozessor an, der darauf ausgelegt ist, auf diese Herausforderungen zu reagieren: den GAP8.
Die Entwicklung des GAP8 ist eng mit dem Parallel-Ultra-Low-Power-Projekt (PULP) der ETH Zürich und der Universität Bologna verknüpft, zu dessen Gründungsmitgliedern Eric Flamand, CTO von GreenWaves Technologies, gehörte. Das PULP-Projekt hat mehrere verschiedene Open-Source-RISC-V-Kerne und mehrere Generationen von Test-Chips hervorgebracht. GAP8 ist nicht nur aus technischer Sicht ein revolutionärer Prozessor, er ist auch einer der ersten Versuche weltweit, die Vorteile von Open Source Hardware in ein Halbleiterprodukt einzubringen (Bild 1).

GAP8 ist Mikrocontroller mit 8 + 1 Kernen. Alle Kerne nutzen die Befehlssatzarchitektur RISC-V RV32-IMC. Wir haben die Fähigkeit zur Erweiterung des Befehlssatzes, die RISC-V bietet, genutzt, um eine Reihe von Anweisungen hinzuzufügen, die eine weitere Optimierung bei Signalverarbeitungsaufgaben ermöglichen: Operationen wie Hardware-Schleifen mit 0 Zyklen, DSP/lineare Algebra-Operationen, Bitmanipulation und Vektor/SIMD-Erweiterungen (Single Instruction, Multiple Data) für 8- und 16-bit-Festkommazahlen erhöhen die Rechenleistung auf Befehlsebene – bei einem moderaten Anstieg der Gate-Zahl (Tabelle).

Einer der RISC-V-Kerne wird als klassischer Mikrocontroller, den wir Fabric Controller (FC) nennen, für Erfassung, Steuerung und Kommunikation verwendet. Acht Prozessorkerne sind als Cluster für paralleles Rechnen organisiert. Der FC und das Cluster arbeiten in getrennten Frequenz- und Spannungsbereichen, sodass unabhängig voneinander Taktfrequenz und Versorgungsspannung dynamisch an die aktuelle Rechenlast angepasst werden können (DVFS – Dynamic Voltage and Frequency Scaling). Das gesamte Powermanagement und die Uhr (RTC – Real Time Clock) befinden sich auf dem Chip. Dadurch kann der GAP8 schnell zwischen den Leistungszuständen umschalten und ermöglicht eine extrem niedrige Stromaufnahme im Bereitschaftsbetrieb.

Das Cluster beinhaltet acht RISC-V-Kerne, die identisch mit dem FC sind, aber an einen gemeinsamen L1-Speicherbereich über einen logarithmischen Verbindungsblock (Logarithmic Interconnect – als LIC oder LIN abgekürzt) angeschlossen sind. Dadurch kann in 98 % der Fälle in einen Zyklus auf den Speicher zugegriffen werden. Jede Task-Verarbeitung und die Synchronisation von Kopplungen sowie zwischen den Kernen werden in Hardware durchgeführt.

Ein Task kann in drei bis vier Zyklen auf alle Kerne verteilt und ausgeführt werden. Sobald ein Kern eine Operation beendet hat, setzt er eine Sperre, die als Lesezugriff auf der Synchronisierungssteuerung der Cluster-Hardware implementiert ist und die beim Aufwecken des Kerns aufgehoben wird. Der Kern ist für den nächsten Zyklus vom Takt getrennt und es fließt nur Leckstrom. Sobald alle Kerne die Operation beenden und die Sperre setzen, laufen im nächsten Zyklus alle Kerne wieder.

Diese Parallelverarbeitung mit extrem geringem Aufwand erreicht unser Ziel, eine gute Beschleunigung bei Algorithmen zu ermöglichen, bei denen der parallele Teil des Codes auf nur 50 Zyklen reduziert werden kann. Ein gemeinsamer Befehls-Cache zwischen den Kernen im Cluster begrenzt die Befehlsabrufe aus dem Speicher, wobei die Tatsache ausgenutzt wird, dass die Kerne den gleichen Kernel mit verschiedenen Daten ausführen. Das Cluster beinhaltet auch eine allgemeine Schnittstelle für dedizierte Beschleuniger, die den L1-Speicher identisch mit den Kernen ansprechen. Der GAP8 verfügt über einen speziellen Beschleuniger für Faltungen, der in der Lage ist, eine einzelne 5 × 5-Faltung mit Akkumulation auf 16-bit-Werte zu einem 32-bit-Ausgabewert in einem einzigen Taktzyklus durchzuführen.

Der Beschleunigungseffekt der Befehlssatzerweiterungen und des Clusters lässt sich am Beispiel einer Addition von zwei Arrays in den GAP8-Kernen verdeutlichen: Listing 1. Mit dem Standard-RISC-V-Befehlssatz würde die Berechnung (Listing 2) elf Zyklen pro Ausgang benötigen.

Mit Hilfe der Auto-Inkrement Lade- und Speicher-Anweisungen des GAP8 lässt sich die Anzahl der Zyklen auf acht pro Ausgang reduzieren (Listing 3). Mit den 0-Zyklus-Hardware-Schleifen lässt sich die Berechnung auf fünf Zyklen pro Ausgang verkürzen (Listing 4).

Mit den SIMD-Anweisungen kann der GAP8 die Vektoraddition innerhalb von 1,25 Zyklen pro Ausgang ausführen (Listing 5). Eine Verbesserung um eine Größenordnung gegenüber dem nativen RISC-V-Befehlssatz. Hier werden die Verbesserungen der Befehlssatzerweiterung mit der parallelen Verarbeitung über die acht Kerne im Cluster kombiniert.

Bild 2 zeigt die Auswirkung der Befehlssatzerweiterungen und der parallelen Rechenfähigkeit für ein einfaches Beispiel zur Vektoraddition. Die gleichen Optimierungen werden für eine Vielzahl verschiedener Algorithmen verwendet, die in modernen tiefen und faltenden neuronalen Netzen (DNN – Deep Neural Networks, CNN – Convutional Neural Networks) verwendet werden.

Die Reduzierung der Anzahl der ausgeführten Anweisungen führt zusammen mit dem hinsichtlich des Energieeinsatzes optimierten Aufbau des GAP8, z. B. durch den Shared Instruction Cache, zu einer Steigerung der Energieeffizienz. Damit ergibt sich gleichzeitig eine Beschleunigung, sodass für diese Klasse von Algorithmen insgesamt eine hervorragende Energieeffizienz erreicht wird (Bild 3).