Maak advertensie toe

Mike Ash op sy blog toegewy die praktiese implikasies van oorskakeling na 64-bis argitektuur in die iPhone 5S. Hierdie artikel steun op sy bevindinge.

Die rede vir hierdie teks is hoofsaaklik te wyte aan die groot hoeveelheid verkeerde inligting wat versprei word oor wat die nuwe iPhone 5s met 'n 64-bis ARM verwerker eintlik vir gebruikers en die mark beteken. Hier sal ons probeer om objektiewe inligting oor die prestasie, vermoëns en implikasies van hierdie oorgang vir ontwikkelaars te bring.

"64 bit"

Daar is twee dele van 'n verwerker waarna die "X-bis"-etiket kan verwys - die breedte van die heelgetalregisters en die breedte van die wysers. Gelukkig is hierdie breedtes op die meeste moderne verwerkers dieselfde, so in die geval van die A7 beteken dit 64-bis heelgetalregisters en 64-bis wysers.

Dit is egter ewe belangrik om uit te wys wat "64bit" NIE beteken nie: RAM fisiese adres grootte. Die aantal bisse om met RAM te kommunikeer (dus die hoeveelheid RAM wat 'n toestel kan ondersteun) hou nie verband met die aantal SVE bisse nie. ARM-verwerkers het enige plek tussen 26- en 40-bis-adresse en kan onafhanklik van die res van die stelsel verander word.

  • Data bus grootte. Die hoeveelheid data wat vanaf RAM of buffergeheue ontvang word, is eweneens onafhanklik van hierdie faktor. Individuele verwerkerinstruksies kan verskillende hoeveelhede data versoek, maar dit word óf in stukke gestuur óf meer as wat nodig is uit die geheue ontvang. Dit hang af van die grootte van die datakwantum. Die iPhone 5 ontvang reeds data van die geheue in 64-bis kwanta (en het 'n 32-bis verwerker), en ons kan groottes tot 192 bisse teëkom.
  • Enigiets wat met drywende punt verband hou. Die grootte van sulke registers (FPU) is weer onafhanklik van die interne werking van die verwerker. ARM gebruik 64-bis FPU sedert voor ARM64 (64-bis ARM verwerker).

Algemene voordele en nadele

As ons andersins identiese 32bis- en 64bis-argitekture vergelyk, is hulle oor die algemeen nie so verskillend nie. Dit is een van die redes vir die algemene verwarring van die publiek wat 'n rede soek waarom Apple ook in mobiele toestelle na 64bit beweeg. Dit kom egter alles van die spesifieke parameters van die A7 (ARM64) verwerker en hoe Apple dit gebruik, nie net van die feit dat die verwerker 'n 64-bis argitektuur het nie.

As ons egter steeds na die verskille tussen hierdie twee argitekture kyk, sal ons verskeie verskille vind. Die ooglopende een is dat 64-bis heelgetalregisters 64-bis heelgetalle meer doeltreffend kan hanteer. Selfs voorheen was dit moontlik om met hulle op 32-bis verwerkers te werk, maar dit het gewoonlik beteken om hulle in 32-bis lang stukke te verdeel, wat stadiger berekeninge veroorsaak het. Dus kan 'n 64-bis verwerker oor die algemeen net so vinnig met 64-bis tipes bereken soos met 32-bis. Dit beteken dat toepassings wat gewoonlik 64-bis-tipes gebruik, baie vinniger op 'n 64-bis verwerker kan werk.

Alhoewel 64bit nie die totale hoeveelheid RAM wat die verwerker kan gebruik, beïnvloed nie, kan dit dit makliker maak om met groot stukke RAM in een program te werk. Enige enkele program wat op 'n 32-bis verwerker loop, het slegs ongeveer 4 GB adresspasie. As in ag geneem word dat die bedryfstelsel en standaardbiblioteke iets opneem, laat dit die program met iewers tussen 1-3 GB vir toepassingsgebruik. As 'n 32-bis-stelsel egter meer as 4 GB RAM het, is die gebruik van daardie geheue 'n bietjie meer ingewikkeld. Ons moet die bedryfstelsel dwing om hierdie groter stukke geheue vir ons program te karteer (geheue-virtualisering), of ons kan die program in verskeie prosesse verdeel (waar elke proses weer teoreties 4 GB geheue beskikbaar het vir direkte adressering).

Hierdie "hacks" is egter so moeilik en stadig dat 'n minimum van toepassings dit gebruik. In die praktyk, op 'n 32-bis-verwerker, sal elke program slegs sy 1-3 GB geheue gebruik, en meer beskikbare RAM kan gebruik word om verskeie programme gelyktydig te laat loop of hierdie geheue as 'n buffer te gebruik (kas). Hierdie gebruike is prakties, maar ons wil graag hê dat enige program maklik stukke geheue groter as 4 GB kan gebruik.

Nou kom ons by die gereelde (eintlik verkeerde) bewering dat sonder meer as 4 GB geheue, 'n 64-bis argitektuur nutteloos is. 'n Groter adresspasie is nuttig selfs op 'n stelsel met minder geheue. Geheue-gekarteerde lêers is 'n handige hulpmiddel waar 'n deel van die lêer se inhoud logies aan die proses se geheue gekoppel is sonder dat die hele lêer in die geheue gelaai hoef te word. So kan die stelsel byvoorbeeld geleidelik groot lêers baie keer groter as die RAM-kapasiteit verwerk. Op 'n 32-bis-stelsel kan sulke groot lêers nie betroubaar geheue-gekarteer word nie, terwyl dit op 'n 64-bis stelsel 'n stukkie koek is, danksy die veel groter adresspasie.

Die groter grootte wysers bring egter ook een groot nadeel: andersins benodig identiese programme meer geheue op 'n 64-bis verwerker (hierdie groter wysers moet iewers gestoor word). Aangesien wysers 'n gereelde deel van programme is, kan hierdie verskil die kas belas, wat weer veroorsaak dat die hele stelsel stadiger loop. So in perspektief kan ons sien dat as ons net die verwerker-argitektuur na 64-bis verander, dit eintlik die hele stelsel sou vertraag. Hierdie faktor moet dus gebalanseer word deur meer optimalisering op ander plekke.

ARM64

Die A7, die 64-bis-verwerker wat die nuwe iPhone 5s aandryf, is nie net 'n gewone ARM-verwerker met wyer registers nie. ARM64 bevat groot verbeterings bo die ouer, 32-bis weergawe.

Apple A7 verwerker.

register

ARM64 hou twee keer soveel heelgetalregisters as 32-bis ARM (wees versigtig om nie die aantal en breedte van registers te verwar nie - ons het gepraat oor breedte in die "64-bis" afdeling. So ARM64 het beide twee keer so wye registers en twee keer soveel registers). Die 32-bis ARM het 16 heelgetalregisters: een programteller (PC - bevat die nommer van die huidige instruksie), 'n stapelwyser ('n wyser na 'n funksie wat aan die gang is), 'n skakelregister ('n wyser na die terugkeer na die einde van die funksie), en die oorblywende 13 is vir toepassingsgebruik. Die ARM64 het egter 32 heelgetalregisters, insluitend een nulregister, 'n skakelregister, 'n raamwyser (soortgelyk aan 'n stapelwyser), en een wat vir die toekoms gereserveer is. Dit laat ons met 28 registers vir toepassingsgebruik, meer as dubbel die 32-bis ARM. Terselfdertyd het die ARM64 die aantal swewendepuntgetalregisters (FPU) verdubbel van 16 tot 32 128-bis registers.

Maar hoekom is die aantal registers so belangrik? Geheue is oor die algemeen stadiger as SVE-berekeninge en lees/skryf kan baie lank neem. Dit sal maak dat die vinnige verwerker moet aanhou wag vir geheue en ons sal die natuurlike spoedgrens van die stelsel bereik. Verwerkers probeer om hierdie gestremdheid met lae buffers weg te steek, maar selfs die vinnigste een (L1) is steeds stadiger as die verwerker se berekening. Registers is egter geheueselle direk in die verwerker en hul lees/skryf is vinnig genoeg om nie die verwerker te vertraag nie. Die aantal registers beteken feitlik die hoeveelheid vinnigste geheue vir verwerkerberekeninge, wat die spoed van die hele stelsel grootliks beïnvloed.

Terselfdertyd benodig hierdie spoed goeie optimaliseringsondersteuning van die samesteller, sodat die taal hierdie registers kan gebruik en nie alles in die algemene toepassing (die stadige) geheue hoef te stoor nie.

Instruksiestel

ARM64 bring ook groot veranderinge aan die instruksiestel. 'n Instruksiestel is 'n stel atoombewerkings wat 'n verwerker kan uitvoer (bv. 'ADD register1 register2' voeg die getalle in twee registers by). Die funksies wat vir individuele tale beskikbaar is, is saamgestel uit hierdie instruksies. Meer komplekse funksies moet meer instruksies uitvoer, sodat hulle stadiger kan wees.

Nuut in ARM64 is instruksies vir AES-enkripsie, SHA-1 en SHA-256 hash-funksies. So in plaas van 'n komplekse implementering, sal slegs die taal hierdie instruksie noem - wat 'n groot versnelling sal bring in die berekening van sulke funksies en hopelik bykomende sekuriteit in toepassings. Bv. die nuwe Touch ID gebruik ook hierdie instruksies in enkripsie, wat werklike spoed en sekuriteit moontlik maak (in teorie sal 'n aanvaller die verwerker self moet verander om toegang tot die data te verkry - wat onprakties is om die minste te sê gegewe die miniatuurgrootte daarvan).

Verenigbaarheid met 32bit

Dit is belangrik om te noem dat die A7 volledig in 32-bis-modus kan werk sonder dat dit nodig is om na te boots. Dit beteken dat die nuwe iPhone 5s toepassings kan laat loop wat op 32-bis ARM saamgestel is sonder enige verlangsaming. Dit kan egter nie die nuwe ARM64-funksies gebruik nie, so dit is altyd die moeite werd om 'n spesiale bouwerk net vir die A7 te maak, wat baie vinniger behoort te loop.

Looptyd verander

Looptyd is die kode wat funksies by die programmeertaal voeg, wat dit kan gebruik terwyl die toepassing loop, tot na vertaling. Aangesien Apple nie toepassingsversoenbaarheid hoef te handhaaf nie (dat 'n 64-bis-binêr op 32-bis loop), kan hulle bekostig om nog 'n paar verbeterings aan die Objective-C-taal aan te bring.

Een van hulle is die sg gemerkte wyser (gemerkte aanwyser). Normaalweg word voorwerpe en wysers na daardie voorwerpe in afsonderlike dele van geheue gestoor. Nuwe wysertipes laat klasse met min data egter toe om voorwerpe direk in die wyser te stoor. Hierdie stap elimineer die behoefte om geheue direk vir die voorwerp toe te ken, skep net 'n wyser en die voorwerp daarin. Gemerkte wysers word slegs in 64-bis-argitektuur ondersteun, ook as gevolg van die feit dat daar nie meer genoeg spasie in 'n 32-bis-wyser is om genoeg nuttige data te stoor nie. Daarom het iOS, anders as OS X, nog nie hierdie kenmerk ondersteun nie. Met die koms van ARM64 is dit egter besig om te verander, en iOS het OS X ook in hierdie verband ingehaal.

Alhoewel wysers 64 bisse lank is, word op die ARM64 slegs 33 bisse vir die wyser se eie adres gebruik. En as ons die res van die wyserstukke betroubaar kan ontmasker, kan ons hierdie spasie gebruik om bykomende data te stoor – soos in die geval van die genoemde gemerkte wysers. Konseptueel is dit een van die grootste veranderinge in die geskiedenis van Objective-C, hoewel dit nie 'n bemarkbare kenmerk is nie - so die meeste gebruikers sal nie weet hoe Apple Objective-C vorentoe beweeg nie.

Wat die nuttige data betref wat in die oorblywende spasie van so 'n gemerkte wyser gestoor kan word, gebruik Objective-C dit byvoorbeeld nou om die sg. verwysingtelling (aantal verwysings). Voorheen is die verwysingtelling op 'n ander plek in die geheue gestoor, in 'n hash-tabel wat daarvoor voorberei is, maar dit kan die hele stelsel vertraag in die geval van 'n groot aantal alloc/dealloc/retain/release-oproepe. Die tafel moes gesluit word weens draadveiligheid, dus kon die verwysingtelling van twee voorwerpe in twee drade nie gelyktydig verander word nie. Hierdie waarde is egter nuut ingevoeg in die res van die sogenaamde Isa aanwysers. Dit is nog 'n onopvallende, maar groot voordeel en versnelling in die toekoms. Dit kon egter nooit in 'n 32-bis-argitektuur bereik word nie.

Inligting oor geassosieerde voorwerpe, of die voorwerp swak verwys word, of dit nodig is om 'n vernietiger vir die voorwerp te genereer, ens., word ook nuut ingevoeg in die oorblywende plek van wysers na die voorwerpe. Danksy hierdie inligting, die Objective-C runtime is in staat om die looptyd fundamenteel te versnel, wat in die spoed van elke toepassing weerspieël word. Van toetsing beteken dit ongeveer 40-50% versnelling van alle geheuebestuuroproepe. Net deur oor te skakel na 64-bis wysers en hierdie nuwe spasie te gebruik.

Afsluiting

Alhoewel mededingers die idee sal probeer versprei dat oorskakeling na 'n 64-bis-argitektuur onnodig is, sal jy reeds weet dat dit net 'n baie oningeligte mening is. Dit is waar dat om na 64-bis oor te skakel sonder om jou taal of toepassings aan te pas, niks regtig beteken nie – dit vertraag selfs die hele stelsel. Maar die nuwe A7 gebruik 'n moderne ARM64 met 'n nuwe instruksiestel, en Apple het die moeite gedoen om die hele Objective-C-taal te moderniseer en voordeel te trek uit die nuwe vermoëns - vandaar die beloofde versnelling.

Hier het ons 'n groot aantal redes genoem waarom 'n 64-bis argitektuur die regte stap vorentoe is. Dit is nog 'n rewolusie "onder die enjinkap", waardeur Apple sal probeer om aan die voorpunt te bly nie net met ontwerp, gebruikerskoppelvlak en ryk ekosisteem nie, maar hoofsaaklik met die mees moderne tegnologie op die mark.

bron: mikeash.com
.