Arm64EC - Arm でのネイティブ パフォーマンスのためのアプリのビルドと移植

Arm64EC ("エミュレーション互換") により、新しいネイティブ アプリを構築したり、既存の x64 アプリを段階的に移行したりして、より優れた電力消費、バッテリー残量、高速な AI および ML ワークロードなど、Arm 搭載デバイスで可能なネイティブの速度とパフォーマンスを活用できます。

Arm64EC は、Windows 11 の Arm デバイスで実行されているアプリ用の新しいアプリケーション バイナリ インターフェイス (ABI) です。 Windows 11 SDK を使用する必要がある Windows 11 機能であり、Arm 上の Windows 10 では使用できません。

相互運用性

Arm64EC としてビルドされたコードは、同じプロセス内のエミュレーションで実行されている x64 コードと相互運用できます。 プロセス内の Arm64EC コードはネイティブ パフォーマンスで実行され、x64 コードは Windows 11 に組み込まれているエミュレーションを使用して実行されます。 アプリがまだ Arm をサポートしていない既存の依存関係やプラグインに依存している場合でも、アプリの一部を Arm64EC として再構築して、ネイティブ パフォーマンスを活用できます。

Arm64EC は、呼び出し規則、スタック使用法、データ構造レイアウト、プリプロセッサ定義などの x64 ソフトウェア規約に従うことで、x64 との相互運用性を保証します。 ただし、Arm64EC コードは Arm64 としてビルドされたコードと互換性がありません。そのようなコードは、異なるソフトウェア規約のセットを使用しているからです。

Arm 上の Windows 11 オペレーティング システム自体は、x64 アプリケーションの実行を可能にするために、Arm64EC の相互運用性に大きく依存しています。 Arm 上の Windows 11 で実行されている x64 アプリによって読み込まれたほとんどのオペレーティング システム コードは Arm64EC としてコンパイルされており、アプリケーションが関知しなくてもそのコードのネイティブ パフォーマンスが有効になります。

x64 または Arm64EC プロセスでは x64 と Arm64EC の両方のバイナリを読み込んで呼び出すことができますが、Arm64 プロセスでは Arm64 バイナリを読み込むことのみができます。 どちらのアーキテクチャも、x64 と Arm64 の両方のコードを含む Arm64X バイナリを読み込むことができます。

プロセス アーキテクチャ x64 バイナリ Arm64EC バイナリ Arm64 バイナリ
x64/Arm64EC
Arm64

✔ = サポートあり、 ❌ = サポートなし

同様に、ビルド時に、Arm64EC バイナリは x64 と Arm64EC の両方のライブラリをリンクできますが、Arm64 バイナリは Arm64 ライブラリのみをリンクできます。

PE アーキテクチャ x64 lib Arm64EC lib Arm64 lib
Arm64EC
Arm64

✔ = サポートあり、 ❌ = サポートなし

Arm64EC ABI が相互運用性を実現する方法の詳細については、「Arm64EC ABI とアセンブリ コードについて」を参照してください。

Arm64EC を使用して、Arm 上の Windows 11 で既存のアプリをより高速にする

Arm64EC を使用すると、既存のアプリのコードをエミュレートからネイティブに段階的に移行できます。 途中の各ステップで、アプリケーションは一度に再コンパイルする必要なく、引き続き正常に実行されます。

Example graph showing incremental update effects on Arm performance using Arm64EC

上の図は、完全にエミュレートされてある程度時間がかかっていた x64 ワークロードが、Arm64EC を使用して段階的に改善される例を簡略化して示しています。

  1. 完全にエミュレートされた x64 ワークロードとして開始
  2. CPU 負荷の高い部分を Arm64EC として再コンパイルした後
  3. 時間の経過とともに x64 モジュールを引き続き再コンパイルした後
  4. 完全ネイティブ Arm64EC アプリの終了結果

途中の各段階で、最も時間がかかるモジュール、つまり CPU 負荷が最も高いモジュールを x64 から Arm64EC に再コンパイルすることで、結果として得られるワークロードについて、最小限の労力で最大限の改善が得られます。

アプリ間の依存関係

Arm64EC を使用してアプリケーションをリビルドする場合は、Arm64EC バージョンの依存関係を使用しますが、x64 バージョンの依存関係に依拠することもできます。 Arm64 バージョンの依存関係は使用できません。

依存関係からのコードを含む、Arm64EC プロセスの x64 コードは、アプリのエミュレーションで実行されます。 x64 から Arm64EC に移行する際に最も CPU 負荷の高い依存関係を優先させると、アプリのパフォーマンスが最も向上します。

Arm64EC バイナリとアプリの識別

Arm 上の Windows 11 で実行されているアプリは、x64 バイナリであるかのように Arm64EC バイナリとやりとりします。 アプリは、バイナリ内のコードがどの程度 Arm64EC として再コンパイルされたかを把握する必要はありません。 

これらのバイナリの識別に関心がある開発者は、link /dump /headers を使用して開発者コマンド プロンプトで表示できます。

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

(x64) と (ARM64X) の組み合わせは、バイナリがまだ x64 のように見えても、バイナリの一部が Arm64EC として再コンパイルされていることを示します。 (ARM64) と (ARM64X) を含むマシン ヘッダーを含むバイナリは、x64 アプリと Arm64 アプリの両方に読み込むことができる Arm64X PE ファイル です。

Windows タスク マネージャーを使用して、アプリが Arm64EC としてコンパイルされているかどうかを識別することもできます。 タスク マネージャーの [詳細] タブの [アーキテクチャ] 列には、メインの実行可能ファイルが Arm64EC として部分的または完全にコンパイルされたアプリケーションに対して ARM64 (x64 互換) と表示されます。

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

次のステップ

Arm64EC を使用して Win32 アプリをビルドまたは更新する方法については、「Arm64EC の概要」を参照してください。