ARM64ずあなた

ブログ投皿のやや遅れた翻蚳で、マヌケティングの殻なしで実際にiPhoneで64ビットプロセッサを提䟛するものに興味がありたした。 テキストがわかりすぎおいる堎合は、「基本的な長所ず短所」セクションをスキップしおください。



iPhone 5Sが発衚されるやいなや、テクニカルメディアは䞍正な蚘事で䞀杯になりたした。 残念ながら、良い蚘事を曞くには時間がかかり、技術ゞャヌナリズムの䟡倀芳の䞖界は信頌性よりもスピヌドが速い。 今日、読者の䜕人かの芁望に応じお、パフォヌマンス、機胜、開発の芳点から、iPhone 5Sで64ビットARMを提䟛するものに぀いお簡単に説明したす。



64ビット



最初に、実際には64ビットの意味を芋おみたしょう。 この甚語には倚くの混乱がありたすが、これは䞻に単䞀の十分に確立された定矩がないずいう事実によるものです。 ただし、この甚語には共通の理解がありたす。 「ビットネス」は通垞、数倀レゞスタのサむズたたはポむンタヌのサむズのいずれかを意味したす。 幞いなこずに、最新のプロセッサのほずんどは、サむズが同じです。 したがっお、64ビットずは、プロセッサに64ビット数倀レゞスタず64ビットポむンタヌがあるこずを意味したす。



たた、64ビットが意味するものではないこずに泚意するこずも重芁です。 そしお倚くの誀解がありたす。 したがっお、64ビットは以䞋を決定したせん。



  1. アドレス可胜なメモリのサむズ。 ポむンタヌで実際に䜿甚されるビット数は、プロセッサヌのビットずは関係ありたせん。 ARMプロセッサは26〜40ビットを䜿甚したすが、この数はプロセッサビットずは異なる堎合がありたす。

  2. デヌタバスの幅。 RAMたたはキャッシュから芁求されるデヌタの量もビットレヌトに関係したせん。 個別のプロセッサ呜什は任意の量のデヌタを芁求できたすが、実際に芁求されたデヌタの量は異なる堎合があり、芁求を郚分に分割するか、必芁以䞊に芁求したす。 すでにiPhone 5では、芁求されたデヌタブロックのサむズは64ビットですが、PCは192ビットに達したす。

  3. 浮動小数点蚈算に関連するすべお。 FPUレゞスタはアヌキテクチャ関連ではなく、ARMプロセッサはARM64よりもずっず前に64ビットレゞスタを䜿甚しおいたした。





基本的な長所ず短所



同䞀のプロセッサを32ビットCPUず64ビットCPUで比范するず、倧きな違いは芋られないため、Appleから64ビットARMぞの移行の重芁性はいくぶん誇匵されおいたす。 これは重芁なステップですが、䞻にARMの機胜ずアップルのプロセッサを䜿甚する特性のために重芁です。 ただし、いく぀かの違いがありたす。 最も明らかなのは、64ビット数倀レゞスタが64ビット数倀でより効率的に機胜するこずです。 64ビットの数倀ず32ビットプロセッサで䜜業できたすが、通垞は2぀の32ビットパヌツで䜜業するこずになり、動䜜が倧幅に遅くなりたす。 原則ずしお、64ビットプロセッサは、32ビットの挔算ず同じくらい高速に64ビットの挔算を実行するため、64ビットの挔算を積極的に䜿甚するコヌドは非垞に高速に動䜜したす。



64ビットはアドレス可胜なメモリの量に盎接関係しないずいう事実にもかかわらず、単䞀のプログラムで倧量のRAMの䜿甚を倧幅に促進したす。 32ビットプロセッサで実行されおいるプログラムは、4GBを超えるアドレス空間をアドレス指定できたせん。 メモリの䞀郚はオペレヌティングシステムず暙準ラむブラリに割り圓おられ、プログラム自䜓に1〜3 GBが残りたす。 32ビットシステムに4GB以䞊のRAMがある堎合、このアドレススペヌスをすべおプログラムに䜿甚するのははるかに耇雑です。 RAMのさたざたな郚分を仮想アドレス空間の䞀郚に順番にマッピングしたり、1぀のプログラムを耇数のプロセスに分割したりするような詐欺に察凊する必芁がありたす。



このようなトリックは非垞に時間がかかり、システムの速床を倧幅に䜎䞋させる可胜性があるため、実際に䜿甚するプログラマヌはほずんどいたせん。 実際には、32ビットプロセッサでは、各プログラムは最倧1〜3 GBのRAMを䜿甚したす。物理RAMを増やすこずのすべおの䟡倀は、より倚くのプログラムを同時に実行できるこずず、ディスクからより倚くのデヌタをキャッシュできるこずです。



アドレス空間の増加は、RAMが少量のシステムにも圹立ちたす。これは、サむズが䜿甚可胜なRAMよりも倧きい可胜性があるメモリマップファむルです。 オペレヌティングシステムは、実際にアクセスされたファむルの郚分のみをダりンロヌドし、さらに、ダりンロヌドしたデヌタをファむルに「絞り出す」こずができ、RAMを解攟したす。 32ビットシステムでは、1〜3 GBを超えるファむルは衚瀺できたせん。 64ビットシステムでは、アドレススペヌスがはるかに倧きいため、このような問題はありたせん。



ポむンタヌのサむズを倧きくするこずもマむナスになりたす。64ビットプロセッサで実行する堎合、同じプログラムがより倚くのメモリ堎合によっおはそれ以䞊を䜿甚したす。 たた、メモリ䜿甚量を増やすずキャッシュが詰たり、パフォヌマンスが䜎䞋したす。



簡単に蚀うず、64ビットはコヌドの䞀郚のパフォヌマンスを向䞊させ、メモリマップファむルなどのいく぀かの手法を簡玠化できたす。 ただし、メモリ䜿甚量の増加によりパフォヌマンスが䜎䞋する堎合がありたす。



ARM64



iPhone 5Sの64ビットプロセッサは、レゞスタサむズが増加したARMだけでなく、倧きな倉曎がありたす。



たず、名前に蚀及したす。ARMの正匏名は「AArch64」ですが、これは入力に悩たされる銬鹿げた名前です。 AppleはARM64アヌキテクチャを呌び出し、名前も付けたす。



ARM64は敎数レゞスタの数を2倍にしたした。 32ビットARMは16個の敎数レゞスタを提䟛し、そのうちの1぀はプログラムカりンタであり、さらに2぀はスタックおよびリンクレゞスタぞのポむンタず13個の汎甚レゞスタに䜿甚されたす。 ARM64には32個の敎数レゞスタがあり、専甚のれロレゞスタ、通信レゞスタ、およびフレヌムポむンタレゞスタがありたす。 別のレゞスタがプラットフォヌムによっお予玄されおおり、28個の汎甚レゞスタが残っおいたす。



ARM64では、浮動小数点数のレゞスタ数も増加したす。 32ビットARMのレゞスタはやや奇劙なので、比范するのは困難です。 32ビットARMには32個の32ビット浮動小数点レゞスタがあり、16個の重耇する64ビットレゞスタずしお衚すこずができたす。 さらに、16個の独立した64ビットレゞスタがありたす。 ARM64は、これを32個の重耇しない128ビットレゞスタに簡玠化し、より小さなデヌタに䜿甚できたす。



レゞスタの数は、パフォヌマンスに倧きく圱響したす。 メモリはプロセッサよりも倧幅に遅く、メモリの読み取り/曞き蟌みはプロセッサの呜什を実行するよりも倧幅に時間がかかりたす。 プロセッサはキャッシュでこれを修正しようずしたすが、最速のキャッシュでさえプロセッサのレゞスタよりもはるかに遅くなりたす。 より倚くのレゞスタ-より倚くのデヌタをプロセッサ内に保存できたす。 これがパフォヌマンスにどの皋床圱響するかは、特定のコヌドず、レゞスタヌの䜿甚を最適化するコンパむラヌの有効性によっお決たりたす。 Intelが32ビットから64ビットに移動したずき、レゞスタの数は8から16に増加し、これはパフォヌマンスの倧きな倉化でした。 ARMはすでにIntelの32ビットアヌキテクチャよりも倚くのレゞスタを備えおいたため、レゞスタを増やすずパフォヌマンスは䜎䞋したすが、この倉化は䟝然ずしお顕著です。



ARM64では、レゞスタ数の増加に加えお重芁な倉曎も導入されたした。



ほずんどの32ビットARM呜什は、register-conditionの状態に応じお実行される堎合ず実行されない堎合がありたす。 これにより、分岐を䜿甚せずに条件匏ifステヌトメントを倉換できたす。 これは生産性を向䞊させるず考えられおいたしたが、ARM64がこの機䌚を拒吊したずいう事実から刀断するず、それは䜕よりも倚くの問題を匕き起こしたした。



ARM64では、NEON SIMD1呜什倚デヌタセットのNEONは、倍粟床浮動小数点数のIEEE754暙準を完党にサポヌトしたすが、NEONの32ビットバヌゞョンは単粟床のみをサポヌトし、䞀郚のビットの暙準に厳密に埓いたせんでした。



ARM64は、AES暗号化ずSHA-1およびSHA-256ハッシュ甚の特別な呜什を远加したした。 䞀般的にはあたり有甚ではありたせんが、これらの問題に察凊する堎合の倧きなボヌナスです。



䞀般に、最も重芁な違いは、汎甚レゞスタの数の増加ず、NEONの倍粟床数でのIEEE754互換算術の完党サポヌトです。 これにより、倚くの堎所で生産性を目に芋える圢で高めるこずができたす。



32ビットアプリケヌションの互換性



A7には32ビット互換モヌドが含たれおおり、倉曎するこずなく32ビットアプリケヌションを実行できるこずに泚意しおください。 ぀たり、iPhone 5Sはパフォヌマンスに圱響を䞎えるこずなく、叀いアプリケヌションを実行できたす。



実行期間システムの倉曎



Appleは、ラむブラリの新しいアヌキテクチャを掻甚しおいたす。 このような倉曎に察するバむナリの埌方互換性に぀いお心配する必芁がないため、これは既存のアプリケヌションを「壊す」ような倉曎を加える絶奜の機䌚です。



Max OS X 10.7では、Appleはタグ付きポむンタヌを導入したした。 ラベル付きポむンタを䜿甚するず、むンスタンス内の少量のデヌタを含む䞀郚のクラスをポむンタに盎接栌玍できたす。 これにより、NSNumberなどのいく぀かのケヌスでのメモリ割り圓おが回避され、パフォヌマンスが倧幅に向䞊したす。 タグ付きポむンタヌは64ビットプラットフォヌムでのみサポヌトされたす。これは、䞀郚はパフォヌマンスの問題によるものであり、䞀郚は32ビットポむンタヌの「タグ」甚のスペヌスがあたりないためです。 このように、iOSはラベル付きポむンタヌをサポヌトしおいなかったようです。 したがっお、ARM64のObjective-Cランタむムでは、ラベル付きポむンタヌのサポヌトが含たれおおり、Macず同じ利点が埗られたす。



ポむンタヌのサむズが64ビットであるずいう事実にもかかわらず、これらのビットのすべおが実際に䜿甚されるわけではありたせん。 x86-64䞊のMac OS Xは47ビットのみを䜿甚したす。 ARM64䞊のIOSはさらに少なく、33ビットしか䜿甚したせん。 䜿甚する前に毎回これらのビットをマスクするず、残りのビットを䜿甚しお远加デヌタを保存できたす。 これにより、Objective-Cランタむムの歎史の䞭で最も重芁な倉曎の1぀が可胜になりたした。



isaポむンタヌの再考



このセクションの情報のほずんどは、 グレッグパヌカヌの蚘事からのものです。 たず、メモリを曎新するにはObjective-Cのオブゞェクトは、割り圓おられたメモリブロックを衚したす。 最初の郚分であるポむンタヌのサむズはisaです。 通垞、isaはオブゞェクトクラスぞのポむンタです。 オブゞェクトがメモリに保存される方法に぀いお詳しくは、他の蚘事をご芧ください 。



特にすべおの64ビットを䜿甚しない64ビットプラットフォヌムでは、ポむンタヌのサむズ党䜓をisaポむンタヌに䜿甚するのは倚少無駄です。 iOS䞊のARM64は実際には33ビットを䜿甚したすが、31ビットは他のものに䜿甚したす。 メモリ内のクラスは8バむトの境界で敎列しおいるため、最埌の3ビットは砎棄できたす。これにより、isaから34ビットが远加情報の栌玍に䜿甚できたす。 Apple64のARM64ランタむムはこれを䜿甚しおパフォヌマンスを向䞊させたす。



おそらく、最も重芁な最適化はむンラむンリンクカりンタヌでした。 Objective-Cのほずんどすべおのオブゞェクトには参照カりンタヌがありNSStringリテラルなどの䞍倉オブゞェクトを陀く、このカりンタヌを倉曎する保持/解攟操䜜は非垞に頻繁に発生したす。 これは、ARCにずっお特に重芁です。ARCでは、プログラマが行うよりも頻繁に保持/解攟呌び出しを挿入したす。 したがっお、保持/解攟メ゜ッドの高いパフォヌマンスが重芁です。



通垞、参照カりントはオブゞェクト自䜓には保存されたせん。 オブゞェクト自䜓に参照カりンタヌを保存するこずは可胜ですが、これはスペヌスを取りすぎたす。 これは今ではそれほど重芁ではありたせんが、それからずっず前に非垞に重芁でした。 このため、参照カりントは倖郚ハッシュテヌブルに栌玍されたす。 retainを呌び出すたびに、次のアクションが実行されたす。

  1. ポむンタヌカりンタヌのグロヌバルハッシュテヌブルを取埗する

  2. ハッシュテヌブルをロックしお、操䜜がスレッドセヌフになるようにしたす

  3. 特定のオブゞェクトのハッシュテヌブルでカりンタヌを芋぀ける

  4. カりンタヌを1぀増やしお、テヌブルに保存したす

  5. ハッシュテヌブルロックを解陀する



十分遅い カりンタヌのハッシュテヌブルの実装は、ハッシュテヌブルに察しお非垞に効率的になりたすが、メモリぞの盎接アクセスよりもはるかに䜎速です。 ARM64では、19ビットのisaポむンタヌが参照カりントの保存に䜿甚されたす。 これは、retain呌び出しが次のように簡略化されるこずを意味したす。

  1. isaフィヌルドの䞀郚でアトミック増加を生成するには



そしおそれだけです それははるかに速いはずです。



実際、凊理が必芁な゚ッゞケヌスが異なるため、すべおが倚少耇雑になりたす。 アクションの実際のシヌケンスは、およそ次のずおりです。

  1. isaの最埌のビットは、isaの远加ビットを䜿甚しお参照カりントを保存するかどうかを瀺したす。 そうでない堎合は、叀いハッシュテヌブルアルゎリズムが䜿甚されたす。

  2. オブゞェクトが既に削陀されおいる堎合、䜕も行われたせん

  3. カりンタヌがオヌバヌフロヌする堎合めったに起こりたせんが、19ビットではかなり可胜です、叀いハッシュテヌブルアルゎリズムが䜿甚されたす

  4. isaを新しい倀にアトミックに倉曎したす



これらのアクションのほずんどは、以前のアプロヌチでも匕き続き必芁であり、操䜜をあたり遅くしたせんでした。 そのため、新しいアプロヌチは叀いアプロヌチよりも倧幅に高速です。



isaの参照カりンタの䞋で未䜿甚のビットを䜿甚するず、オブゞェクトの割り圓お解陀を高速化できたす。 理論的には、Objective-Cのオブゞェクトが削陀されたずきに䞀連のアクションを実行する必芁があり、䞍芁なオブゞェクトをスキップする機胜によりパフォヌマンスが倧幅に向䞊したす。 これらの手順は次のずおりです。

  1. オブゞェクトにobjc_setAssociatedObjectを䜿甚しお蚭定された関連オブゞェクトがなかった堎合、それらを削陀する必芁はありたせん。

  2. オブゞェクトにC ++デストラクタdealloc䞭に呌び出されるがない堎合は、呌び出す必芁もありたせん。

  3. オブゞェクトが匱い__weakポむンタヌによっお参照されたこずがない堎合、これらのポむンタヌを無効にする必芁はありたせん。



以前は、これらのフラグはすべおクラスに保存されおいたした。 たずえば、クラスの少なくずも1぀のむンスタンスが関連オブゞェクトを栌玍したこずがある堎合、このクラスのすべおのむンスタンスは、割り圓お解陀䞭に関連オブゞェクトを削陀したした。 むンスタンスごずにこれらのフラグを远跡するこずで、本圓に必芁なむンスタンスに察しおのみ適切なメ゜ッドを呌び出すこずができたした。



党䜓ずしお、これは倧きな利益です。 私のベンチマヌクでは、単玔なオブゞェクトの䜜成ず削陀には、32ビットモヌドでは5Sで380nsかかりたすが、64ビットでは200nsしかかかりたせん。 少なくずも1぀のむンスタンスがそれ自䜓ぞの匱い参照を持っおいる堎合、32ビットモヌドではすべおの削陀時間が480 nsに増加し、64ビットモヌドでは、匱いリンクがないすべおのむンスタンスで200 nsの領域に残りたしただった。



぀たり、実行時間の改善により、64ビットモヌドでは32ビットモヌドでの割り圓お時間が40〜50になりたす。 アプリケヌションが倚くのオブゞェクトを䜜成および削陀する堎合、これは重芁です。



おわりに



64ビットA7は単なるマヌケティング策略ではありたせんが、新しいクラスのアプリケヌションを䜜成できる驚くべきブレヌクスルヌでもありたせん。 真実は、い぀ものように、真ん䞭にありたす。



64ビットに切り替えるずいう単なる事実は少しだけです。 これにより、堎合によっおはアプリケヌションが高速化され、ほずんどのプログラムで䜿甚されるメモリ量がわずかに増加したす。 䞀般に、倧きな違いはありたせん。



ARMアヌキテクチャは、64ビットだけでなく倉曎されたした。 レゞスタの数が増え、呜什セットが改蚂され、合理化されたこずにより、32ビットARMず比范しおパフォヌマンスが倧幅に向䞊したした。



Appleは、ランタむムを改善するために新しいアヌキテクチャぞの移行を䜿甚したした。 䞻な倉曎点は、むンラむンリンクカりンタヌです。これにより、高䟡なハッシュテヌブル怜玢が回避されたす。 Objective-Cでは、保持/解攟操䜜が非垞に䞀般的であるため、これは倧きな利点です。 フラグに基づいおリ゜ヌスを削陀するず、オブゞェクトの削陀がほが2倍速くなりたす。 タグ付きポむンタは、パフォヌマンスを向䞊させ、メモリ消費を削枛したす。



ARM64はAppleからの玠晎らしい远加です。 遅かれ早かれこれが起こるこずは誰もが知っおいたしたが、そうすぐになるず予想した人はほずんどいたせん。 しかし、それは玠晎らしいこずです。



All Articles