Mehr Hardware-Sicherheit Armv8.6.-A-Architektur unterstützt KI-Anwendungen

Die neuesten Verbesserungen der Armv8-A-Architektur betreffen in erster Linie neuronale Netze für maschinelles Lernen. Neben einem neuen Datenformat gibt es Vektor-Befehle für Matrizenmultiplikationen. Sicherheitsfunktionen liefern Verbesserungen bei der Unterstützung der Zeigerauthentifizierung.

Die Matrixvervielfachung ist ein wichtiger Bestandteil der neuronalen Netze als Teil der Faltungsschichten. In einer Matrix finden sich die Gewichte, in einer anderen die Aktivierungen.

Um die Matrix in Bild 1 zu multiplizieren, verwendet ein einfacher Algorithmus typischerweise drei verschachtelte Schleifen, um eine Ausgabe nach der anderen zu berechnen:

For y in M

  For x in N

    For z in K

     C(y,x) += A(y,z) * B(z,x)

Damit werden insgesamt 2 * M * N * K Fetch-Operationen benötigt.

Armv8.6-A führt hierfür neue General Matrix Multiply (GEMM) genannte Instruktionen für SVE (Scalable Vector Extension) und Neon vor. Diese optimieren den Prozess, indem sie die Anzahl der Speicherzugriffe reduzieren. Dies wird beispielsweise durch die Berechnung mehrerer Elemente auf einmal erreicht, wie es in Bild 2 exemplarisch dargestellt ist.

Hier werden jedes Mal zwei Operanden von A und B (2x Fetches) geladen, aber vier Ergebnisse auf einmal berechnet (4x Compute pro Schleife,  4x weniger Schleifen). Insgesamt halbiert sich die Anzahl der Speicherzugriffe im Vergleich zur Berechnung eines Elements nach dem anderen.

Größere Bereiche bieten noch größere Vorteile, z.B. mit 4x4-Array erfordert jede Tiefeniteration 8 Operandenwerte, führt aber 16 Multiplikationen durch.

Die neuen Anweisungen werden für die Datenformate BFloat16 und vorzeichenlose und vorzeichenbehaftete 8-Bit-Ganzzahlen sowohl SVE als auch für Neon hinzugefügt. SVE unterstützt zusätzlich Gleitkomma-Matrix-Multiplikatoren mit einfacher und doppelter Genauigkeit.

Das Zahlenformat BFloat16 (BF16) hat sich in jüngster Zeit zu einem Format entwickelt, das speziell auf die Hochleistungsbearbeitung neuronaler Netze zugeschnitten ist. Armv8.6-A fügt Anweisungen zur Beschleunigung bestimmter Berechnungen im Gleitkommazahlenformat BF16 hinzu. Wir haben das Zahlenformat bereits ausführlich an dieser Stelle vorgestellt und diskutiert.

Verbesserung der Virtualisierung

Arm hat die Virtualisierungsunterstützung seit ihrer Einführung in Armv7-A kontinuierlich verbessert. Ein wesentliches Merkmal der Virtualisierungsunterstützung ist die Möglichkeit, von der virtuellen Maschine ausgeführte Operationen zu erfassen. Entweder um diese Operationen zu virtualisieren oder um dem Hypervisor zu erlauben, als Wächter für das Gastbetriebssystem zu fungieren.

Armv8.6-A verbessert die Unterstützung für diesen zweiten Anwendungsfall, den Hypervisor als Wächter zu nutzen.

Die WFE-Anweisungen (Wait-for-Event) ermöglichen es einer Implementierung, während des Wartens auf ein Ereignis, wie z.B. die Freigabe von aktuell gesperrten Daten, in einen Zustand mit niedriger Spannung zu gelangen, um Energie zu sparen. Wenn die WFE von einer virtuellen Maschine ausgeführt wird, wird ein Hypervisor die WFE typischerweise abfangen, so dass sie in dieser Zeit einen anderen Workload ausführen kann.

Oftmals tritt das erwartete Ereignis jedoch schnell ein, so dass der Kontextwechsel zu einem anderen Workload eher kontraproduktiv ist und man einen Performance-Vorteil hätte, wenn man einfach gewartet hätte. Studien von Arm haben gezeigt, dass die Einführung einer Verzögerung den Durchsatz in überlasteten Systemen verbessern kann.  Zur Unterstützung hierfür bietet Armv8.6-A eine optionale Unterstützung für eine konfigurierbare Verzögerung an, damit die Software die Verzögerung auf die Arbeitslast abstimmen kann.

Generischer Timer: Hochpräzise Zeitmessung

Seit Armv7-A bietet Arm ein standardisiertes Timer-Framework, die Generic Timer-Architektur. Armv8.6-A bringt eine Reihe von Verbesserungen am Generic Timer. Der Generic Timer stellt ein Register, CNTFREQ_EL0, zur Verfügung, um mit der Frequenz des Systemtaktes zu zählen, erlaubte aber den Implementierern die Freiheit, mit welcher Frequenz gezählt werden soll. Dies war immer wieder eine Herausforderung für Software, die Workloads zwischen Systemen mit unterschiedlichen Frequenzen migriert. Armv8.6-A standardisiert diese Frequenz auf 1GHz und sorgt so für eine einheitliche Zeitbasis. 1GHz ist auch eine wesentlich höhere Frequenz als die vorherigen Richtlinien, was zu einer höheren Präzision führt.

Zusätzlich werden selbstsynchronisierende Formen der physikalischen und virtuellen Zählerhinzugefügt. Dies vereinfacht die Codefolge, die z.B. benötigt wird, um sicherzustellen, dass nach einer Speicheroperation ein Lesen des aktuellen Zählers erfolgt.

Sicherheit

In Armv8.3-A und Armv8.5-A wurde Unterstützung für Pointer Authentication and Branch Target Indicators (BTI) eingeführt. Zusammen helfen diese beiden Funktionen, Techniken wie ROP- und JOP-Angriffe (Return- und Jump-Oriented Programming) zu reduzieren. Armv8.6-A baut auf dieser Unterstützung auf und erweitert die Pointer-Authentifizierung weiter.

In Armv8.3-A wird bei fehlgeschlagener Authentifizierung eine ungültige Adresse zurückgegeben. In den meisten Fällen wird diese Adresse kurz nach der Authentifizierungsanweisung (AUT*) verwendet, entweder um eine Verzweigung oder einen Datenzugriff durchzuführen. Diese Verwendung des Zeigers führt zu einer Exception. In einigen wenigen Fällen wird die von der Anweisung AUT* zurückgegebene Adresse nicht sofort verwendet, Armv8.6-A führt daher zwei Funktionen ein, um mit diesen Fällen umzugehen.

Erweitertes PAC2 und FPAC

EnhancedPAC2 ändert die Art und Weise, wie ein PAC zu einem Zeiger hinzugefügt wird. In Armv8.3-A ersetzte der PAC die oberen Bits des Zeigers. Bei EnhancedPAC2 ist das PAC mit den oberen Bits des Zeigers XORiert.

Wenn ein Angreifer Zugriff auf die von einer AUT*-Anweisung zurückgegebene Adresse erhalten kann, kann er möglicherweise wiederholte Schätzungen über den richtigen PAC für die Adresse vornehmen.

Um solchen Angriffen entgegenzuwirken, wurde in Armv8.6-A eine neue Erweiterung (FPAC) hinzugefügt. Implementierungen mit FPAC erzeugen eine Ausnahme bei einer AUT*-Anweisung, wenn der PAC falsch ist. So wird verhindert, dass ein Angreifer mehrere Versuche unternimmt, das richtige PAC für eine bestimmte Adresse zu erraten.

Last but not least wurde zu Armv8.6.-A  auch die Virtualisierungsunterstützung zu den Activity Monitor Units (AMU) hinzugefügt.

Armv9-A in den Startlöchern

Mit dem CPU-Core Codename „Matterhorn“, der wohl Ende 2021/Anfang 2022 als Nachfolger des Cortex-A78 in Silizium das Licht der Welt erblicken wird, wird nach unseren Informationen eine neue Mikroarchitektur Armv9-A eingeführt. In diversen Stellenanzeigen z.B. auf Linkedin wurden bereits entsprechende Experten gesucht, z.B. ein „Mikro-Architekt und RTL-Designer für die Lade/Speichereinheiten des Armv9-A-Cores der nächsten Generation“ oder ein „„Mikro-Architekt und RTL-Designer für asynchrone Bridges, Takterzeugung, Rest und Low-Power-Management des Armv9-A-Cores der nächsten Generation“.

Lassen wir uns überraschen, was die neue Architektur mit sich bringen wird, ehrlich gesagt, ich habe derzeit keine Ahnung und auch gegenüber meinen amerikanischen Kollegen im Silicon Valley gibt sich Arm derzeit noch sehr verschwiegen.