Arm64EC – Erstellen und Portieren von Apps für systemeigene Leistung auf Arm

Arm64EC ("Emulation Compatible") ermöglicht es Ihnen, neue native Apps zu entwickeln oder bestehende x64-Apps schrittweise umzustellen, um von der nativen Geschwindigkeit und Leistung von ARM-Geräten zu profitieren – einschließlich Verbesserungen bei Stromverbrauch und Akkulaufzeit sowie beschleunigten KI- und ML-Workloads.

Arm64EC ist eine neue Binärschnittstelle (Application Binary Interface, ABI) für Apps, die auf Arm-Geräten mit Windows 11 ausgeführt werden. Es handelt sich um ein Windows 11-Feature, das die Verwendung des Windows 11 SDK erfordert und unter Windows 10 auf Arm nicht verfügbar ist.

Interoperabilität

Als Arm64EC erstellter Code ist interoperabel mit x64-Code, der unter Emulation innerhalb desselben Prozesses läuft. Der Arm64EC-Code im Prozess wird mit systemeigener Leistung ausgeführt, während jeder x64-Code mit Emulation ausgeführt wird, die in Windows 11 integriert ist. Auch wenn Ihre App auf vorhandenen Abhängigkeiten oder Plug-Ins basiert, die Arm noch nicht unterstützen, können Sie mit der Neuerstellung von Teilen Ihrer App als Arm64EC beginnen, um die Vorteile der systemeigenen Leistung zu erzielen.

Arm64EC garantiert die Interoperabilität mit x64, indem es die Konventionen der x64-Software einhält, einschließlich der Aufrufkonventionen, der Stapelnutzung, des Datenstrukturlayouts und der Präprozessordefinitionen. Arm64EC-Code ist jedoch nicht mit Code kompatibel, der als Arm64 erstellt wurde und eine andere Reihe von Softwarekonventionen verwendet.

Das Windows 11 auf Arm-Betriebssystem selbst basiert stark auf der Interoperabilität von Arm64EC, um die Ausführung von x64-Anwendungen zu ermöglichen. Der meiste Betriebssystemcode, der von einer x64-Anwendung unter Windows 11 auf Arm geladen wird, ist als Arm64EC kompiliert worden, was eine native Leistung für diesen Code ermöglicht, ohne dass die Anwendung davon weiß.

Ein x64- oder Arm64EC-Prozess kann sowohl x64- als auch Arm64EC-Binärdateien laden und aufrufen, während ein Arm64-Prozess nur Arm64-Binärdateien laden kann. Beide Architekturen können Arm64X-Binärdateien laden, da sie Code für x64 und Arm64 enthalten.

Prozessarchitektur x64-Binärdatei Arm64EC-Binärdatei Arm64-Binärdatei
x64/Arm64EC
Arm64

✔ = Unterstützt, ❌ = Nicht unterstützt

Ebenso können Arm64EC-Binärdateien zur Buildzeit sowohl in x64- als auch in Arm64EC-Libs verknüpft werden, während Arm64-Binärdateien nur in Arm64-Libs verknüpft werden können.

PE-Architektur x64 lib Arm64EC lib Arm64 lib
Arm64EC
Arm64

✔ = Unterstützt, ❌ = Nicht unterstützt

Weitere Informationen dazu, wie die Arm64EC ABI Interoperabilität ermöglicht, finden Sie unter Grundlegendes zu Arm64EC ABI und Assemblycode.

Verwenden von Arm64EC, um eine vorhandene App unter Windows 11 auf Arm schneller zu machen

Arm64EC ermöglicht es Ihnen, den Code in Ihrer vorhandenen App inkrementell von emuliert auf systemeigene Zugänge zu übertragen. Bei jedem Schritt auf dem Weg wird Ihre Anwendung weiterhin gut ausgeführt, ohne dass alle gleichzeitig neu kompiliert werden müssen.

Example graph showing incremental update effects on Arm performance using Arm64EC

Die Abbildung oben zeigt ein vereinfachtes Beispiel für eine vollständig emulierte x64-Workload, die einige Zeit in Anspruch nimmt, die dann inkrementell mit Arm64EC verbessert wird:

  1. Starten als vollständig emulierter x64-Workload
  2. Nach dem Neukompilieren der CPU-intensiven Teile als Arm64EC
  3. Nach dem erneuten Kompilieren weiterer x64-Module im Laufe der Zeit
  4. Endergebnis einer vollständig nativen Arm64EC-App

Durch erneutes Kompilieren der Module, die die meiste Zeit in Anspruch nehmen oder die CPU-intensivsten von x64 auf Arm64EC sind, erhält die resultierende Arbeitsauslastung die größte Verbesserung für den geringsten Aufwand für jeden Schritt.

App-Abhängigkeiten

Wenn Sie Arm64EC zum Neuerstellen einer Anwendung verwenden, sollten Sie Arm64EC-Versionen von Abhängigkeiten verwenden, aber Sie können auch auf x64-Versionen von Abhängigkeiten zurückgreifen. Arm64-Versionen von Abhängigkeiten werden nicht verwendbar sein.

Beliebiger x64-Code, einschließlich Code von Abhängigkeiten, in einem Arm64EC-Prozess wird per Emulation in Ihrer App ausgeführt. Die Priorisierung der CPU-intensiven Abhängigkeiten für den Übergang von x64 zu Arm64EC hat die größten Auswirkungen auf die Verbesserung der Leistung Ihrer App.

Identifizieren von Arm64EC-Binärdateien und -Apps

Apps, die unter Windows 11 auf Arm ausgeführt werden, interagieren mit Arm64EC-Binärdateien, als ob sie x64-Binärdateien sind. Die App muss nicht wissen, inwieweit der Code in der Binärdatei als Arm64EC neu kompiliert wurde. 

Entwickler, die an der Identifizierung dieser Binärdateien interessiert sind, können sie in einer Entwickler-Eingabeaufforderung mit link /dump /headers anzeigen.

File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
    8664 machine (x64) (ARM64X)

Die Kombination von (x64) und (ARM64X) gibt an, dass ein Teil der Binärdatei als Arm64EC neu kompiliert wurde, obwohl die Binärdatei immer noch x64 zu sein scheint. Eine Binärdatei mit einem Computerheader, der (ARM64) und (ARM64X) enthält, ist eine Arm64X PE-Datei , die in x64- und Arm64-Apps geladen werden kann.

Der Windows Task-Manager kann auch verwendet werden, um zu ermitteln, ob eine App als Arm64EC kompiliert wurde. Auf der Registerkarte Details des Task-Managers wird in der Spalte ArchitekturARM64 (x64-kompatibel) für Anwendungen angezeigt, deren ausführbare Hauptdatei teilweise oder vollständig als Arm64EC kompiliert wurde.

Screenshot of Task Manager showing ARM64 (x64 compatible) in Architecture details.

Nächste Schritte

Informationen zum Erstellen oder Aktualisieren von Win32-Apps mit Arm64EC finden Sie unter Erste Schritte mit Arm64EC.