Im Gegensatz zum M55, der speziell auf das Machine Learning (ML) Marktsegment zugeschnitten ist, gibt es mit dem M85 nun einen echten Nachfolger für den bislang leistungsstärksten M7. Neben den M7-Fähigkeiten deckt der M85 zusätzlich die ML-Fähigkeiten des M55 mit ab und ist damit nicht nur das schnellste, sondern auch das am umfangreichsten einsetzbare neue Familienmitglied.
Die meisten Armv8-M Neuerungen, wie TrustZone, verbesserte MPU und Stack Limits, sind durch den M23 und M33 weitgehend bekannt. Mit der Einführung des M85 werden viele Entwickler aber vermutlich zum ersten Mal mit den zusätzlichen Befehlen und neuen Features der Armv8.1-M Architektur in Kontakt kommen.
Lohnt sich ein Upgrade vom M7 auf den neuen M85?
Das wichtigste Kriterium zur Beantwortung dieser Frage ist die Abwärtskompatibilität. Die gute Nachricht zuerst: Analog zum Upgrade des M0+ auf den M23 und des M4 auf den M33 gilt dies auch für ein Upgrade des M7 auf den M85. Wer die neuen Features nicht nutzen will, der braucht beim M23, M33 und nun auch beim M85 nur die MPU neu zu programmieren, denn diese ist nicht rückwärtskompatibel.
Wer die neuen Features nutzen möchte, steht zunächst vor der Qual der Wahl. Die Armv8-M und Armv8.1-M Architekturen bieten dem Chipdesigner viele neue Konfigurationsmöglichkeiten. Anwender müssen die neuen Chips sorgfältig anhand der angebotenen Optionen auswählen, um die Wunschfeatures nutzen zu können, die im Folgenden kurz beschrieben sind:
Helium M-Profile Vector Extension (MVE)
Die Anwendung von ML im Edge beinhaltet eine Vielzahl von Matritzenberechnungen in Echtzeit. Die entsprechenden Modelle werden zuvor auf Servern gelernt und mit Toolchains wie zum Beispiel Tensorflow vereinfacht, normiert und mit Hilfe von ML-Bibliotheksfunktionen wie CMSIS-NN auf dem Cortex-M im Edge ausgeführt.
Zur Erhöhung der Berechnungsgeschwindigkeit normiert man die Daten im Modell ohne substantiellen Qualitätsverlust auf möglichst kleine Festkomma- oder Integerformate mit 8 Bit, 16 Bit oder 32 Bit. Die Verarbeitungsgeschwindigkeit des Cortex-M für diese Matritzenberechnungen geht daher direkt in die ML-Performance ein.
Die Helium-Erweiterung nutzt die Floating Point Unit (FPU) Register als 128-Bit Vektor-Register und kann dadurch parallel 16 Operationen mit je 8 Bit, 8 Operationen mit je 16 Bit oder 4 Operationen mit je 32 Bit ausführen. Die Implementierung der CMSIS-NN-Bibliothek sorgt dafür, die nötigen neuen MVE-Befehle des Cortex-M85 einzusetzen. Mithilfe der MVE schafft der M85 im ML eine bis zu 4-fache Performance im Vergleich zu einem M7.
Low Overhead Branch Extension
Im ML-Kontext hat die Verarbeitungsgeschwindigkeit von Schleifen einen ausschlaggebenden Einfluss auf die Performance. Daher können im M85 Schleifenkonstrukte durch neue Maschinenbefehle und erweiterte Pipelinefunktionalität fast ohne den üblichen Overhead verarbeitet werden. Mithilfe der neuen Befehle WLS, DLS und LE merkt sich die Pipeline den Beginn und das Ende einer Schleife. Der Schleifenzähler und der Endwert werden in Core-Registern gehalten. Abbildung 3 zeigt ein Beispiel, in dem die Register LR und R0 dazu verwendet werden. Nur im ersten Schleifendurchlauf werden die im Beispiel rot hinterlegten Schleifenbefehle ausgeführt. Bei allen weiteren Schleifendurchläufen wird nur noch der innere Teil der Schleife wiederholt ausgeführt, im Beispiel grün hinterlegt.
Verglichen mit einer ausgeflachten Schleife werden in Summe nur zwei weitere Befehle benötigt. Sollte während der Schleifenbearbeitung ein Interrupt auftreten, ist nach der Interruptbehandlung eine erneute Ausführung des LoopEnd (LE) Befehls zur weiteren Aufsynchronisierung der Pipeline nötig; der Overhead hält sich mit einem zusätzlichen Befehl pro Interrupt deutlich in Grenzen. Ein wirklich cooles Feature! Das Schönste ist: Die eigentliche Arbeit, die neuen Befehle zu verwenden, erledigt der Compiler für uns.
In Abbildung 4 ist ein einfacher C-Code abgebildet, der ein Array von 256 8-Bit-Werten mit ihrem jeweiligen Index initialisiert.
Im blauen Kasten des Bildes 5 ist farblich grün und rot gut zu erkennen, dass das Ergebnis der Kompilierung die Befehle der Low Overhead Branch Extension einsetzt und damit die Laufzeit im Vergleich zu einer Schleifenkonstruktion mit Branches verringert.
Im Gegensatz zum Ergebnis der Kompilierung mit Optimierungsstufe 1 sieht das Ergebnis mit der Optimierungsstufe 2 völlig anders aus. In Bild 6 ist gut zu erkennen, dass hier nicht die Low Overhead Branch Extension benutzt wird, sondern durch eine „Auto Vectorization“ genannte Optimierung jeweils 16 Zuweisungen parallel ausgeführt werden und hierzu die MVE Helium-Erweiterung verwendet wird. Die Codegröße steigt durch die notwendigen Tabellen mit Werten an, dafür ist die Laufzeit durch die Parallelisierung im Vergleich zum Ergebnis mit Low Overhead Branch Extension nochmals kürzer.
Die neuen WLS-, DLS- und LE-Befehle und deren Derivate WLSTP, DLSTP, LETP mit Loop Tail Predication sind auch dann im M85 vorhanden, wenn die MVE-Helium-Erweiterung nicht implementiert ist.
Half Precision Floating Point
Wie bereits im MVE-Abschnitt beschrieben, wird die ML-Berechnung ohne substantiellen Qualitätsverlust auf möglichst kleinen Festkomma- oder Integerformaten mit 8 Bit, 16 Bit oder 32 Bit normiert. Daher beherrscht die FPU des M85 nicht nur Single Precision 32 Bit und Double Precision 64 Bit, sondern auch Half Precision 16-Bit-Fließkommaoperationen.
PXN-Attribut
Bei der Verwendung von RTOS-Betriebssystemen laufen die Tasks üblicherweise im nicht-privilegierten User Mode ab. Nur das Betriebssystem selbst und die Interrupt Service Routinen nutzen den privilegierten Mode und erlauben dadurch zum Beispiel den Zugriff auf die Memory Protection Unit (MPU) und den Nested Vectored Interrupt Controller (NVIC).
Um das Erschleichen des privilegierten Modus durch Datenmanipulationen auf dem Stack zu verhindern, gibt es in der Armv8.1-M Architektur das neue PXN-Bit in jeder MPU-Region. Damit lässt sich verhindern, dass der User Code der Tasks im privilegierten Mode ausgeführt werden kann. So wird ein zusätzlicher Riegel vorgeschoben, um unberechtigte Zugriffe auf sicherheitsrelevante Bereiche zu unterbinden.
Pointer Authentication und Branch Target Identification (PACBTI)
Das mit dem M85 neu eingeführte PACBTI-Feature bietet zusätzlichen Schutz vor potentiellen Zugriffsverletzungen. Das Konzept dahinter ist die Signatur von Pointern und Rücksprungadressen, um deren Manipulation aufdecken zu können und ggf. Gegenmaßnahmen einzuleiten. Mithilfe der PAC-Befehle wird zu Pointern und Rücksprungadressen eine individuelle Signatur erzeugt und intern abgelegt. Diese Signatur kann durch Software nicht gelesen werden.
Bei der Nutzung des Pointers oder der Rücksprungadresse wird die Signatur erneut berechnet und intern im Core mit der gespeicherten Signatur verglichen. Eine Abweichung der Signatur wird als Manipulationsversuch gewertet und eine Exception zur Behandlung der Situation ausgelöst.
Ausblick Das Erscheinen der ersten Cortex-M85 Chips auf dem Markt ist für kommendes Jahr zu erwarten, erst dann werden eigene Erfahrungen mit dem Cortex-M85 Performance-Flaggschiff möglich.