Arm64EC - Générer et porter des applications pour des performances natives sur Arm

Arm64EC (« Emulation Compatible ») vous permet de créer des applications natives ou de migrer de manière incrémentielle des applications x64 existantes pour tirer parti de la vitesse et des performances natives possibles avec les appareils Arm, notamment une meilleure consommation d’énergie, une meilleure autonomie de la batterie et des charges de travail IA ML accélérées.

Arm64EC est une nouvelle interface binaire d’application (ABI) pour les applications s’exécutant sur des appareils Arm avec Windows 11. Il s’agit d’une fonctionnalité Windows 11 qui nécessite l’utilisation du kit de développement logiciel (SDK) Windows 11 et qui n’est pas disponible sur Windows 10 sur Arm.

Interopérabilité

Le code généré en tant qu’Arm64EC est interopérable avec le code x64 exécuté sous émulation au sein du même processus. Le code Arm64EC du processus s’exécute avec des performances natives, tandis que n’importe quel code x64 s’exécute à l’aide d’émulation intégrée avec Windows 11. Même si votre application s’appuie sur des dépendances ou des plug-ins existants qui ne prennent pas encore en charge Arm, vous pouvez commencer à régénérer des parties de votre application en tant qu’Arm64EC pour bénéficier des avantages des performances natives.

Arm64EC garantit l’interopérabilité avec x64 en suivant les conventions logicielles x64, notamment la convention d’appel, l’utilisation de pile, le layout de structure de données et les définitions de préprocesseur. Toutefois, le code Arm64EC n’est pas compatible avec le code généré en tant qu’Arm64, qui utilise un ensemble différent de conventions logicielles.

Le système d’exploitation Windows 11 sur Arm s’appuie fortement sur l’interopérabilité d’Arm64EC pour permettre l’exécution d’applications x64. La plupart des codes du système d’exploitation chargés par une application x64 s’exécutant sur Windows 11 sur Arm ont été compilés en tant qu’Arm64EC, ce qui permet des performances natives pour ce code sans connaître l’application.

Un processus x64 ou Arm64EC peut charger et appeler des fichiers binaires x64 et Arm64EC, tandis qu’un processus Arm64 ne peut charger que des fichiers binaires Arm64. Les deux architectures peuvent charger des fichiers binaires Arm64X, car ceux-ci contiennent du code pour x64 et Arm64.

Architecture de processus binaire x64 Binaire Arm64EC Binaire Arm64
x64/Arm64EC
Arm64

✔ = Pris en charge, ❌ = Non pris en charge

De même, au moment de la génération, les fichiers binaires Arm64EC peuvent se lier à la fois dans les bibliothèques x64 et Arm64EC, tandis que les fichiers binaires Arm64 peuvent uniquement se lier dans les bibliothèques Arm64.

Architecture PE Bibliothèque x64 Bibliothèque Arm64EC Bibliothèque Arm64
Arm64EC
Arm64

✔ = Pris en charge, ❌ = Non pris en charge

Pour plus d’informations sur la façon dont arm64EC ABI active l’interopérabilité, consultez Comprendre l’ABI Arm64EC et le code d’assembly.

Utiliser Arm64EC pour accélérer une application existante sur Windows 11 sur Arm

Arm64EC vous permet de passer de façon incrémentielle le code de votre application existante de l’émulation vers le mode natif. À chaque étape le long du chemin, votre application continue de s’exécuter correctement sans avoir besoin d’être recompilée tout en même temps.

Example graph showing incremental update effects on Arm performance using Arm64EC

L’image ci-dessus montre un exemple simplifié d’une charge de travail x64 entièrement émulée prenant un certain temps qui est ensuite améliorée de manière incrémentielle à l’aide d’Arm64EC :

  1. À partir d’une charge de travail x64 entièrement émulée
  2. Après avoir recompilé les parties les plus gourmandes en UC en tant que Arm64EC
  3. Après avoir continué à recompiler plus de modules x64 au fil du temps
  4. Résultat final d’une application Arm64EC entièrement native

En recompilant les modules qui prennent le plus de temps ou qui sont les plus gourmands en UC de x64 à Arm64EC, la charge de travail résultante reçoit la plus grande amélioration pour le moins d’efforts à chaque étape du parcours.

Dépendances d’application

Lorsque vous utilisez Arm64EC pour régénérer une application, vous souhaiterez utiliser les versions Arm64EC des dépendances, mais vous pouvez également vous appuyer sur les versions x64 des dépendances. Les versions Arm64 des dépendances ne seront pas utilisables.

Dans un processus Arm64EC, n’importe quel code x64, y compris le code des dépendances, s’exécutera sous émulation dans votre application. La hiérarchisation des dépendances les plus gourmandes en UC pour passer de x64 à Arm64EC aura un impact maximal sur l’amélioration des performances de votre application.

Identification des fichiers binaires et des applications Arm64EC

Les applications s’exécutant sur Windows 11 sur Arm interagissent avec les fichiers binaires Arm64EC comme s’ils sont des fichiers binaires x64. L’application n’a pas besoin de savoir dans quelle mesure le code dans le fichier binaire a été recompilé en Arm64EC. 

Pour les développeurs intéressés par l’identification de ces fichiers binaires, vous pouvez les voir dans une invite de commandes de développeur à l’aide de link /dump /headers.

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

La combinaison de (x64) et (ARM64X) indique que certaines parties du binaire ont été recompilées en Arm64EC, même si le binaire semble toujours être du x64. Un fichier binaire avec un en-tête d’ordinateur qui contient (ARM64) et (ARM64X) est un fichier PE Arm64X qui peut être chargé dans les applications x64 et Arm64.

Le Gestionnaire des tâches Windows peut également être utilisé pour identifier si une application a été compilée en tant qu’Arm64EC. Dans l’onglet Détails du gestionnaire de tâches, la colonne Architecture affiche ARM64 (compatible x64) pour les applications dont l’exécutable principal a été partiellement ou complètement compilé en Arm64EC.

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

Étapes suivantes

Consultez Prise en main d’Arm64EC pour découvrir comment créer ou mettre à jour des applications Win32 à l’aide d’Arm64EC.