Arm64EC - 生成和移植应用,以便在 Arm 上实现本机性能

使用 Arm64EC(“仿真兼容”),可以生成新的本机应用或以增量方式转换现有的 x64 应用,以利用由 Arm 提供支持的设备可提供的本机速度和性能,包括降低功耗、延长电池使用寿命以及加速 AI 和 ML 工作负载。

Arm64EC 是一个新的应用程序二进制接口 (ABI),适用于在使用 Windows 11 的 Arm 设备上运行的应用。 它是一项 Windows 11 功能,需要使用 Windows 11 SDK,在基于 Arm 的 Windows 10 中不可用。

互操作性

作为 Arm64EC 而生成的代码与在同一个进程中的仿真环境下运行的 x64 代码进行互操作。 此进程中的 Arm64EC 代码以本机性能运行,而任何 x64 代码都使用 Windows 11 的内置仿真环境运行。 即使应用依赖于尚不支持 Arm 的现有依赖项或插件,也可以开始将应用的某些部分重新生成为 Arm64EC,以获得本机性能的好处。

Arm64EC 遵循以下 x64 软件约定(包括调用约定、堆栈使用、数据结构布局和预处理器定义),以保证与 x64 的互操作性。 不过,Arm64EC 代码与作为 Arm64 而生成的代码不兼容,后者使用一组不同的软件约定。

基于 Arm 的 Windows 11 操作系统本身在很大程度上依赖于 Arm64EC 的互操作性来支持运行 x64 应用程序。 在基于 Arm 的 Windows 11 上运行的 x64 应用所加载的大多数操作系统代码都将编译为 Arm64EC,这样即可为此代码提供本机性能,而无需让应用程序知道。

x64 或 Arm64EC 进程可以加载并调入 x64 和 Arm64EC 二进制文件,而 Arm64 进程只能加载 Arm64 二进制文件。 这两种体系结构都可以加载 Arm64X 二进制文件,因为这些文件包含 x64 和 Arm64 的代码。

流程体系结构 x64 二进制文件 Arm64EC 二进制文件 Arm64 二进制文件
x64/Arm64EC
Arm64

✔ = 支持,❌ = 不支持

同样,当进行生成时,Arm64EC 二进制文件可以链接到 x64 和 Arm64EC 库中,而 Arm64 二进制文件只能链接到 Arm64 库中。

PE 体系结构 x64 库 Arm64EC 库 Arm64 库
Arm64EC
Arm64

✔ = 支持,❌ = 不支持

有关 Arm64EC ABI 如何实现互操作性的更多详细信息,请参阅了解 Arm64EC ABI 和程序集代码

使用 Arm64EC 在基于 Arm 的 Windows 11 上提高现有应用的运行速度

使用 Arm64EC,可以以增量方式将现有应用中的代码从仿真性能转换为本机性能。 在此过程的每个步骤中,应用程序都会继续正常运行,而无需一次性重新编译。

Example graph showing incremental update effects on Arm performance using Arm64EC

上图显示了花费了一点时间进行完全仿真,然后使用 Arm64EC 以增量方式改进的 x64 工作负载的一个简化示例:

  1. 作为一个完全仿真的 x64 工作负载开始
  2. 将大多数 CPU 密集型部件重新编译为 Arm64EC 之后
  3. 在一段时间内继续重新编译更多的 x64 模块之后
  4. 完全本机化的 Arm64EC 应用的最终结果

通过重新编译在从 x64 转换为 Arm64EC 时最耗时或消耗最多 CPU 资源的模块,最终的工作负载将获得最多的改进,因为最大限度减少了此过程的每一步的工作量。

应用依赖项

使用 Arm64EC 重新生成应用程序时,需要使用 Arm64EC 版本的依赖项,但也可以使用 x64 版本的依赖项。 Arm64 版本的依赖项将无法使用。

Arm64EC 进程中的任何 x64 代码(包括来自依赖项的代码)都将在应用中以仿真方式运行。 优先将消耗最多 CPU 资源的依赖项从 x64 转换为 Arm64EC,这样将对提高应用的性能产生最大的影响。

识别 Arm64EC 二进制文件和应用

在基于 Arm 的 Windows 11 上运行的应用将与 Arm64EC 二进制文件进行交互,就像它们是 x64 二进制文件一样。 应用无需知道二进制文件中的代码已重新编译为 Arm64EC 的程度。 

对于希望识别这些二进制文件的开发人员,可以使用 link /dump /headers 在开发人员命令提示符下查看这些文件。

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

(x64) 和 (ARM64X) 的组合表示,尽管二进制文件仍显示为 x64,但二进制文件的某些部分已重新编译为 Arm64EC。 如果一个二进制文件具有包含 (ARM64) 和 (ARM64X) 的计算机标头,而且是一个 Arm64X PE 文件,则可以将其加载到 x64 和 Arm64 应用中。

也可以使用 Windows 任务管理器识别是否已将一个应用编译为 Arm64EC。 在任务管理器的“详细信息”选项卡中,对于主要可执行文件已部分或完全编译为 Arm64EC 的那些应用程序,“体系结构”列将显示“ARM64(x64 兼容)”。

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

后续步骤

请参阅 Arm64EC 入门,以了解如何使用 Arm64EC 生成或更新 Win32 应用。