Luk annoncen

Mike Ash dedikeret på sin blog de praktiske konsekvenser af at skifte til 64-bit arkitektur i iPhone 5S. Denne artikel trækker på hans resultater.

Årsagen til denne tekst skyldes primært den store mængde misinformation, der spredes om, hvad den nye iPhone 5s med en 64-bit ARM-processor faktisk betyder for brugerne og markedet. Her vil vi forsøge at bringe objektiv information om ydeevnen, mulighederne og implikationerne af denne overgang for udviklere.

"64 bit"

Der er to dele af en processor, som "X-bit"-etiketten kan referere til - bredden af ​​heltalsregistrene og bredden af ​​pointerne. Heldigvis er disse bredder de samme på de fleste moderne processorer, så i tilfældet med A7 betyder det 64-bit heltalsregistre og 64-bit pointere.

Det er dog lige så vigtigt at påpege, hvad "64bit" IKKE betyder: RAM fysisk adressestørrelse. Antallet af bits, der skal kommunikeres med RAM (altså mængden af ​​RAM, en enhed kan understøtte) er ikke relateret til antallet af CPU-bits. ARM-processorer har alt mellem 26- og 40-bit adresser og kan ændres uafhængigt af resten af ​​systemet.

  • Databus størrelse. Mængden af ​​data modtaget fra RAM eller bufferhukommelse er ligeledes uafhængig af denne faktor. Individuelle processorinstruktioner kan anmode om forskellige mængder data, men de sendes enten i bidder eller modtages mere end nødvendigt fra hukommelsen. Det afhænger af størrelsen af ​​datakvantemet. iPhone 5 modtager allerede data fra hukommelsen i 64-bit kvanta (og har en 32-bit processor), og vi kan støde på størrelser op til 192 bit.
  • Alt relateret til flydende komma. Størrelsen af ​​sådanne registre (FPU) er igen uafhængige af processorens interne funktion. ARM har brugt 64-bit FPU siden før ARM64 (64-bit ARM-processor).

Generelle fordele og ulemper

Hvis vi sammenligner ellers identiske 32bit og 64bit arkitekturer, er de generelt ikke så forskellige. Dette er en af ​​grundene til den generelle forvirring hos offentligheden, der leder efter en grund til, hvorfor Apple også flytter til 64bit på mobile enheder. Det hele kommer dog fra de specifikke parametre for A7 (ARM64) processoren og hvordan Apple bruger den, ikke kun fra det faktum at processoren har en 64-bit arkitektur.

Men hvis vi stadig ser på forskellene mellem disse to arkitekturer, vil vi finde flere forskelle. Den åbenlyse er, at 64-bit heltalsregistre kan håndtere 64-bit heltal mere effektivt. Allerede før var det muligt at arbejde med dem på 32-bit processorer, men det betød som regel at dele dem op i 32-bit lange stykker, hvilket medførte langsommere beregninger. Så en 64-bit processor kan generelt beregne med 64-bit typer lige så hurtigt som med 32-bit. Det betyder, at applikationer, der generelt bruger 64-bit-typer, kan køre meget hurtigere på en 64-bit-processor.

Selvom 64bit ikke påvirker den samlede mængde RAM, som processoren kan bruge, kan det gøre det lettere at arbejde med store bidder af RAM i ét program. Ethvert enkelt program, der kører på en 32-bit processor, har kun omkring 4 GB adresseplads. Tager man i betragtning, at operativsystemet og standardbibliotekerne fylder noget, efterlader dette programmet et sted mellem 1-3 GB til applikationsbrug. Men hvis et 32-bit system har mere end 4 GB RAM, er det lidt mere kompliceret at bruge denne hukommelse. Vi er nødt til at ty til at tvinge styresystemet til at kortlægge disse større bidder af hukommelse til vores program (hukommelsesvirtualisering), eller vi kan opdele programmet i flere processer (hvor hver proces igen teoretisk har 4 GB hukommelse til rådighed til direkte adressering).

Disse "hacks" er dog så svære og langsomme, at et minimum af applikationer bruger dem. I praksis vil hvert program på en 32-bit processor kun bruge sine 1-3 GB hukommelse, og mere tilgængelig RAM kan bruges til at køre flere programmer på samme tid eller bruge denne hukommelse som en buffer (caching). Disse anvendelser er praktiske, men vi vil gerne have, at ethvert program nemt kan bruge bidder af hukommelse, der er større end 4 GB.

Nu kommer vi til den hyppige (faktisk ukorrekte) påstand om, at uden mere end 4 GB hukommelse er en 64-bit arkitektur ubrugelig. Et større adresseområde er nyttigt selv på et system med mindre hukommelse. Hukommelseskortede filer er et praktisk værktøj, hvor en del af filens indhold er logisk knyttet til processens hukommelse, uden at hele filen skal indlæses i hukommelsen. Således kan systemet for eksempel gradvist behandle store filer mange gange større end RAM-kapaciteten. På et 32-bit system kan så store filer ikke hukommelsesmappes pålideligt, hvorimod det på et 64-bit system er et stykke kage, takket være det meget større adresserum.

Men den større størrelse af pointere medfører også en stor ulempe: ellers har identiske programmer brug for mere hukommelse på en 64-bit processor (disse større pointere skal gemmes et sted). Da pointere er en hyppig del af programmer, kan denne forskel belaste cachen, hvilket igen får hele systemet til at køre langsommere. Så i perspektiv kan vi se, at hvis vi bare ændrede processorarkitekturen til 64-bit, ville det faktisk bremse hele systemet. Så denne faktor skal balanceres af flere optimeringer andre steder.

ARM64

A7, 64-bit processoren, der driver den nye iPhone 5s, er ikke bare en almindelig ARM-processor med bredere registre. ARM64 indeholder store forbedringer i forhold til den ældre 32-bit version.

Apple A7 processor.

register

ARM64 rummer dobbelt så mange heltalsregistre som 32-bit ARM (pas på ikke at forveksle antallet og bredden af ​​registre - vi talte om bredden i afsnittet "64-bit". Så ARM64 har både dobbelt så brede registre og dobbelt så mange registre). 32-bit ARM har 16 heltalsregistre: en programtæller (PC - indeholder nummeret på den aktuelle instruktion), en stak-pointer (en pointer til en igangværende funktion), et linkregister (en pointer til returneringen efter slutningen af funktionen), og de resterende 13 er til applikationsbrug. Imidlertid har ARM64 32 heltalsregistre, inklusive et nulregister, et linkregister, en rammepointer (svarende til en stak-pointer) og en reserveret til fremtiden. Dette efterlader os med 28 registre til applikationsbrug, mere end det dobbelte af 32-bit ARM. Samtidig fordoblede ARM64 antallet af floating-point number (FPU) registre fra 16 til 32 128-bit registre.

Men hvorfor er antallet af registre så vigtigt? Hukommelse er generelt langsommere end CPU-beregninger, og læsning/skrivning kan tage meget lang tid. Dette ville få den hurtige processor til at blive ved med at vente på hukommelsen, og vi ville ramme systemets naturlige hastighedsgrænse. Processorer forsøger at skjule dette handicap med lag af buffere, men selv den hurtigste (L1) er stadig langsommere end processorens beregning. Imidlertid er registre hukommelsesceller direkte i processoren, og deres læsning/skrivning er hurtig nok til ikke at bremse processoren. Antallet af registre betyder praktisk talt mængden af ​​den hurtigste hukommelse til processorberegninger, hvilket i høj grad påvirker hele systemets hastighed.

Samtidig har denne hastighed brug for god optimeringsstøtte fra compileren, så sproget kan bruge disse registre og ikke skal gemme alt i den generelle applikation (den langsomme) hukommelse.

Instruktionssæt

ARM64 bringer også store ændringer til instruktionssættet. Et instruktionssæt er et sæt atomoperationer, som en processor kan udføre (f.eks. tilføjer 'ADD register1 register2' tallene i to registre). De funktioner, der er tilgængelige for de enkelte sprog, er sammensat af disse instruktioner. Mere komplekse funktioner skal udføre flere instruktioner, så de kan være langsommere.

Nyt i ARM64 er instruktioner til AES-kryptering, SHA-1 og SHA-256 hash-funktioner. Så i stedet for en kompleks implementering er det kun sproget, der kalder denne instruktion - hvilket vil bringe en enorm fremskyndelse af beregningen af ​​sådanne funktioner og forhåbentlig øget sikkerhed i applikationer. F.eks. det nye Touch ID bruger også disse instruktioner i kryptering, hvilket giver mulighed for reel hastighed og sikkerhed (i teorien skulle en angriber selv modificere processoren for at få adgang til dataene - hvilket mildest talt er upraktisk i betragtning af dens miniaturestørrelse).

Kompatibilitet med 32bit

Det er vigtigt at nævne, at A7 kan køre fuldt ud i 32-bit tilstand uden behov for emulering. Det betyder, at den nye iPhone 5s kan køre applikationer kompileret på 32-bit ARM uden nogen afmatning. Så kan den dog ikke bruge de nye ARM64-funktioner, så det kan altid betale sig at lave en speciel build kun til A7, som skal køre meget hurtigere.

Ændringer i kørselstid

Runtime er den kode, der tilføjer funktioner til programmeringssproget, som den er i stand til at bruge, mens applikationen kører, indtil efter oversættelse. Da Apple ikke har behov for at opretholde applikationskompatibilitet (at en 64-bit binær kører på 32-bit), kunne de tillade sig at lave et par flere forbedringer til Objective-C-sproget.

En af dem er den såkaldte mærket pointer (markeret indikator). Normalt er objekter og pointere til disse objekter gemt i separate dele af hukommelsen. Men nye pointertyper tillader klasser med få data at gemme objekter direkte i markøren. Dette trin eliminerer behovet for at allokere hukommelse direkte til objektet, bare opret en markør og objektet inde i det. Taggede pointere understøttes kun i 64-bit arkitektur også på grund af det faktum, at der ikke længere er plads nok i en 32-bit pointer til at gemme nok nyttige data. Derfor understøttede iOS, i modsætning til OS X, endnu ikke denne funktion. Men med ankomsten af ​​ARM64 ændrer dette sig, og iOS har også indhentet OS X i denne henseende.

Selvom pointere er 64 bit lange, bruges der på ARM64 kun 33 bit til pointerens egen adresse. Og hvis vi er i stand til pålideligt at afmaske resten af ​​pointer-bittene, kan vi bruge denne plads til at gemme yderligere data – som i tilfældet med de nævnte mærkede pointere. Konceptuelt er dette en af ​​de største ændringer i Objective-C's historie, selvom det ikke er en funktion, der kan sælges - så de fleste brugere vil ikke vide, hvordan Apple flytter Objective-C fremad.

Hvad angår de nyttige data, der kan gemmes i den resterende plads af en sådan tagget pointer, bruger Objective-C det nu f.eks. til at gemme den såkaldte referenceantal (antal referencer). Tidligere blev referencetællingen gemt et andet sted i hukommelsen, i en hash-tabel, der var forberedt til det, men dette kunne bremse hele systemet i tilfælde af et stort antal alloc/dealloc/retain/release opkald. Bordet skulle låses på grund af gevindsikkerhed, så referencetallet for to objekter i to gevind kunne ikke ændres på samme tid. Denne værdi er dog nyindsat i resten af ​​den såkaldte isa indikatorer. Dette er endnu en iøjnefaldende, men enorm fordel og acceleration i fremtiden. Dette kunne dog aldrig opnås i en 32-bit arkitektur.

Oplysninger om tilknyttede objekter, om objektet er svagt refereret, om det er nødvendigt at generere en destruktor til objektet osv., er også nyindsat i det resterende sted af pointere til objekterne. Takket være denne information er Objective-C runtime er i stand til fundamentalt at fremskynde runtime, hvilket afspejles i hastigheden af ​​hver applikation. Fra test betyder det omkring 40-50% fremskyndelse af alle hukommelsesstyringsopkald. Bare ved at skifte til 64-bit pointere og bruge denne nye plads.

Záver

Selvom konkurrenter vil forsøge at udbrede ideen om, at det er unødvendigt at flytte til en 64-bit arkitektur, vil du allerede vide, at dette kun er en meget uvidende mening. Det er rigtigt, at blot at skifte til 64bit uden at tilpasse sproget eller applikationerne til det, ikke rigtig betyder noget – det bremser endda hele systemet. Men den nye A7 bruger en moderne ARM64 med et nyt instruktionssæt, og Apple har gjort sig den ulejlighed at modernisere hele Objective-C sproget og udnytte de nye muligheder – deraf den lovede speedup.

Her har vi nævnt en lang række grunde til, at en 64-bit arkitektur er det rigtige skridt fremad. Det er endnu en revolution "under motorhjelmen", takket være hvilken Apple vil forsøge at holde sig på forkant, ikke kun med design, brugergrænseflade og rigt økosystem, men hovedsageligt med de mest moderne teknologier på markedet.

kilde: mikeash.com
.