Arm64EC: criar e portar aplicativos para desempenho nativo no Arm

O Arm64EC (“Compatível com Emulação”) permite a criação de aplicativos nativos ou a transição incremental de aplicativos x64 existentes para usufruir da velocidade e do desempenho nativos proporcionados por dispositivos habilitados para o Arm, incluindo melhor consumo de energia, duração da bateria e cargas de trabalho de IA e ML aceleradas.

O Arm64EC é uma nova ABI (interface binária de aplicativo) para aplicativos executados em dispositivos Arm com Windows 11. É um recurso do Windows 11 que requer o uso do SDK do Windows 11 e não está disponível no Windows 10 no Arm.

Interoperabilidade

O código construído como Arm64EC é interoperável com o código x64 em execução sob emulação dentro do mesmo processo. O código Arm64EC no processo é executado com desempenho nativo, enquanto códigos x64 são executados usando emulação interna do Windows 11. Mesmo que o aplicativo se baseie em dependências ou plug-ins existentes ainda não compatíveis com o Arm, você pode começar a reconstruir partes do aplicativo como Arm64EC para obter os benefícios do desempenho nativo.

O Arm64EC garante a interoperabilidade com x64 ao seguir convenções de software x64, incluindo convenção de chamada, uso de pilha, layout de estrutura de dados e definições de pré-processador. No entanto, o código Arm64EC não é compatível com o código construído como Arm64, que usa um conjunto diferente de convenções de software.

O próprio sistema operacional Windows 11 no Arm se baseia amplamente na interoperabilidade do Arm64EC para permitir a execução de aplicativos x64. A maioria dos códigos do sistema operacional carregados por um aplicativo x64 em execução no Windows 11 no Arm foi compilada como Arm64EC, habilitando desempenho nativo para este código sem que o aplicativo saiba.

Um processo x64 ou Arm64EC pode carregar e chamar binários x64 e Arm64EC, enquanto um processo Arm64 só pode carregar binários Arm64. Ambas as arquiteturas podem carregar binários Arm64X, pois eles contêm código para x64 e Arm64.

Arquitetura de processo Binário x64 Binário Arm64EC Binário Arm64
x64/Arm64EC
Arm64

✔ = Com suporte, ❌ = Sem suporte

Da mesma forma, no momento da compilação, os binários Arm64EC podem ser vinculados em bibliotecas x64 e Arm64EC, enquanto os binários Arm64 só podem ser vinculados em bibliotecas Arm64.

Arquitetura PE Biblioteca x64 Biblioteca Arm64EC Biblioteca Arm64
Arm64EC
Arm64

✔ = Com suporte, ❌ = Sem suporte

Para obter mais detalhes sobre como a ABI Arm64EC permite a interoperabilidade, consulte Noções básicas sobre ABI Arm64EC e o código do assembly.

Use o Arm64EC para tornar um aplicativo existente mais rápido no Windows 11 no Arm

O Arm64EC permite que você faça a transição incremental do código no aplicativo existente de emulado para nativo. Em cada etapa ao longo do caminho, o aplicativo continua a funcionar bem sem a necessidade de ser recompilado de uma só vez.

Example graph showing incremental update effects on Arm performance using Arm64EC

A imagem acima mostra um exemplo simplificado de uma carga de trabalho x64 totalmente emulada que leva algum tempo que, em seguida, é aprimorada incrementalmente usando Arm64EC:

  1. Iniciar como uma carga de trabalho x64 totalmente emulada
  2. Depois de recompilar as partes mais intensivas em CPU como Arm64EC
  3. Depois de continuar a recompilar mais módulos x64 ao longo do tempo
  4. Resultado final de um aplicativo Arm64EC totalmente nativo

Ao recompilar os módulos que levam mais tempo ou que consomem mais CPU de x64 para Arm64EC, a carga de trabalho resultante recebe a maior melhoria para a menor quantidade de esforço em cada etapa do caminho.

Dependências de aplicativo

Ao usar o Arm64EC para recompilar um aplicativo, você desejará usar versões Arm64EC de dependências, mas também poderá contar com versões x64 de dependências. As versões Arm64 de dependências não serão utilizáveis.

Qualquer código x64, incluindo código de dependências, em um processo Arm64EC será executado em emulação em seu aplicativo. Priorizar as dependências com uso mais intensivo de CPU para fazer a transição de x64 para Arm64EC terá o maior impacto para melhorar o desempenho do aplicativo.

Identificar binários e aplicativos Arm64EC

Os aplicativos em execução no Windows 11 no Arm interagirão com binários arm64EC como se fossem binários x64. O aplicativo não precisa saber até que ponto o código no binário foi recompilado como Arm64EC. 

Para desenvolvedores interessados em identificar esses binários, você pode vê-los em um prompt de comando do desenvolvedor usando link /dump /headers.

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

A combinação de (x64) e (ARM64X) indica que alguma parte do binário foi recompilada como Arm64EC, mesmo que o binário ainda pareça ser x64. Um binário com um cabeçalho de computador que contém (ARM64) e (ARM64X) é um arquivo PE Arm64X que pode ser carregado em aplicativos x64 e Arm64.

O Gerenciador de Tarefas do Windows também pode ser usado para identificar se um aplicativo foi compilado como Arm64EC. Na guia Detalhes do Gerenciador de tarefas, a coluna Arquitetura mostrará ARM64 (compatível com x64) para aplicativos cujo main executável foi parcial ou completamente compilado como Arm64EC.

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

Próximas etapas

Consulte Get started with Arm64EC para saber como criar ou atualizar aplicativos Win32 usando o Arm64EC.