[アーティクル] 2024/01/17
4 人の共同作成者
フィードバック
この記事の内容
相互運用性
Arm64EC を使用して、Arm 上の Windows 11 で既存のアプリをより高速にする
アプリ間の依存関係
Arm64EC バイナリとアプリの識別
次のステップ
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 を使用すると、既存のアプリのコードをエミュレートからネイティブに段階的に 移行できます。 途中の各ステップで、アプリケーションは一度に再コンパイルする必要なく、引き続き正常に実行されます。
上の図は、完全にエミュレートされてある程度時間がかかっていた x64 ワークロードが、Arm64EC を使用して段階的に改善される例を簡略化して示しています。
完全にエミュレートされた x64 ワークロードとして開始
CPU 負荷の高い部分を Arm64EC として再コンパイルした後
時間の経過とともに x64 モジュールを引き続き再コンパイルした後
完全ネイティブ Arm64EC アプリの終了結果
途中の各段階で、最も時間がかかるモジュール、つまり CPU 負荷が最も高いモジュールを x64 から Arm64EC に再コンパイルすることで、結果として得られるワークロードについて、最小限の労力で最大限の改善が得られます。
Arm64EC を使用してアプリケーションをリビルドする場合は、Arm64EC バージョンの依存関係を使用しますが、x64 バージョンの依存関係に依拠することもできます。 Arm64 バージョンの依存関係は使用できません。
依存関係からのコードを含む、Arm64EC プロセスの x64 コードは、アプリのエミュレーションで実行されます。 x64 から Arm64EC に移行する際に最も CPU 負荷の高い依存関係を優先させると、アプリのパフォーマンスが最も向上します。
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 互換) と表示されます。
Arm64EC を使用して Win32 アプリをビルドまたは更新する方法については、「Arm64EC の概要 」を参照してください。