Stäng annons

Mike Ash tillägnad sin blogg de praktiska konsekvenserna av att byta till 64-bitars arkitektur i iPhone 5S. Den här artikeln bygger på hans upptäckter.

Anledningen till denna text beror främst på den stora mängd felaktig information som sprids om vad den nya iPhone 5s med en 64-bitars ARM-processor faktiskt betyder för användarna och marknaden. Här kommer vi att försöka ta fram objektiv information om prestanda, kapacitet och implikationer av denna övergång för utvecklare.

"64 bitar"

Det finns två delar av en processor som "X-bit"-etiketten kan referera till - bredden på heltalsregistren och bredden på pekarna. Lyckligtvis är dessa bredder desamma på de flesta moderna processorer, så i fallet med A7 betyder det 64-bitars heltalsregister och 64-bitars pekare.

Det är dock lika viktigt att påpeka vad "64bit" INTE betyder: RAM fysisk adressstorlek. Antalet bitar att kommunicera med RAM (därmed mängden RAM som en enhet kan stödja) är inte relaterat till antalet CPU-bitar. ARM-processorer har någonstans mellan 26- och 40-bitars adresser och kan ändras oberoende av resten av systemet.

  • Databussstorlek. Mängden data som tas emot från RAM eller buffertminne är på liknande sätt oberoende av denna faktor. Individuella processorinstruktioner kan begära olika mängder data, men de skickas antingen i bitar eller tas emot mer än vad som behövs från minnet. Det beror på storleken på datakvantumet. iPhone 5 tar redan emot data från minnet i 64-bitars kvanta (och har en 32-bitars processor), och vi kan stöta på storlekar upp till 192 bitar.
  • Allt som har med flyttal att göra. Storleken på sådana register (FPU) är återigen oberoende av processorns interna funktion. ARM har använt 64-bitars FPU sedan innan ARM64 (64-bitars ARM-processor).

Allmänna fördelar och nackdelar

Om vi ​​jämför annars identiska 32-bitars och 64-bitars arkitekturer är de i allmänhet inte så olika. Detta är en av anledningarna till den allmänna förvirringen hos allmänheten som letar efter en anledning till varför Apple går över till 64bit även i mobila enheter. Men allt kommer från de specifika parametrarna för A7 (ARM64)-processorn och hur Apple använder den, inte bara från det faktum att processorn har en 64-bitars arkitektur.

Men om vi fortfarande tittar på skillnaderna mellan dessa två arkitekturer kommer vi att hitta flera skillnader. Det uppenbara är att 64-bitars heltalsregister kan hantera 64-bitars heltal mer effektivt. Redan tidigare gick det att arbeta med dem på 32-bitars processorer, men det innebar oftast att man delade upp dem i 32-bitars långa bitar, vilket orsakade långsammare beräkningar. Så en 64-bitars processor kan i allmänhet beräkna med 64-bitarstyper lika snabbt som med 32-bitars. Detta innebär att applikationer som vanligtvis använder 64-bitarstyper kan köras mycket snabbare på en 64-bitars processor.

Även om 64bit inte påverkar den totala mängden RAM som processorn kan använda, kan det göra det lättare att arbeta med stora bitar RAM i ett program. Varje enskilt program som körs på en 32-bitars processor har bara cirka 4 GB adressutrymme. Med tanke på att operativsystemet och standardbiblioteken tar upp något, lämnar detta programmet med någonstans mellan 1-3 GB för applikationsanvändning. Men om ett 32-bitarssystem har mer än 4 GB RAM, är det lite mer komplicerat att använda det minnet. Vi måste tillgripa att tvinga operativsystemet att mappa dessa större minnesbitar för vårt program (minnesvirtualisering), eller så kan vi dela upp programmet i flera processer (där varje process återigen teoretiskt har 4 GB minne tillgängligt för direkt adressering).

Men dessa "hack" är så svåra och långsamma att ett minimum av applikationer använder dem. I praktiken, på en 32-bitars processor, kommer varje program bara att använda sina 1-3 GB minne, och mer tillgängligt RAM-minne kan användas för att köra flera program samtidigt eller använda detta minne som en buffert (cachelagring). Dessa användningsområden är praktiska, men vi vill att alla program enkelt ska kunna använda minnesbitar större än 4 GB.

Nu kommer vi till det frekventa (faktiskt felaktiga) påståendet att utan mer än 4 GB minne är en 64-bitars arkitektur värdelös. Ett större adressutrymme är användbart även på ett system med mindre minne. Minnesmappade filer är ett praktiskt verktyg där en del av filens innehåll logiskt kopplas till processens minne utan att hela filen behöver laddas in i minnet. Således kan systemet till exempel successivt bearbeta stora filer många gånger större än RAM-kapaciteten. På ett 32-bitarssystem kan så stora filer inte minnesmappas på ett tillförlitligt sätt, medan det på ett 64-bitarssystem är en lappa, tack vare det mycket större adressutrymmet.

Men den större storleken på pekare medför också en stor nackdel: annars behöver identiska program mer minne på en 64-bitars processor (dessa större pekare måste lagras någonstans). Eftersom pekare är en frekvent del av program kan denna skillnad belasta cachen, vilket i sin tur gör att hela systemet går långsammare. Så i perspektiv kan vi se att om vi bara ändrade processorarkitekturen till 64-bitars, skulle det faktiskt sakta ner hela systemet. Så denna faktor måste balanseras av fler optimeringar på andra ställen.

ARM64

A7, 64-bitarsprocessorn som driver den nya iPhone 5s, är inte bara en vanlig ARM-processor med bredare register. ARM64 innehåller stora förbättringar jämfört med den äldre 32-bitarsversionen.

Apple A7-processor.

register

ARM64 rymmer dubbelt så många heltalsregister som 32-bitars ARM (var noga med att inte blanda ihop antalet och bredden på register - vi pratade om bredd i avsnittet "64-bitar". Så ARM64 har både dubbelt så breda register och dubbelt så många register). 32-bitars ARM har 16 heltalsregister: en programräknare (PC - innehåller numret på den aktuella instruktionen), en stackpekare (en pekare till en pågående funktion), ett länkregister (en pekare till returen efter slutet av funktionen), och de återstående 13 är för applikationsanvändning. Emellertid har ARM64 32 heltalsregister, inklusive ett nollregister, ett länkregister, en rampekare (liknande en stackpekare) och en reserverad för framtiden. Detta lämnar oss med 28 register för applikationsanvändning, mer än dubbelt så mycket som 32-bitars ARM. Samtidigt fördubblade ARM64 antalet flyttalsregister (FPU) från 16 till 32 128-bitars register.

Men varför är antalet register så viktigt? Minnet är i allmänhet långsammare än CPU-beräkningar och att läsa/skriva kan ta mycket lång tid. Detta skulle göra att den snabba processorn måste fortsätta vänta på minne och vi skulle nå systemets naturliga hastighetsgräns. Processorer försöker dölja detta handikapp med lager av buffertar, men även den snabbaste (L1) är fortfarande långsammare än processorns beräkning. Däremot är register minnesceller direkt i processorn och deras läsning/skrivning är tillräckligt snabb för att inte sakta ner processorn. Antalet register betyder praktiskt taget mängden snabbaste minne för processorns beräkningar, vilket i hög grad påverkar hastigheten i hela systemet.

Samtidigt behöver denna hastighet bra optimeringsstöd från kompilatorn, så att språket kan använda dessa register och inte behöver lagra allt i det allmänna applikationsminnet (det långsamma).

Instruktionsuppsättning

ARM64 medför också stora förändringar i instruktionsuppsättningen. En instruktionsuppsättning är en uppsättning atomoperationer som en processor kan utföra (t.ex. 'ADD register1 register2' adderar siffrorna i två register). De funktioner som är tillgängliga för enskilda språk är sammansatta av dessa instruktioner. Mer komplexa funktioner måste utföra fler instruktioner, så de kan vara långsammare.

Nytt i ARM64 är instruktioner för AES-kryptering, SHA-1 och SHA-256 hashfunktioner. Så istället för en komplex implementering är det bara språket som kommer att anropa denna instruktion - vilket kommer att ge en enorm snabbhet i beräkningen av sådana funktioner och förhoppningsvis ökad säkerhet i applikationer. T.ex. det nya Touch ID använder också dessa instruktioner för kryptering, vilket möjliggör verklig hastighet och säkerhet (i teorin skulle en angripare behöva modifiera själva processorn för att komma åt data - minst sagt opraktiskt med tanke på dess miniatyrstorlek).

Kompatibilitet med 32bit

Det är viktigt att nämna att A7 kan köras fullt ut i 32-bitarsläge utan behov av emulering. Det betyder att den nya iPhone 5s kan köra applikationer kompilerade på 32-bitars ARM utan någon avmattning. Men då kan den inte använda de nya ARM64-funktionerna, så det är alltid värt att göra en specialbygge bara för A7, som ska gå mycket snabbare.

Körtid ändras

Runtime är koden som lägger till funktioner till programmeringsspråket, som den kan använda medan applikationen körs, tills efter översättning. Eftersom Apple inte behöver upprätthålla programkompatibilitet (att en 64-bitars binär körs på 32-bitars), skulle de ha råd att göra några fler förbättringar av Objective-C-språket.

En av dem är den sk taggad pekare (markerad indikator). Normalt lagras objekt och pekare till dessa objekt i separata delar av minnet. Men nya pekartyper tillåter klasser med lite data att lagra objekt direkt i pekaren. Detta steg eliminerar behovet av att allokera minne direkt för objektet, skapa bara en pekare och objektet inuti det. Taggade pekare stöds endast i 64-bitars arkitektur också på grund av att det inte längre finns tillräckligt med utrymme i en 32-bitars pekare för att lagra tillräckligt med användbar data. Därför stödde iOS, till skillnad från OS X, ännu inte den här funktionen. Men med ankomsten av ARM64 förändras detta, och iOS har kommit ikapp OS X även i detta avseende.

Även om pekare är 64 bitar långa, används på ARM64 endast 33 bitar för pekarens egen adress. Och om vi på ett tillförlitligt sätt kan demaskera resten av pekarbitarna, kan vi använda detta utrymme för att lagra ytterligare data – som i fallet med de nämnda taggade pekarna. Konceptuellt är detta en av de största förändringarna i Objective-Cs historia, även om det inte är en säljbar funktion - så de flesta användare kommer inte att veta hur Apple flyttar Objective-C framåt.

När det gäller användbar data som kan lagras i det återstående utrymmet av en sådan taggad pekare, använder nu till exempel Objective-C den för att lagra den s.k. referensantal (antal referenser). Tidigare har referensräkningen lagrats på en annan plats i minnet, i en hash-tabell förberedd för det, men detta kunde bromsa hela systemet vid ett stort antal alloc/dealloc/retain/release-samtal. Bordet var tvungen att låsas på grund av gängsäkerhet, så referenstalet för två objekt i två gängor kunde inte ändras samtidigt. Detta värde är dock nyinfört i resten av den sk isa indikatorer. Detta är en annan oansenlig, men enorm fördel och acceleration i framtiden. Detta kunde dock aldrig uppnås i en 32-bitars arkitektur.

Information om associerade objekt, om objektet är svagt refererat, om det är nödvändigt att generera en destruktor för objektet, etc., infogas också nyligen i den återstående platsen för pekare till objekten. Tack vare denna information har Objective-C runtime kan i grunden påskynda körtiden, vilket återspeglas i hastigheten för varje applikation. Från att testa innebär detta cirka 40-50% snabbare av alla minneshanteringssamtal. Bara genom att byta till 64-bitars pekare och använda detta nya utrymme.

Záver

Även om konkurrenter kommer att försöka sprida idén om att det är onödigt att flytta till en 64-bitarsarkitektur, vet du redan att detta bara är en mycket oinformerad åsikt. Det är sant att att byta till 64-bitars utan att anpassa ditt språk eller dina applikationer egentligen inte betyder någonting – det saktar till och med ner hela systemet. Men nya A7 använder en modern ARM64 med en ny instruktionsuppsättning, och Apple har gjort sig besväret att modernisera hela Objective-C-språket och dra nytta av de nya funktionerna – därav den utlovade snabbheten.

Här har vi nämnt ett stort antal anledningar till varför en 64-bitars arkitektur är rätt steg framåt. Det är ytterligare en revolution "under huven", tack vare vilken Apple kommer att försöka ligga i framkant inte bara med design, användargränssnitt och rikt ekosystem, utan främst med de modernaste teknikerna på marknaden.

källa: mikeash.com
.