Arm64EC — создание и перенос приложений для собственной производительности в Arm

Arm64EC ("Совместимая с эмуляцией") позволяет создавать новые собственные приложения или постепенно переходить существующие приложения x64, чтобы воспользоваться преимуществами собственной скорости и производительности, возможной с помощью устройств с поддержкой Arm, включая более эффективное потребление питания, время работы батареи и ускорение рабочих нагрузок ИИ и машинного обучения.

Arm64EC — это новый двоичный интерфейс приложения (ABI) для приложений, работающих на устройствах Arm с Windows 11. Это функция Windows 11, которая требует использования пакета SDK для Windows 11 и недоступна в Windows 10 на Arm.

Совместимость

Код, созданный как Arm64EC, совместим с кодом x64, работающим под эмуляции в рамках того же процесса. Код Arm64EC в процессе выполняется с собственной производительностью, а любой код x64 выполняется с использованием эмуляции, встроенной в Windows 11. Даже если ваше приложение использует существующие зависимости или подключаемые модули, которые еще не поддерживают Arm, вы можете начать перестроение частей приложения как Arm64EC, чтобы получить преимущества собственной производительности.

Arm64EC гарантирует взаимодействие с x64, следуя соглашениям по программному обеспечению x64, включая соглашение о вызовах, использование стека, макет структуры данных и определения препроцессора. Однако код Arm64EC несовместим с кодом, созданным как Arm64, который использует другой набор соглашений о программном обеспечении.

Операционная система Windows 11 в Arm сильно зависит от взаимодействия Arm64EC, чтобы обеспечить выполнение приложений x64. Большинство кода операционной системы, загруженного приложением x64 под управлением Windows 11 в Arm, будет скомпилировано как Arm64EC, что обеспечивает собственную производительность этого кода без знания приложения.

Процесс x64 или Arm64EC может загружать и вызывать двоичные файлы x64 и Arm64EC, а процесс Arm64 может загружать только двоичные файлы Arm64. Обе архитектуры могут загружать двоичные файлы Arm64X, так как они содержат код для x64 и Arm64.

Архитектура процесса Двоичный файл x64 Двоичный файл Arm64EC Двоичный файл Arm64
x64/Arm64EC
Arm64

✔ = поддерживается, ❌ = не поддерживается

Аналогичным образом, во время сборки двоичные файлы Arm64EC могут связываться как в libs x64, так и в arm64EC, в то время как двоичные файлы Arm64 могут ссылаться только в libs Arm64.

Архитектура PE x64 lib Arm64EC lib Arm64 lib
Arm64EC
Arm64

✔ = поддерживается, ❌ = не поддерживается

Дополнительные сведения о том, как ABI Arm64EC обеспечивает взаимодействие, см. в разделе "Общие сведения об ABI Arm64EC" и коде сборки.

Использование Arm64EC для ускорения работы существующего приложения в Windows 11 на Arm

Arm64EC позволяет постепенно перенести код в существующем приложении из эмулированного в собственный. На каждом шаге по пути приложение продолжает работать хорошо без необходимости перекомпилировать все одновременно.

Example graph showing incremental update effects on Arm performance using Arm64EC

На приведенном выше рисунке показан упрощенный пример полностью эмулированной рабочей нагрузки x64, которая занимает некоторое время, которое затем постепенно улучшается с помощью Arm64EC:

  1. Начиная с полностью эмулированной рабочей нагрузки x64
  2. После перекомпилирования наиболее интенсивных частей ЦП в Arm64EC
  3. После продолжения повторной компиляции дополнительных модулей x64 с течением времени
  4. Конечный результат полного собственного приложения Arm64EC

Перекомпилируя модули, которые занимают больше всего времени или являются наиболее интенсивными ЦП от x64 до Arm64EC, результирующая рабочая нагрузка получает наибольшее улучшение для наименьшего количества усилий каждого шага пути.

Зависимости приложений

При использовании Arm64EC для перестроения приложения необходимо использовать версии зависимостей Arm64EC, но можно также использовать версии зависимостей x64. Версии зависимостей Arm64 не будут использоваться.

Любой код x64, включая код из зависимостей, в процессе Arm64EC будет выполняться при эмуляции в приложении. Приоритеты наиболее интенсивных зависимостей ЦП для перехода с x64 на Arm64EC будут иметь наибольшее влияние на улучшение производительности вашего приложения.

Определение двоичных файлов и приложений Arm64EC

Приложения, работающие в Windows 11 в Arm, взаимодействуют с двоичными файлами Arm64EC, как если бы они были двоичными файлами x64. Приложению не нужно знать, в какой степени код в двоичном файле был перекомпилирован как Arm64EC. 

Для разработчиков, заинтересованных в выявлении этих двоичных файлов, их можно увидеть в командной строке разработчика с помощью link /dump /headers.

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

Сочетание (x64) и (ARM64X) указывает, что часть двоичного файла была перекомпилирована как Arm64EC, даже если двоичный файл по-прежнему является x64. Двоичный файл с заголовком компьютера, который содержит (ARM64) и (ARM64X) — это pe-файл Arm64X, который можно загрузить в приложения x64 и Arm64.

Диспетчер задач Windows также можно использовать для определения того, компилируется ли приложение как Arm64EC. На вкладке "Сведения " диспетчера задач столбец "Архитектура " отображает ARM64 (совместимый с x64) для приложений, основной исполняемый файл которого был частично или полностью скомпилирован как Arm64EC.

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

Следующие шаги

См. статью "Начало работы с Arm64EC ", чтобы узнать, как создавать или обновлять приложения Win32 с помощью Arm64EC.