Arm64EC: compilación y portabilidad de aplicaciones para el rendimiento nativo en Arm

Arm64EC ("compatible con emulación") permite crear nuevas aplicaciones nativas o realizar una transición incremental de las aplicaciones x64 existentes para aprovechar la velocidad nativa y el rendimiento posibles con los dispositivos con tecnología Arm, incluido un mejor consumo de energía, la duración de la batería y las cargas de trabajo aceleradas de inteligencia artificial y aprendizaje automático.

Arm64EC es una nueva interfaz binaria de aplicaciones (ABI) para aplicaciones que se ejecutan en dispositivos Arm con Windows 11. Es una característica de Windows 11 que requiere el uso del SDK de Windows 11 y no está disponible en Windows 10 en Arm.

Interoperabilidad

El código compilado como Arm64EC es interoperable con el código x64 ejecutado en emulación dentro del mismo proceso. El código Arm64EC del proceso se ejecuta con rendimiento nativo, mientras que cualquier código x64 se ejecuta en la emulación que viene integrada con Windows 11. Incluso si la aplicación se basa en dependencias o extensiones existentes que aún no son compatibles con Arm, puedes empezar a recompilar partes de la aplicación como Arm64EC para obtener las ventajas del rendimiento nativo.

Arm64EC garantiza la interoperabilidad con x64 siguiendo las convenciones de software x64, como la convención de llamada, el uso de pila, el diseño de la estructura de datos y las definiciones de preprocesador. Sin embargo, el código Arm64EC no es compatible con el código creado como Arm64, que usa un conjunto diferente de convenciones de software.

El propio sistema operativo Windows 11 en Arm se basa en gran medida en la interoperabilidad de Arm64EC para habilitar la ejecución de aplicaciones x64. La mayor parte del código del sistema operativo cargado por una aplicación x64 que se ejecuta en Windows 11 en Arm se habrá compilado como Arm64EC, lo que permite aprovechar el rendimiento nativo para ese código sin que la aplicación lo sepa.

Un proceso x64 o Arm64EC puede cargar y llamar a archivos binarios x64 y Arm64EC, mientras que un proceso Arm64 solo puede cargar archivos binarios de Arm64. Ambas arquitecturas pueden cargar archivos binarios Arm64X, ya que contienen código para x64 y Arm64.

Arquitectura de procesos Binario x64 Binario Arm64EC Binario Arm64
x64/Arm64EC
Arm64

✔ = Compatible, ❌ = No compatible

De forma similar, en tiempo de compilación, los archivos binarios de Arm64EC pueden vincularse tanto en bibliotecas x64 como en bibliotecas Arm64EC, mientras que los archivos binarios de Arm64 solo pueden vincularse en bibliotecas de Arm64.

Arquitectura de PE Biblioteca de x64 Biblioteca de Arm64EC Biblioteca de Arm64
Arm64EC
Arm64

✔ = Compatible, ❌ = No compatible

Para obtener más información sobre cómo la ABI de Arm64EC habilita la interoperabilidad, consulta Descripción de la ABI de Arm64EC y el código de ensamblado.

Usar Arm64EC para que una aplicación existente sea más rápida en Windows 11 en Arm

Arm64EC permite realizar una transición incremental del código de la aplicación existente de emulado a nativo. En cada paso del camino, la aplicación continúa ejecutándose correctamente sin necesidad de volver a compilarla toda.

Example graph showing incremental update effects on Arm performance using Arm64EC

En la imagen anterior se muestra un ejemplo simplificado de una carga de trabajo x64 totalmente emulada que tarda algún tiempo que, a continuación, se mejora incrementalmente mediante Arm64EC:

  1. Empezando con una carga de trabajo x64 totalmente emulada
  2. Después de volver a compilar las partes más intensivas en uso de CPU como Arm64EC
  3. Después de volver a compilar más módulos x64 a lo largo del tiempo
  4. Resultado final de una aplicación Arm64EC totalmente nativa

Al volver a compilar los módulos que tardan más tiempo o que consumen más CPU de x64 a Arm64EC, la carga de trabajo resultante recibe la mayor mejora para la menor cantidad de esfuerzo en cada paso del camino.

Dependencias de aplicaciones

Al usar Arm64EC para volver a compilar una aplicación, te interesará usar versiones Arm64EC de dependencias, pero también puedes confiar en versiones x64 de dependencias. Las versiones ARM64 de las dependencias no se podrán usar.

Cualquier código x64, incluido el de las dependencias, en un proceso ARM64EC, se ejecutará bajo emulación en la aplicación. La priorización de las dependencias que consumen más CPU para realizar la transición de x64 a Arm64EC tendrá el mayor impacto para mejorar el rendimiento de la aplicación.

Identificación de archivos binarios y aplicaciones Arm64EC

Las aplicaciones que se ejecutan en Windows 11 en Arm interaccionarán con los archivos binarios de Arm64EC como si fueran archivos binarios x64. La aplicación no necesita saber en qué medida el código del archivo binario se ha vuelto a compilar como Arm64EC. 

Para los desarrolladores interesados en identificar estos archivos binarios, pueden verse en un símbolo del sistema para desarrolladores usando link /dump /headers.

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

La combinación de (x64) y (ARM64X) indica que alguna parte del archivo binario se ha vuelto a compilar como Arm64EC, aunque el archivo binario sigue siendo aparentemente x64. Un binario con un encabezado de máquina que contiene (ARM64) y (ARM64X) es un archivo PE Arm64X que se puede cargar en aplicaciones x64 y Arm64.

El Administrador de tareas de Windows también se puede usar para identificar si una aplicación se ha compilado como Arm64EC. En la pestaña Detalles del Administrador de tareas, en la columna Arquitectura aparecerá ARM64 (compatible con x64) para las aplicaciones cuyo ejecutable principal se ha compilado parcialmente o completamente como Arm64EC.

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

Pasos siguientes

Consulta Primeros pasos con Arm64EC para obtener información sobre cómo compilar o actualizar aplicaciones Win32 con Arm64EC.