Zavrieť reklamu

Mike Ash sa na svojom blogu venoval praktickým implikáciám prechodu na 64-bitovú architektúru v iPhone 5S. Tento článok čerpá z jeho poznatkov.

Dôvodom tohto textu je prevažne veľké množstvo šíriacich sa dezinformácii o tom, čo v skutočnosti nový iPhone 5s so 64-bitovým ARM procesorom znamená pre užívateľov a trh. Tu sa budeme snažiť priniesť objektívne informácie o výkone, schopnostiach a následkoch tohto prechodu pre vývojárov.

„64 bitov“

V procesore sú dve časti, na ktoré sa označenie „X-bit“ môže vzťahovať – šírka celočíselných registrov a šírka ukazovateľov. Našťastie sú u väčšiny moderných procesorov tieto šírky totožné, v prípade A7 to teda znamená 64-bitové celočíselné registre a 64-bitové ukazovatele.

Nemenej dôležité je však poukázať na to, čo „64bit“ NEznamená: Veľkosť fyzickej adresy RAM. Počet bitov pre komunikáciu s RAM (tým pádom množstvo RAM, ktoré môže zariadenie podporovať) nesúvisí s počtom bitov CPU. ARM procesory majú kdekoľvek medzi 26- a 40-bitovými adresami a je možné ich meniť nezávisle od zvyšku systému.

  • Veľkosť dátovej zbernice. Množstvo dát prijatého od RAM alebo vyrovnávacej pamäte sú podobne na tomto faktore nezávislé. Jednotlivé inštrukcie procesora si môžu vyžiadať rôzne množstvo dát, ale z pamäte sa buď pošlú po častiach, alebo sa ich prijme viac, než je potrebné. Závisí to od veľkosti dátového kvanta. Už iPhone 5 prijíma dáta z pamäte v 64-bitových kvantoch (a má 32-bitový procesor) a môžeme sa stretnúť až s veľkosťami do 192 bitov.
  • Čokoľvek súvisiace s plávajúcou desatinnou čiarkou. Veľkosť takýchto registrov (FPU) sú opäť nezávislé na vnútornom fungovaní procesora. ARM používa 64-bitové FPU už od doby pred ARM64 (64-bitový ARM procesor).

Všeobecné výhody a nevýhody

Pokiaľ porovnáme inak identické 32bit a 64bit architektúry, všeobecne nie sú až také rozdielne. To je jeden z dôvodov všeobecného zmätenia verejnosti hľadajúceho dôvod, prečo sa Apple presúva na 64bit aj v mobilných zariadeniach. Všetko však plynie z konkrétnych parametrov A7 (ARM64) procesora a toho, ako ho Apple využíva, nie iba z toho, že procesor má 64-bitovú architektúru.

Avšak keď sa napriek tomu pozrieme na rozdiely týchto dvoch architektúr, niekoľko rozdielov nájdeme. Ten očividný je, že 64-bitové celočíselné registre vedia efektívnejšie pracovať so 64-bitovými celými číslami. Aj predtým s nimi išlo pracovať na 32-bitovom procesore, avšak väčšinou to znamenalo ich rozdeliť na 32-bitové dlhé kusy, čo spôsobovalo pomalšie výpočty. 64-bitový procesor teda všeobecne dokáže počítať so 64-bitovými typmi rovnako rýchlo ako s 32-bitovými. Z toho vyplýva, že aplikácie valne využívajúce 64-bitové typy môžu pracovať oveľa rýchlejšie na 64-bitovom procesore.

Hoci 64bit nijako neovplyvňuje celkové množstvo RAM pamäte, ktorú môže procesor využiť, môže zjednodušiť prácu s veľkými časťami RAM pamäte v jednom programe. Každý jeden program bežiaci na 32-bitovom procesore má iba asi 4 GB adresného miesta. Keď vezmeme do úvahy, že operačný systém a štandardné knižnice niečo zaberú, zostane programu niekde medzi 1–3 GB na aplikačné použitie. Ak má však 32-bitový systém viac ako 4 GB RAM, využitie tejto pamäte je trochu zložitejšie. Musíme sa uchýliť k donúteniu operačného systému, aby mapoval tieto väčšie časti pamäte pre náš program (virtualizácia pamäte), alebo môžeme rozdeliť program na viac procesov (kde má každý proces opäť teoreticky 4 GB pamäte k dispozícii na priame adresovanie).

Tieto „hacky“ sú však natoľko náročné a pomalé, že ich minimum aplikácií používa. V praxi si na 32-bitovom procesore každý program využije len svoje 1-3 GB pamäte a viac dostupné RAM môžeme uplatniť v behu viacerých programov zároveň či využitie tejto pamäte ako vyrovnávacie (cachovanie). Tieto použitia sú praktické, avšak chceli by sme, aby mohol každý program jednoducho využiť väčšie kusy pamäte ako 4 GB.

Teraz sa dostávame k častému (fakticky zlému) tvrdeniu, že bez viac ako 4 GB pamäte je 64-bitová architektúra zbytočná. Väčší adresný priestor je totiž užitočný aj na systéme s menším množstvom pamäte. Súbory zmapované do pamäte sú praktický nástroj, kedy je časť obsahu súboru logicky prepojená s pamäťou procesu bez toho, aby celý súbor musel byť načítaný v pamäti. Systém tak môže napr. postupne spracovávať veľké súbory aj mnohokrát väčšie, než je kapacita RAM. Na 32-bitovom systéme takto veľké súbory nemožno spoľahlivo namapovať do pamäte, oproti tomu na 64-bitovom je to hračka, vďaka oveľa väčšiemu adresnému priestoru.

Väčšia veľkosť ukazovateľov však prináša aj jednu veľkú nevýhodu: inak identické programy potrebujú viac pamäte na 64-bitovom procesore (niekam sa tieto väčšie ukazovatele totiž musia ukladať). Keďže sú ukazovatele častou súčasťou programov, tento rozdiel môže zaťažiť cache, ktorá na oplátku spôsobí pomalší chod celého systému. Z perspektívy teda vidíme, že ak by sme iba zmenili architektúru procesora na 64-bitovú, v skutočnosti by sa celý systém spomalil. Tento faktor teda musí byť vyvážený väčším množstvom optimalizácií na iných miestach.

ARM64

A7, 64-bitový procesor poháňajúci nový iPhone 5s, nie je len bežný ARM procesor so širšími registrami. ARM64 obsahuje zásadné vylepšenia oproti staršej, 32-bitovej verzii.

Procesor Apple A7.

register

ARM64 poníma dvojnásobný počet celočíselných registrov ako 32-bitový ARM (pozor, nepliesť počet a šírku registrov – o šírke sme hovorili v sekcii „64 bitov“. ARM64 teda má ako dvakrát širšie registre, tak ich má dvakrát viac). 32-bitový ARM má 16 celočíselných registrov: jeden programový čítač (PC – obsahuje číslo aktuálnej inštrukcie), stack ukazovateľ (ukazovateľ na prebiehajúcu funkciu), link register (ukazovateľ na návrat po skončení funkcie), a zvyšných 13 sú na aplikačné použitie. ARM64 má však 32 celočíselných registrov, z toho jeden nulový register, link register, ukazovateľ na rámec (podobný ako stack ukazovateľ) a jeden rezervovaný do budúcnosti. To nám necháva 28 registrov na aplikačné použitie, viac ako dvojnásobok 32-bitového ARMu. Zároveň ARM64 zdvojnásobil počet registrov pre čísla s plávajúcou desatinnou čiarkou (FPU) zo 16 na 32 128-bitových registrov.

V čom je však počet registrov taký dôležitý? Pamäť je všeobecne pomalšia ako výpočty procesora a čítanie/zápis môžu trvať veľmi dlho. Tým by musel rýchly procesor stále čakať na pamäť a narazili by sme na prirodzenú hranicu rýchlosti systému. Procesory sa tento handicap snažia skryť vrstvami vyrovnávacích pamätí, avšak aj tá najrýchlejšia (L1) je stále pomalšia ako výpočet procesora. Registre sú však pamäťové bunky priamo v procesore a ich čítanie/zápis sú dostatočne rýchle na to, aby procesor nespomaľovali. Počet registrov teda prakticky znamená množstvo tej najrýchlejšej pamäte pre výpočty procesora, čím značne ovplyvňuje rýchlosť celého systému.

Táto rýchlosť zároveň potrebuje dobrú podporu optimalizácie od kompilátora, aby jazyk vedel tieto registre využiť a nemusel všetko ukladať do všeobecnej aplikačnej (tej pomalej) pamäte.

Inštrukčná sada

ARM64 tiež prináša zásadné zmeny inštrukčnej sady. Inštrukčná sada je množina atomických operácií, ktoré procesor vie vykonať (napr. ‚ADD registr1 registr2' spočíta čísla v dvoch registroch). Funkcie dostupné jednotlivým jazykom sú zložené z týchto inštrukcií. Zložitejšie funkcie musia vykonať viac inštrukcií, môžu byť preto pomalšie.

Novinkami v ARM64 sú inštrukcie pre AES šifrovanie, SHA-1 a SHA-256 hashovacie funkcie. Namiesto zložitej implementácie teda bude iba jazyk volať túto inštrukciu – čo prinesie obrovské zrýchlenie výpočtu takýchto funkcií a dúfajme aj pridanú bezpečnosť v aplikáciách. Napr. nové Touch ID v šifrovaní tiež využíva tieto inštrukcie, čím umožňuje skutočnú rýchlosť a bezpečnosť (pre napadnutie by teoreticky musel útočník pozmeniť samotný procesor, aby sa k dátam dostal – čo je prinajmenšom nepraktické vzhľadom na jeho miniatúrne rozmery).

Kompatibilita s 32bit

Je dôležité spomenúť, že A7 vie plne bežať v 32-bitovom režime bez potreby emulácie. Znamená to, že nový iPhone 5s vie spustiť aplikácie kompilované na 32-bitový ARM bez akéhokoľvek spomalenia. Avšak potom nemôže využiť nové funkcie ARM64, teda sa vždy oplatí urobiť špeciálny build práve pre A7, ktorý by mal bežať oveľa rýchlejšie.

Runtime zmeny

Runtime sa nazýva kód pridávajúci programovaciemu jazyku funkcie, ktoré je schopný využiť počas chodu aplikácie, až po preklade. Keďže Apple nepotrebuje zachovať kompatibilitu aplikácií (že by 64bit binárka bežala na 32bit), mohli si dovoliť urobiť pár ďalších vylepšení jazyka Objective-C.

Jednou z nich je tzv. tagged pointer (označený ukazovateľ). Bežne sa objekty a ukazovatele na tieto objekty ukladajú v odlišných častiach pamäte. Avšak nové typy ukazovateľov umožňujú triedam s málo dátami ukladať objekty priamo v ukazovateli. Tento krok eliminuje potrebu alokovať pamäť priamo pre objekt, stačí vytvoriť ukazovateľ a objekt v ňom. Tagged pointers sú podporované iba v 64-bitovej architektúre aj kvôli tomu, že v 32-bitovom pointere už nie je dosť miesta na uloženie dostatku užitočných dát. Preto iOS, na rozdiel od OS X, zatiaľ túto funkciu nepodporovalo. S príchodom ARM64 sa to však mení a iOS sa aj v tomto ohľade porovnalo s OS X.

Hoci sú ukazovatele dlhé 64 bitov, na ARM64 sa využije iba 33 bitov na vlastnú adresu ukazovateľa. A ak sme schopní spoľahlivo odmaskovať zvyšok bitov ukazovateľa, môžeme toto miesto využiť na uloženie ďalších dát - ako v prípade spomínaných tagged pointers. Koncepčne ide o jednu z najväčších zmien v histórii Objective-C, hoci to nie je marketingovo využiteľná funkcia – väčšina používateľov sa teda nedozvie, ako vpred Apple Objective-C ťahá.

Čo sa týka užitočných dát, ktoré sa dajú uložiť do zvyšného miesta takého tagged pointeru, Objective-C ho napríklad novo využíva na uloženie tzv. referencie count (počtu referencií). Predtým sa referencie count ukladal v odlišnom mieste v pamäti, v hashovacej tabuľke pre to pripravenú, avšak to v prípade veľkého množstva alloc/dealloc/retain/release volania mohlo celý systém spomaľovať. Tabuľka sa totiž musela kvôli vláknovej bezpečnosti zamykať, teda dvom objektom v dvoch vláknach nemohol byť zároveň menený referencie count. Avšak novo sa táto hodnota vloží do zvyšku tzv. isa ukazovatele. Ide o ďalšiu nenápadnú, avšak do budúcna obrovskú výhodu a zrýchlenie. To by však v 32-bitovej architektúre nikdy nemohlo byť dosiahnuté.

Do zvyšného miesta ukazovateľov na objekty sa tiež novo vkladajú informácie o asociovaných objektoch, či je objekt referencovaný slabo, či je potrebné vygenerovať pre objekt destruktor atď. Runtime Objective-C je vďaka týmto informáciám schopný zásadne zrýchliť beh, čo sa prejaví v rýchlosti každej aplikácie. Z testovania to znamená asi 40-50% zrýchlenie všetkých memory management volaní. Len prechodom na 64-bitové ukazovatele a využitím tohto nového priestoru.

Záver

Hoci sa budú konkurenti snažiť rozšíriť názor, že prechod na 64-bitovú architektúru je zbytočný, vy už budete vedieť, že ide len o veľmi neinformovaný názor. Je pravda, že samotný prechod na 64bit bez toho, aby ste tomu prispôsobili jazyk či aplikácie, naozaj nič neznamená – ba dokonca celý systém spomalí. Ale nový A7 využíva modernú ARM64 s novou inštrukčnou sadou a Apple si dal prácu zmodernizovať celý jazyk Objective-C a využiť nové možnosti – z toho plynie sľubované zrýchlenie.

Tu sme spomenuli veľké množstvo dôvodov, prečo je 64-bitová architektúra správnym krokom dopredu. Ide o ďalšiu revolúciu „pod kapotou“, vďaka ktorej sa Apple bude snažiť naďalej udržať na špici nielen dizajnom, užívateľským rozhraním a bohatým ekosystémom, ale hlavne najmodernejšími technológiami na trhu.

Zdroj: mikeash.com
.