Arm64EC – Criar e portar aplicativos para desempenho nativo no Arm

O Arm64EC ("Compatível com Emulação") permite que você crie novos aplicativos nativos ou faça a transição incremental de aplicativos x64 existentes para aproveitar a velocidade e o desempenho nativos possíveis com dispositivos movidos pelo Arm, incluindo melhor consumo de energia, duração da bateria e cargas de trabalho aceleradas do AI & ML.

Arm64EC é uma nova ABI (interface binária do aplicativo) para aplicativos em execução em dispositivos Arm com Windows 11. É um recurso 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 criado como Arm64EC é interoperável com o código x64 em execução em emulação dentro do mesmo processo. O código Arm64EC no processo é executado com desempenho nativo, enquanto qualquer código x64 é executado usando emulação que vem interno com Windows 11. Mesmo que seu aplicativo dependa de dependências ou plug-ins existentes que ainda não dão suporte ao Arm, você pode começar a recompilar partes do seu aplicativo como Arm64EC para obter os benefícios do desempenho nativo.

O Arm64EC garante a interoperabilidade com x64 seguindo convenções de software x64, incluindo convenções 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 criado como Arm64, que usa um conjunto diferente de convenções de software.

O Windows 11 no próprio sistema operacional Arm depende muito da interoperabilidade do Arm64EC para habilitar 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 terá sido compilada como Arm64EC, permitindo o desempenho nativo desse 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 processos binário x64 Binário Arm64EC Binário Arm64
x64/Arm64EC
Arm64

✔ = Com suporte, ❌ = Sem suporte

Da mesma forma, em tempo de compilação, binários Arm64EC podem vincular em libs x64 e Arm64EC, enquanto os processos arm64 só podem vincular em libs Arm64.

Arquitetura pe lib x64 Arm64EC lib Arm64 lib
Arm64EC
Arm64

✔ = Com suporte, ❌ = Sem suporte

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

Usar 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 em seu aplicativo existente de emulado para nativo. Em cada etapa ao longo do caminho, seu aplicativo continua a ser executado bem sem a necessidade de ser recompilado de uma só vez.

Grafo de exemplo mostrando efeitos de atualização incrementais no desempenho do Arm usando Arm64EC

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

  1. Começando 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 são os mais intensivos em CPU de x64 para Arm64EC, a carga de trabalho resultante recebe a maior melhoria pela 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 pode contar com versões x64 de dependências. As versões arm64 de dependências não poderão ser 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 mais intensivas em CPU para a transição do x64 para o Arm64EC terá o maior impacto para melhorar o desempenho do aplicativo.

Identificando binários e aplicativos Arm64EC

Os aplicativos em execução em 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 parte do binário foi recompilada como Arm64EC, embora 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 ARM64X PE 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 executável principal foi parcial ou completamente compilado como Arm64EC.

Captura de tela do Gerenciador de Tarefas mostrando ARM64 (compatível com x64) nos detalhes da arquitetura.

Próximas etapas

Consulte Introdução ao Arm64EC para saber como criar ou atualizar aplicativos Win32 usando o Arm64EC.