Zapri oglas

Mike Ash posvetil na svojem blogu praktične posledice prehoda na 64-bitno arhitekturo v iPhone 5S. Ta članek temelji na njegovih ugotovitvah.

Razlog za to besedilo je predvsem v veliki količini dezinformacij, ki se širijo o tem, kaj novi iPhone 5s s 64-bitnim procesorjem ARM dejansko pomeni za uporabnike in trg. Tukaj bomo poskušali ponuditi objektivne informacije o uspešnosti, zmožnostih in posledicah tega prehoda za razvijalce.

"64 bit"

Oznaka "X-bit" se lahko nanaša na dva dela procesorja - na širino celih registrov in širino kazalcev. Na srečo so pri večini sodobnih procesorjev te širine enake, tako da v primeru A7 to pomeni 64-bitne cele registre in 64-bitne kazalce.

Vendar je enako pomembno poudariti, kaj "64bit" NE pomeni: Velikost fizičnega naslova RAM. Število bitov za komunikacijo z RAM-om (torej količino RAM-a, ki ga naprava lahko podpira) ni povezano s številom bitov CPU. Procesorji ARM imajo med 26- in 40-bitnimi naslovi in ​​jih je mogoče spremeniti neodvisno od preostalega sistema.

  • Velikost podatkovnega vodila. Količina podatkov, prejetih iz RAM-a ali medpomnilnika, je podobno neodvisna od tega faktorja. Posamezna navodila procesorja lahko zahtevajo različne količine podatkov, vendar se pošiljajo v kosih ali pa iz pomnilnika prejmejo več, kot je potrebno. Odvisno je od velikosti kvantuma podatkov. iPhone 5 podatke iz pomnilnika že sprejema v 64-bitnih kvantih (in ima 32-bitni procesor), srečamo pa lahko velikosti do 192 bitov.
  • Vse, kar je povezano s plavajočo vejico. Velikost takih registrov (FPU) je spet neodvisna od notranjega delovanja procesorja. ARM uporablja 64-bitni FPU že pred ARM64 (64-bitni procesor ARM).

Splošne prednosti in slabosti

Če primerjamo sicer enaki 32-bitni in 64-bitni arhitekturi, na splošno nista tako različni. To je eden od razlogov za splošno zmedo javnosti, ki išče razlog, zakaj Apple prehaja na 64bit tudi v mobilnih napravah. Vendar vse izhaja iz posebnih parametrov procesorja A7 (ARM64) in tega, kako ga Apple uporablja, ne le iz dejstva, da ima procesor 64-bitno arhitekturo.

Vendar, če še vedno pogledamo razlike med tema dvema arhitekturama, bomo našli več razlik. Očitno je, da lahko 64-bitni registri celih števil učinkoviteje obravnavajo 64-bitna cela števila. Že prej je bilo z njimi mogoče delati na 32-bitnih procesorjih, vendar je to običajno pomenilo razdelitev na 32-bitne dele, kar je povzročilo počasnejše izračune. Torej lahko 64-bitni procesor na splošno računa s 64-bitnimi tipi enako hitro kot z 32-bitnimi. To pomeni, da lahko aplikacije, ki običajno uporabljajo 64-bitne vrste, delujejo veliko hitreje na 64-bitnem procesorju.

Čeprav 64-bit ne vpliva na skupno količino RAM-a, ki ga procesor lahko uporablja, lahko olajša delo z velikimi kosi RAM-a v enem programu. Vsak posamezen program, ki se izvaja na 32-bitnem procesorju, ima samo približno 4 GB naslovnega prostora. Če upoštevamo, da operacijski sistem in standardne knjižnice nekaj zavzamejo, ostane programu nekje med 1-3 GB za uporabo aplikacij. Če pa ima 32-bitni sistem več kot 4 GB RAM-a, je uporaba tega pomnilnika nekoliko bolj zapletena. Zateči se moramo k prisili operacijskega sistema, da preslika te večje kose pomnilnika za naš program (virtualizacija pomnilnika), ali pa lahko program razdelimo na več procesov (kjer ima vsak proces spet teoretično 4 GB pomnilnika, ki je na voljo za neposredno naslavljanje).

Vendar so ti "heki" tako težki in počasni, da jih uporablja minimalno število aplikacij. V praksi bo na 32-bitnem procesorju vsak program uporabljal samo svojih 1-3 GB pomnilnika, več razpoložljivega RAM-a pa je mogoče uporabiti za izvajanje več programov hkrati ali ta pomnilnik uporabiti kot medpomnilnik (predpomnilnik). Te uporabe so praktične, vendar želimo, da bi kateri koli program zlahka uporabljal dele pomnilnika, večje od 4 GB.

Zdaj smo prišli do pogoste (pravzaprav napačne) trditve, da je brez več kot 4 GB pomnilnika 64-bitna arhitektura neuporabna. Večji naslovni prostor je uporaben tudi v sistemu z manj pomnilnika. Datoteke s preslikavo pomnilnika so priročno orodje, kjer je del vsebine datoteke logično povezan s pomnilnikom procesa, ne da bi bilo treba celotno datoteko naložiti v pomnilnik. Tako lahko sistem na primer postopoma obdela velike datoteke, večkrat večje od kapacitete RAM-a. V 32-bitnem sistemu tako velikih datotek ni mogoče zanesljivo preslikati v pomnilnik, medtem ko je v 64-bitnem sistemu to zaradi veliko večjega naslovnega prostora kos torte.

Vendar pa večja velikost kazalcev prinaša tudi eno veliko slabost: sicer enaki programi potrebujejo več pomnilnika na 64-bitnem procesorju (te večje kazalce je treba nekje shraniti). Ker so kazalci pogost del programov, lahko ta razlika obremeni predpomnilnik, kar posledično povzroči počasnejše delovanje celotnega sistema. Torej v perspektivi lahko vidimo, da če bi samo spremenili arhitekturo procesorja na 64-bitno, bi to dejansko upočasnilo celoten sistem. Zato je treba ta dejavnik uravnotežiti z več optimizacijami na drugih mestih.

ARM64

A7, 64-bitni procesor, ki poganja novi iPhone 5s, ni le navaden procesor ARM s širšimi registri. ARM64 vsebuje velike izboljšave v primerjavi s starejšo, 32-bitno različico.

Apple A7 procesor.

registra

ARM64 vsebuje dvakrat več celih registrov kot 32-bitni ARM (pazite, da ne zamenjate števila in širine registrov – o širini smo govorili v razdelku »64-bitni«. Torej ima ARM64 dvakrat širše registre in dvakrat več registri). 32-bitni ARM ima 16 celih registrov: en programski števec (PC - vsebuje številko trenutnega ukaza), kazalec sklada (kazalec na funkcijo v teku), povezovalni register (kazalec na vrnitev po koncu funkcije), preostalih 13 pa je za uporabo v aplikaciji. Vendar ima ARM64 32 celih registrov, vključno z enim ničelnim registrom, povezovalnim registrom, kazalcem okvirja (podobno kazalcu sklada) in enim, ki je rezerviran za prihodnost. To nam pušča 28 registrov za uporabo aplikacij, več kot dvakrat več kot 32-bitni ARM. Hkrati je ARM64 podvojil število registrov števil s plavajočo vejico (FPU) s 16 na 32 128-bitnih registrov.

Toda zakaj je število registrov tako pomembno? Pomnilnik je na splošno počasnejši od izračunov procesorja in branje/pisanje lahko traja zelo dolgo. Zaradi tega bi moral hitri procesor še naprej čakati na pomnilnik in dosegli bi naravno omejitev hitrosti sistema. Procesorji poskušajo to pomanjkljivost skriti s plastmi medpomnilnikov, vendar je tudi najhitrejši (L1) še vedno počasnejši od procesorjevega izračuna. So pa registri pomnilniške celice neposredno v procesorju in njihovo branje/pisanje je dovolj hitro, da ne upočasni procesorja. Število registrov praktično pomeni količino najhitrejšega pomnilnika za izračune procesorja, kar močno vpliva na hitrost celotnega sistema.

Hkrati ta hitrost potrebuje dobro optimizacijsko podporo prevajalnika, tako da lahko jezik uporablja te registre in mu ni treba shranjevati vsega v splošnem aplikacijskem (počasnem) pomnilniku.

Komplet navodil

ARM64 prinaša tudi velike spremembe v naboru navodil. Nabor ukazov je nabor atomskih operacij, ki jih lahko izvaja procesor (npr. 'ADD register1 register2' sešteje številke v dveh registrih). Funkcije, ki so na voljo za posamezne jezike, so sestavljene iz teh navodil. Bolj zapletene funkcije morajo izvajati več ukazov, zato so lahko počasnejše.

Novost v ARM64 so navodila za šifriranje AES, zgoščene funkcije SHA-1 in SHA-256. Namesto zapletene implementacije bo torej ta ukaz klical le jezik - kar bo prineslo ogromno pospešitev računanja takšnih funkcij in, upajmo, dodano varnost v aplikacijah. Npr. novi Touch ID ta navodila uporablja tudi pri šifriranju, kar omogoča resnično hitrost in varnost (teoretično bi moral napadalec spremeniti sam procesor za dostop do podatkov – kar je vsaj nepraktično glede na njegovo miniaturno velikost).

Združljivost z 32bit

Pomembno je omeniti, da lahko A7 v celoti deluje v 32-bitnem načinu brez potrebe po emulaciji. To pomeni, da lahko novi iPhone 5s poganja aplikacije, prevedene na 32-bitni ARM brez kakršne koli upočasnitve. Vendar takrat ne more uporabljati novih funkcij ARM64, zato se vedno splača narediti posebno gradnjo samo za A7, ki naj bi delovala veliko hitreje.

Spremembe izvajalnega časa

Runtime je koda, ki programskemu jeziku doda funkcije, ki jih ta lahko uporablja med izvajanjem aplikacije, do prevajanja. Ker Appleu ni treba vzdrževati združljivosti aplikacij (da 64-bitna binarna datoteka deluje na 32-bitni), si lahko privoščijo še nekaj izboljšav jezika Objective-C.

Eden od njih je t.i označen kazalec (označen indikator). Običajno so objekti in kazalci na te objekte shranjeni v ločenih delih pomnilnika. Vendar novi tipi kazalcev omogočajo razredom z malo podatkov shranjevanje objektov neposredno v kazalec. Ta korak odpravlja potrebo po dodeljevanju pomnilnika neposredno za objekt, samo ustvarite kazalec in objekt v njem. Označeni kazalci so podprti le v 64-bitni arhitekturi tudi zaradi dejstva, da v 32-bitnem kazalcu ni več dovolj prostora za shranjevanje dovolj uporabnih podatkov. Zato iOS za razliko od OS X še ni podpiral te funkcije. Vendar se s prihodom ARM64 to spreminja in iOS je tudi v tem pogledu dohitel OS X.

Čeprav so kazalci dolgi 64 bitov, se na ARM64 za lastni naslov kazalca uporablja le 33 bitov. In če nam uspe zanesljivo razkriti ostale bite kazalca, lahko ta prostor uporabimo za shranjevanje dodatnih podatkov – kot v primeru omenjenih označenih kazalcev. Konceptualno je to ena največjih sprememb v zgodovini Objective-C, čeprav ni tržna lastnost – zato večina uporabnikov ne bo vedela, kako Apple premika Objective-C naprej.

Kar zadeva uporabne podatke, ki jih je mogoče shraniti v preostali prostor tako označenega kazalca, jih na primer Objective-C zdaj uporablja za shranjevanje t.i. referenčno število (število referenc). Prej je bilo štetje sklicev shranjeno na drugem mestu v pomnilniku, v zanj pripravljeni zgoščeni tabeli, vendar bi to lahko upočasnilo celoten sistem v primeru velikega števila klicev alloc/dealloc/retain/release. Tabela je morala biti zaklenjena zaradi varnosti niti, tako da števila referenc dveh objektov v dveh nitih ni bilo mogoče spremeniti hkrati. Je pa ta vrednost na novo vstavljena v preostalo t.i ISA indikatorji. To je še ena neopazna, a velika prednost in pospešek v prihodnosti. Vendar tega nikoli ne bi bilo mogoče doseči v 32-bitni arhitekturi.

Na preostalo mesto kazalcev na objekte so na novo vstavljene tudi informacije o povezanih objektih, ali je objekt šibko referenciran, ali je treba za objekt ustvariti destruktor itd.. Zahvaljujoč tem podatkom Objective-C runtime lahko temeljito pospeši čas izvajanja, kar se odraža v hitrosti posamezne aplikacije. Iz testiranja to pomeni približno 40-50-odstotno pospešitev vseh klicev upravljanja pomnilnika. Samo s preklopom na 64-bitne kazalce in uporabo tega novega prostora.

Zaključek

Čeprav bodo tekmeci skušali širiti idejo, da je prehod na 64-bitno arhitekturo nepotreben, boste že vedeli, da je to le zelo nepoučeno mnenje. Res je, da preklop na 64-bit brez prilagajanja jezika ali aplikacij pravzaprav ne pomeni ničesar – celo upočasni celoten sistem. Toda novi A7 uporablja sodoben ARM64 z novim naborom navodil in Apple se je potrudil posodobiti celoten jezik Objective-C in izkoristiti nove zmožnosti - od tod tudi obljubljeno pospešitev.

Tukaj smo omenili veliko razlogov, zakaj je 64-bitna arhitektura pravi korak naprej. Gre za še eno revolucijo »pod pokrovom«, zahvaljujoč kateri bo Apple poskušal ostati v ospredju ne le z dizajnom, uporabniškim vmesnikom in bogatim ekosistemom, temveč predvsem z najsodobnejšimi tehnologijami na trgu.

Vir: mikeash.com
.