広告を閉じる

マイク・アッシュ 彼のブログに捧げた iPhone 64S で 5 ビット アーキテクチャに切り替えることの実際的な影響。この記事は彼の発見に基づいています。

この文章の主な理由は、5 ビット ARM プロセッサを搭載した新しい iPhone 64s がユーザーと市場にとって実際に何を意味するかについて、大量の誤った情報が広まっているためです。ここでは、パフォーマンス、機能、およびこの移行が開発者に与える影響についての客観的な情報を提供しようとします。

「64ビット」

「X ビット」ラベルが参照できるプロセッサの部分は 7 つあります。それは、整数レジスタの幅とポインタの幅です。幸いなことに、最新のプロセッサではこれらの幅は同じであるため、A64 の場合、これは 64 ビット整数レジスタと XNUMX ビット ポインタを意味します。

ただし、「64 ビット」が何を意味しないのかを指摘することも同様に重要です。 RAMの物理アドレスサイズ。 RAM と通信するビット数 (つまり、デバイスがサポートできる RAM の量) は、CPU ビット数とは関係ありません。 ARM プロセッサには 26 ~ 40 ビットのアドレスがあり、システムの他の部分とは独立して変更できます。

  • データバスサイズ。 RAM またはバッファ メモリから受信したデータの量も同様に、この要因には依存しません。個々のプロセッサ命令は異なる量のデータを要求する場合がありますが、それらはチャンクで送信されるか、必要以上にメモリから受信されます。それはデータ量子のサイズによって異なります。 iPhone 5 はすでに 64 ビット量子でメモリからデータを受信して​​おり (32 ビット プロセッサを搭載しています)、最大 192 ビットのサイズに遭遇する可能性があります。
  • 浮動小数点に関するものなら何でも。このようなレジスタ (FPU) のサイズも、プロセッサの内部動作には依存しません。 ARM は、ARM64 (64 ビット ARM プロセッサ) が登場する前から 64 ビット FPU を使用してきました。

一般的なメリットとデメリット

それ以外は同一の 32 ビット アーキテクチャと 64 ビット アーキテクチャを比較すると、通常はそれほど違いはありません。これは、Apple がモバイル デバイスでも 64 ビットに移行する理由を探している一般の人々が混乱している理由の 7 つです。ただし、それはすべて、プロセッサーが 64 ビット アーキテクチャであるという事実だけではなく、A64 (ARMXNUMX) プロセッサーの特定のパラメーターと Apple の使用方法によって決まります。

ただし、これら 64 つのアーキテクチャの違いに注目すると、いくつかの違いが見つかるでしょう。明らかなことは、64 ビット整数レジスタは 32 ビット整数をより効率的に処理できることです。以前でも、32 ビット プロセッサ上でそれらを操作することは可能でしたが、これは通常、それらを 64 ビット長の部分に分割することを意味し、計算が遅くなります。したがって、64 ビット プロセッサは通常、32 ビット型でも 64 ビット型と同じくらい高速に計算できます。これは、一般に 64 ビット型を使用するアプリケーションが XNUMX ビット プロセッサ上でより高速に実行できることを意味します。

64 ビットはプロセッサが使用できる RAM の総量には影響しませんが、32 つのプログラムで大きな RAM チャンクを操作しやすくなります。 4 ビット プロセッサ上で実行される単一のプログラムには、約 1 GB のアドレス空間しかありません。オペレーティング システムと標準ライブラリが何かを使用することを考慮すると、プログラムにはアプリケーション用に 3 ~ 32 GB の空き領域が残ります。ただし、4 ビット システムに 4 GB を超える RAM が搭載されている場合、そのメモリの使用は少し複雑になります。オペレーティング システムにこれらのより大きなメモリ チャンクをプログラムにマップさせる (メモリ仮想化) か、プログラムを複数のプロセスに分割する (理論的には、各プロセスには直接アドレス指定に使用できる XNUMXGB のメモリがある) という手段に頼る必要があります。

ただし、これらの「ハッキング」は非常に難しく、時間がかかるため、最小限のアプリケーションで使用されています。実際には、32 ビット プロセッサでは、各プログラムは 1 ~ 3 GB のメモリのみを使用し、より多くの利用可能な RAM を使用して複数のプログラムを同時に実行したり、このメモリをバッファ (キャッシュ) として使用したりできます。これらの使用法は実用的ですが、どのプログラムでも 4GB を超えるメモリ チャンクを簡単に使用できるようにしたいと考えています。

ここで、4GB を超えるメモリがなければ 64 ビット アーキテクチャは役に立たないという、よくある (実際には間違った) 主張にたどり着きます。アドレス空間が大きいと、メモリが少ないシステムでも役立ちます。メモリ マップト ファイルは、ファイル全体をメモリにロードすることなく、ファイルの内容の一部をプロセスのメモリに論理的にリンクする便利なツールです。したがって、システムは、たとえば、RAM 容量の何倍も大きい大きなファイルを徐々に処理できます。 32 ビット システムでは、このような大きなファイルを確実にメモリ マップすることはできませんが、64 ビット システムでは、アドレス空間がはるかに大きいため、これは簡単です。

ただし、ポインタのサイズが大きくなると、64 つの大きな欠点も生じます。そうでないと、同じプログラムが 64 ビット プロセッサでより多くのメモリを必要とすることになります (これらの大きなポインタはどこかに保存する必要があります)。ポインタはプログラムの一部として頻繁に使用されるため、この違いによりキャッシュに負担がかかり、システム全体の動作が遅くなる可能性があります。したがって、全体的に見て、プロセッサ アーキテクチャを XNUMX ビットに変更しただけでは、実際にはシステム全体の速度が低下することがわかります。したがって、この要素は他の場所でさらに最適化することによってバランスを取る必要があります。

ARM64

新しい iPhone 7s に搭載されている 64 ビット プロセッサである A5 は、より広いレジスタを備えた単なる通常の ARM プロセッサではありません。 ARM64 には、古い 32 ビット バージョンに比べて大幅な改良が加えられています。

Apple A7プロセッサ。

レジストリ

ARM64 は 32 ビット ARM の 64 倍の整数レジスタを保持します (レジスタの数と幅を混同しないように注意してください。幅については「64 ビット」セクションで説明しました。したがって、ARM32 には 16 倍の幅と 13 倍のレジスタ数の両方があります)レジスタ)。 64 ビット ARM には 32 個の整数レジスタがあります: 28 つのプログラム カウンター (PC - 現在の命令の番号が含まれます)、スタック ポインター (進行中の関数へのポインター)、リンク レジスタ (終了後の戻りへのポインター)の関数)、残りの 32 はアプリケーション用です。ただし、ARM64 には、16 つのゼロ レジスタ、リンク レジスタ、フレーム ポインタ (スタック ポインタに類似)、および将来のために予約されている 32 つを含む 128 の整数レジスタがあります。これにより、アプリケーション用に XNUMX 個のレジスタが残り、これは XNUMX ビット ARM の XNUMX 倍以上になります。同時に、ARMXNUMX は浮動小数点数 (FPU) レジスタの数を XNUMX 個から XNUMX 個の XNUMX ビット レジスタに倍増しました。

しかし、なぜレジスタの数がそれほど重要なのでしょうか?メモリは一般に CPU の計算よりも遅く、読み取り/書き込みに非常に時間がかかることがあります。これにより、高速プロセッサがメモリを待機し続ける必要が生じ、システムの自然な速度制限に達してしまいます。プロセッサーはこのハンディキャップをバッファーの層で隠そうとしますが、最速のバッファー (L1) であってもプロセッサーの計算よりも遅いことに変わりはありません。ただし、レジスタはプロセッサ内に直接あるメモリ セルであり、その読み取り/書き込みはプロセッサの速度を低下させるほど十分に高速です。レジスタの数は実際には、プロセッサの計算に使用される最速のメモリの量を意味し、システム全体の速度に大きく影響します。

同時に、この速度には、言語がこれらのレジスタを使用でき、一般的なアプリケーション (遅い) メモリにすべてを保存する必要がないように、コンパイラによる優れた最適化サポートが必要です。

指図書

ARM64 では、命令セットにも大きな変更が加えられています。命令セットは、プロセッサが実行できるアトミック操作のセットです (たとえば、「ADD register1 register2」は XNUMX つのレジスタの数値を加算します)。それぞれの言語で利用できる機能はこれらの命令で構成されています。より複雑な関数はより多くの命令を実行する必要があるため、速度が遅くなる可能性があります。

ARM64 の新機能は、AES 暗号化、SHA-1 および SHA-256 ハッシュ関数の命令です。したがって、複雑な実装の代わりに、言語のみがこの命令を呼び出します。これにより、そのような関数の計算が大幅に高速化され、アプリケーションのセキュリティが強化されることが期待されます。例えば。新しい Touch ID は暗号化にもこれらの命令を使用し、実際の速度とセキュリティを実現します (理論的には、攻撃者はデータにアクセスするためにプロセッサ自体を変更する必要がありますが、その小型サイズを考えると、控えめに言っても非現実的です)。

32bitとの互換性

A7 はエミュレーションを必要とせずに 32 ビット モードで完全に実行できることに言及することが重要です。これは、新しい iPhone 5s が 32 ビット ARM でコンパイルされたアプリケーションを速度を低下させることなく実行できることを意味します。ただし、その場合は新しい ARM64 機能を使用できなくなるため、A7 専用の特別なビルドを作成することは常に価値があり、より高速に実行できるはずです。

ランタイムの変更点

ランタイムは、プログラミング言語に機能を追加するコードであり、アプリケーションの実行中、翻訳後まで使用できます。 Apple はアプリケーションの互換性 (64 ビットのバイナリが 32 ビットで実行される) を維持する必要がないため、Objective-C 言語にさらにいくつかの改良を加える余裕がありました。

そのうちの 1 つは、いわゆる タグ付きポインタ (マークされたインジケーター)。通常、オブジェクトとそれらのオブジェクトへのポインタは、メモリの別個の部分に格納されます。ただし、新しいポインター型を使用すると、データの少ないクラスがオブジェクトをポインターに直接格納できるようになります。この手順により、オブジェクトに直接メモリを割り当てる必要がなくなり、ポインターとその中にオブジェクトを作成するだけで済みます。タグ付きポインタは 64 ビット アーキテクチャでのみサポートされています。これは、32 ビット ポインタには十分な有用なデータを格納するための十分な領域がなくなっているためです。したがって、OS X とは異なり、iOS はまだこの機能をサポートしていませんでした。しかし、ARM64 の登場により状況は変わりつつあり、この点でも iOS は OS X に追いつきました。

ポインタの長さは 64 ビットですが、ARM64 ではポインタ自体のアドレスに 33 ビットのみが使用されます。そして、残りのポインター ビットを確実にマスク解除できれば、前述のタグ付きポインターの場合と同様に、このスペースを使用して追加データを保存できます。概念的には、これは Objective-C の歴史の中で最大の変更の XNUMX つですが、市場性のある機能ではありません。したがって、ほとんどのユーザーは、Apple が Objective-C をどのように前進させようとしているのか知りません。

このようなタグ付きポインターの残りのスペースに保存できる有用なデータに関しては、たとえば Objective-C は現在、いわゆるデータを保存するためにそれを使用しています。 参照カウント (参照の数)。以前は、参照カウントはメモリ内の別の場所、つまりそのために用意されたハッシュ テーブルに保存されていましたが、これにより、多数の alloc/dealloc/retain/release 呼び出しが発生した場合にシステム全体の速度が低下する可能性がありました。スレッド セーフのためにテーブルをロックする必要があったため、2 つのスレッド内の 2 つのオブジェクトの参照カウントを同時に変更できませんでした。ただし、この値は、いわゆる残りの部分に新たに挿入されます。 ISA インジケーター。これも目立たないものの、将来的には大きな利点と加速になります。ただし、これは 32 ビット アーキテクチャでは決して実現できません。

オブジェクトへのポインタの残りの部分には、関連するオブジェクトに関する情報、そのオブジェクトが弱参照であるかどうか、そのオブジェクトのデストラクタを生成する必要があるかどうかなどの情報も新たに挿入されます。 runtime はランタイムを根本的に高速化することができ、それが各アプリケーションの速度に反映されます。テストによると、これはすべてのメモリ管理呼び出しの約 40 ~ 50% の高速化を意味します。 64 ビット ポインターに切り替えて、この新しいスペースを使用するだけです。

結論

競合他社は 64 ビット アーキテクチャへの移行は不要であるという考えを広めようとしますが、これが単なる非常に無知な意見であることはすでにご存知でしょう。確かに、言​​語やアプリケーションを 64 ビットに適応させずに 7 ビットに切り替えるだけでは、実際には何の意味もありません。システム全体の速度が低下することさえあります。しかし、新しい A64 は新しい命令セットを備えた最新の ARMXNUMX を使用しており、Apple は Objective-C 言語全体を最新化し、新しい機能を活用することに苦労しました。したがって、高速化が約束されています。

ここでは、64 ビット アーキテクチャが正しい前進である理由を多数述べてきました。これは「内部」でのもう一つの革命であり、そのおかげで Apple は、デザイン、ユーザー インターフェイス、充実したエコシステムだけでなく、主に市場の最新テクノロジーでも最前線に留まろうと努めることになります。

ズドルイ: mikeash.com
.