Uždaryti skelbimą

Mike'as Ešas skirta savo dienoraštyje praktines perėjimo prie 64 bitų architektūros iPhone 5S pasekmes. Šis straipsnis remiasi jo išvadomis.

Šio teksto priežastis daugiausia dėl to, kad skleidžiama daug klaidingos informacijos apie tai, ką iš tikrųjų reiškia vartotojams ir rinkai naujasis iPhone 5s su 64 bitų ARM procesoriumi. Čia mes stengsimės pateikti objektyvią informaciją apie šio perėjimo našumą, galimybes ir pasekmes kūrėjams.

"64 bitai"

Yra dvi procesoriaus dalys, kurias gali nurodyti „X bitų“ etiketė – sveikųjų skaičių registrų plotis ir rodyklių plotis. Laimei, daugelyje šiuolaikinių procesorių šie pločiai yra vienodi, todėl A7 atveju tai reiškia 64 bitų sveikųjų skaičių registrus ir 64 bitų rodykles.

Tačiau taip pat svarbu nurodyti, ko „64 bitai“ NĖRA reiškia: RAM fizinio adreso dydis. Bitų, reikalingų palaikyti ryšį su RAM, skaičius (taigi RAM kiekis, kurį gali palaikyti įrenginys) nėra susijęs su procesoriaus bitų skaičiumi. ARM procesoriai turi nuo 26 iki 40 bitų adresus ir gali būti keičiami nepriklausomai nuo likusios sistemos.

  • Duomenų magistralės dydis. Iš RAM arba buferinės atminties gaunamų duomenų kiekis taip pat nepriklauso nuo šio veiksnio. Atskiros procesoriaus instrukcijos gali reikalauti skirtingo duomenų kiekio, tačiau jos siunčiamos dalimis arba gaunamos iš atminties daugiau nei reikia. Tai priklauso nuo duomenų kvanto dydžio. „IPhone 5“ jau gauna duomenis iš atminties 64 bitų kvantais (ir turi 32 bitų procesorių), o mes galime susidurti su dydžiais iki 192 bitų.
  • Viskas, kas susiję su slankiuoju kableliu. Tokių registrų (FPU) dydis vėlgi nepriklauso nuo vidinio procesoriaus veikimo. ARM naudoja 64 bitų FPU nuo ARM64 (64 bitų ARM procesorius).

Bendrieji privalumai ir trūkumai

Jei palyginsime kitaip identiškas 32 bitų ir 64 bitų architektūras, jos paprastai nesiskiria. Tai viena iš visuotinio visuomenės painiavos priežasčių, ieškančios priežasties, kodėl „Apple“ pereina prie 64 bitų ir mobiliuosiuose įrenginiuose. Tačiau viską lemia specifiniai A7 (ARM64) procesoriaus parametrai ir tai, kaip „Apple“ jį naudoja, o ne tik tai, kad procesorius turi 64 bitų architektūrą.

Tačiau jei vis tiek pažvelgsime į šių dviejų architektūrų skirtumus, rasime keletą skirtumų. Akivaizdu, kad 64 bitų sveikųjų skaičių registrai gali efektyviau apdoroti 64 bitų sveikuosius skaičius. Dar anksčiau su jais buvo galima dirbti su 32 bitų procesoriais, tačiau tai dažniausiai reikšdavo jų padalijimą į 32 bitų ilgio dalis, todėl skaičiavimai sulėtėjo. Taigi 64 bitų procesorius paprastai gali skaičiuoti su 64 bitų tipais taip pat greitai, kaip ir su 32 bitų. Tai reiškia, kad programos, kurios paprastai naudoja 64 bitų tipus, gali veikti daug greičiau 64 bitų procesoriuje.

Nors 64 bitai neturi įtakos bendram RAM kiekiui, kurį gali naudoti procesorius, tai gali palengvinti darbą su dideliais RAM gabalais vienoje programoje. Bet kuri programa, veikianti 32 bitų procesoriuje, turi tik apie 4 GB adresų vietos. Atsižvelgiant į tai, kad operacinė sistema ir standartinės bibliotekos kažką užima, programai lieka 1–3 GB vietos. Tačiau jei 32 bitų sistemoje yra daugiau nei 4 GB RAM, naudoti šią atmintį yra šiek tiek sudėtingiau. Turime priversti operacinę sistemą susieti šias didesnes atminties dalis mūsų programai (atminties virtualizavimas), arba galime padalyti programą į kelis procesus (kai kiekvienas procesas teoriškai vėl turi 4 GB atminties tiesioginiam adresui).

Tačiau šie „įsilaužimai“ yra tokie sunkūs ir lėti, kad juos naudoja minimalios programos. Praktiškai 32 bitų procesoriuje kiekviena programa naudos tik savo 1–3 GB atminties, o daugiau turimos RAM gali būti panaudota kelioms programoms paleisti vienu metu arba naudoti šią atmintį kaip buferį (caching). Šie naudojimo būdai yra praktiški, tačiau norėtume, kad bet kuri programa galėtų lengvai naudoti didesnes nei 4 GB atminties dalis.

Dabar prieiname prie dažno (iš tikrųjų neteisingo) teiginio, kad be daugiau nei 4 GB atminties 64 bitų architektūra yra nenaudinga. Didesnė adresų erdvė yra naudinga net mažiau atminties turinčioje sistemoje. Atminties susiejimo failai yra patogus įrankis, kuriame dalis failo turinio yra logiškai susieta su proceso atmintimi ir viso failo nereikia įkelti į atmintį. Taigi sistema gali, pavyzdžiui, palaipsniui apdoroti didelius failus, daug kartų didesnius nei RAM talpa. 32 bitų sistemoje tokie dideli failai negali būti patikimai susieti su atmintimi, o 64 bitų sistemoje tai yra paprastas dalykas dėl daug didesnės adresų erdvės.

Tačiau didesnis rodyklių dydis atneša ir vieną didelį trūkumą: kitu atveju identiškoms programoms reikia daugiau atminties 64 bitų procesoriuje (šios didesnės rodyklės turi būti kažkur saugomos). Kadangi rodyklės yra dažna programų dalis, šis skirtumas gali apkrauti talpyklą, todėl visa sistema veikia lėčiau. Taigi perspektyvoje matome, kad jei tik pakeistume procesoriaus architektūrą į 64 bitų, tai iš tikrųjų sulėtintų visą sistemą. Taigi šis veiksnys turi būti subalansuotas atliekant daugiau optimizacijų kitose vietose.

ARM64

A7, 64 bitų procesorius, maitinantis naująjį iPhone 5s, nėra tik įprastas ARM procesorius su platesniais registrais. ARM64 yra didelių patobulinimų, palyginti su senesne, 32 bitų versija.

Apple A7 procesorius.

registras

ARM64 talpina dvigubai daugiau sveikųjų skaičių registrų nei 32 bitų ARM (būkite atsargūs, kad nesupainiotumėte registrų skaičiaus ir pločio – apie plotį kalbėjome „64 bitų“ skyriuje. Taigi ARM64 turi ir dvigubai platesnius registrus, ir dvigubai daugiau registrai). 32 bitų ARM turi 16 sveikųjų skaičių registrų: vieną programos skaitiklį (PC - yra dabartinės instrukcijos numeris), dėklo rodyklę (žymeklį į vykdomą funkciją), nuorodų registrą (rodyklė į grįžimą po pabaigos funkcijos), o likusieji 13 yra skirti naudoti programoje. Tačiau ARM64 turi 32 sveikųjų skaičių registrus, įskaitant vieną nulio registrą, nuorodų registrą, kadro žymeklį (panašų į kamino rodyklę) ir vieną rezervuotą ateičiai. Tai leidžia mums naudoti 28 registrus, daugiau nei dvigubai daugiau nei 32 bitų ARM. Tuo pačiu metu ARM64 padvigubino slankiojo kablelio (FPU) registrų skaičių nuo 16 iki 32 128 bitų registrų.

Bet kodėl toks svarbus registrų skaičius? Atmintis paprastai yra lėtesnė nei procesoriaus skaičiavimai, o skaitymas / rašymas gali užtrukti labai ilgai. Dėl to greitas procesorius turėtų laukti atminties ir mes pasiektume natūralų sistemos greičio ribą. Procesoriai bando paslėpti šią kliūtį buferių sluoksniais, tačiau net ir greičiausias (L1) vis tiek yra lėtesnis nei procesoriaus skaičiavimas. Tačiau registrai yra atminties ląstelės, esančios tiesiai procesoriuje, o jų skaitymas / įrašymas yra pakankamai greitas, kad nesulėtėtų procesoriaus. Registrų skaičius praktiškai reiškia greičiausios atminties kiekį procesoriaus skaičiavimams, o tai labai įtakoja visos sistemos greitį.

Tuo pačiu metu šiam greičiui reikalingas geras kompiliatoriaus optimizavimo palaikymas, kad kalba galėtų naudoti šiuos registrus ir nereikėtų visko saugoti bendrosios programos (lėtojoje) atmintyje.

Instrukcijų rinkinys

ARM64 taip pat atneša didelių instrukcijų rinkinio pakeitimų. Instrukcijų rinkinys yra atominių operacijų, kurias gali atlikti procesorius, rinkinys (pvz., „ADD register1 register2“ sudeda skaičius dviejuose registruose). Funkcijos, prieinamos atskiroms kalboms, yra sudarytos iš šių nurodymų. Sudėtingesnės funkcijos turi vykdyti daugiau instrukcijų, todėl jos gali būti lėtesnės.

Naujiena ARM64 yra AES šifravimo, SHA-1 ir SHA-256 maišos funkcijų instrukcijos. Taigi vietoj sudėtingo diegimo šią instrukciją vadins tik kalba – tai labai pagreitins tokių funkcijų skaičiavimą ir, tikėkimės, padidins programų saugumą. Pvz. naujasis Touch ID taip pat naudoja šias instrukcijas šifruodamas, todėl užtikrinamas tikras greitis ir saugumas (teoriškai užpuolikas turėtų modifikuoti patį procesorių, kad galėtų pasiekti duomenis – o tai mažų mažiausiai nepraktiška, atsižvelgiant į jo miniatiūrinį dydį).

Suderinamumas su 32 bitų

Svarbu paminėti, kad A7 gali visiškai veikti 32 bitų režimu be emuliacijos. Tai reiškia, kad naujasis iPhone 5s gali paleisti programas, sudarytas naudojant 32 bitų ARM, be jokio sulėtėjimo. Tačiau tuomet jis negali naudotis naujomis ARM64 funkcijomis, todėl visada verta pasidaryti specialų statymą tik A7, kuris turėtų veikti daug greičiau.

Vykdymo laiko pokyčiai

Vykdymo laikas yra kodas, papildantis programavimo kalbą funkcijų, kurias ji gali naudoti veikiant programai iki vertimo. Kadangi „Apple“ nereikia palaikyti programų suderinamumo (kad 64 bitų dvejetainis failas veikia 32 bitų sistemoje), jie galėtų sau leisti dar kelis „Objective-C“ kalbos patobulinimus.

Vienas iš jų yra vadinamasis pažymėtas žymeklis (pažymėtas indikatorius). Paprastai objektai ir rodyklės į tuos objektus saugomi atskirose atminties dalyse. Tačiau nauji žymeklio tipai leidžia klasėms, turinčioms mažai duomenų, saugoti objektus tiesiai žymeklyje. Šis veiksmas pašalina poreikį objektui tiesiogiai skirti atmintį, tiesiog sukurkite žymeklį ir objektą jame. Pažymėti rodyklės palaikomos tik 64 bitų architektūroje ir dėl to, kad 32 bitų rodyklėje nebeužtenka vietos pakankamai naudingų duomenų saugoti. Todėl iOS, skirtingai nei OS X, šios funkcijos dar nepalaikė. Tačiau atsiradus ARM64, tai keičiasi, o iOS šiuo atžvilgiu taip pat pasivijo OS X.

Nors rodyklės yra 64 bitų ilgio, ARM64 tik 33 bitai naudojami paties žymeklio adresui. Ir jei galime patikimai demaskuoti likusius rodyklės bitus, šią erdvę galime panaudoti papildomiems duomenims saugoti – kaip ir minėtų pažymėtų rodyklių atveju. Konceptualiai tai yra vienas didžiausių pokyčių Objective-C istorijoje, nors tai ir nėra parduodama funkcija – todėl dauguma vartotojų nežinos, kaip Apple juda į priekį Objective-C.

Kalbant apie naudingus duomenis, kurie gali būti saugomi likusioje tokio pažymėto žymeklio erdvėje, pavyzdžiui, „Objective-C“ dabar juos naudoja, kad saugotų vadinamąjį. nuorodų skaičius (nuorodų skaičius). Anksčiau nuorodų skaičius buvo saugomas kitoje atminties vietoje, jam paruoštoje maišos lentelėje, tačiau tai galėjo sulėtinti visą sistemą esant dideliam aloc/dealloc/retain/release skambučių skaičiui. Lentelė turėjo būti užrakinta dėl gijų saugos, todėl dviejų objektų atskaitos skaičius dviejose gijose negalėjo būti pakeistas vienu metu. Tačiau ši reikšmė naujai įterpiama į likusią vadinamąją ISA rodikliai. Tai dar vienas nepastebimas, bet didžiulis pranašumas ir pagreitis ateityje. Tačiau to niekada nepavyko pasiekti 32 bitų architektūroje.

Informacija apie susijusius objektus, ar objektas yra silpnai nurodytas, ar reikia sugeneruoti objekto naikintuvą ir pan., taip pat naujai įterpiama į likusią rodyklių į objektus vietą Šios informacijos dėka Objective-C runtime gali iš esmės pagreitinti vykdymo laiką, o tai atsispindi kiekvienos programos greičiu. Remiantis bandymais, tai reiškia apie 40–50% visų atminties valdymo skambučių pagreitį. Tiesiog pereidami prie 64 bitų rodyklių ir naudodami šią naują erdvę.

Išvada

Nors konkurentai bandys skleisti mintį, kad pereiti prie 64 bitų architektūros nebūtina, jūs jau žinosite, kad tai tik labai neinformuota nuomonė. Tiesa, tiesiog perėjimas prie 64 bitų, nepritaikant prie jos kalbos ar programų, iš tikrųjų nieko nereiškia – netgi pristabdo visą sistemą. Tačiau naujajame A7 naudojamas modernus ARM64 su nauju instrukcijų rinkiniu, o „Apple“ pasistengė modernizuoti visą „Objective-C“ kalbą ir pasinaudoti naujomis galimybėmis – taigi ir pažadėtas pagreitis.

Čia paminėjome daugybę priežasčių, kodėl 64 bitų architektūra yra teisingas žingsnis į priekį. Tai dar viena revoliucija „po gaubtu“, kurios dėka „Apple“ stengsis išlikti priešakyje ne tik dėl dizaino, vartotojo sąsajos ir turtingos ekosistemos, bet daugiausia su moderniausiomis technologijomis rinkoje.

Šaltinis: mikeash.com
.