Hirdetés bezárása

Mike Ash blogjában dedikált a 64 bites architektúrára való váltás gyakorlati következményei az iPhone 5S-ben. Ez a cikk az ő megállapításaira támaszkodik.

Ennek a szövegnek az oka elsősorban az, hogy nagy mennyiségű téves információ terjed arról, hogy mit is jelent az új, 5 bites ARM processzorral szerelt iPhone 64s a felhasználók és a piac számára. Itt megpróbálunk objektív információkat közölni a fejlesztők számára az átállás teljesítményéről, képességeiről és következményeiről.

"64 bites"

A processzornak két olyan része van, amelyre az "X-bit" címke utalhat: az egész regiszterek szélessége és a mutatók szélessége. Szerencsére a legtöbb modern processzoron ezek a szélességek megegyeznek, így az A7 esetében ez 64 bites integer regisztereket és 64 bites mutatókat jelent.

Ugyanakkor ugyanilyen fontos kiemelni, hogy a "64 bites" mit NEM jelent: RAM fizikai cím mérete. A RAM-mal való kommunikációhoz szükséges bitek száma (tehát az eszköz által támogatott RAM mennyisége) nincs összefüggésben a CPU bitek számával. Az ARM processzorok 26 és 40 bites címekkel rendelkeznek, és a rendszer többi részétől függetlenül megváltoztathatók.

  • Adatbusz mérete. A RAM-ból vagy puffermemóriából kapott adatok mennyisége hasonlóan független ettől a tényezőtől. Az egyes processzorok utasításai eltérő mennyiségű adatot kérhetnek, de vagy darabokban küldik el, vagy a szükségesnél többet kapnak a memóriából. Ez az adatkvantum méretétől függ. Az iPhone 5 már 64 bites kvantumban kap adatokat a memóriából (és 32 bites processzorral rendelkezik), és akár 192 bites méretekkel is találkozhatunk.
  • Bármi, ami a lebegőponttal kapcsolatos. Az ilyen regiszterek (FPU) mérete ismét független a processzor belső működésétől. Az ARM 64 bites FPU-t használ az ARM64 (64 bites ARM processzor) előtt.

Általános előnyök és hátrányok

Ha összehasonlítjuk az egyébként azonos 32 bites és 64 bites architektúrákat, általában nem különböznek annyira. Ez az egyik oka a közvélemény általános zűrzavarának, ami azt keresi, hogy az Apple miért tér át a 64 bitesre a mobileszközökön is. Mindez azonban az A7 (ARM64) processzor sajátos paramétereiből és az Apple használatából fakad, nem csak abból, hogy a processzor 64 bites architektúrával rendelkezik.

Ha azonban továbbra is megvizsgáljuk a két architektúra közötti különbségeket, több különbséget is találunk. A nyilvánvaló az, hogy a 64 bites egész regiszterek hatékonyabban tudják kezelni a 64 bites egész számokat. Korábban is lehetett velük dolgozni 32 bites processzorokon, de ez általában azt jelentette, hogy 32 bites darabokra osztották őket, ami lassabb számításokat okozott. Tehát egy 64 bites processzor általában ugyanolyan gyorsan tud számolni a 64 bites típusokkal, mint a 32 bitesekkel. Ez azt jelenti, hogy az általában 64 bites típusokat használó alkalmazások sokkal gyorsabban futhatnak 64 bites processzoron.

Bár a 64 bit nem befolyásolja a processzor által felhasználható RAM teljes mennyiségét, megkönnyítheti a nagy RAM-darabokkal való munkát egy programban. Bármely 32 bites processzoron futó program csak körülbelül 4 GB címterülettel rendelkezik. Figyelembe véve, hogy az operációs rendszer és a szabványos könyvtárak foglalnak valamit, így a programnak valahol 1-3 GB marad az alkalmazás használatára. Ha azonban egy 32 bites rendszer több mint 4 GB RAM-mal rendelkezik, akkor a memória használata egy kicsit bonyolultabb. Kényszerítenünk kell az operációs rendszert, hogy ezeket a nagyobb memóriadarabokat térképezze fel programunk számára (memóriavirtualizáció), vagy feloszthatjuk a programot több folyamatra (ahol minden folyamatnak elméletileg ismét 4 GB szabad memóriája van a közvetlen címzésre).

Ezek a "hackek" azonban olyan nehézkesek és lassúak, hogy minimális alkalmazás használja őket. A gyakorlatban egy 32 bites processzoron minden program csak a maga 1-3 GB memóriáját használja, és több rendelkezésre álló RAM használható több program egyidejű futtatására, vagy ezt a memóriát pufferként (caching) használhatja. Ezek a felhasználási módok praktikusak, de szeretnénk, ha bármely program könnyedén használhatná a 4 GB-nál nagyobb memóriadarabokat.

Most elérkezünk ahhoz a gyakori (valójában téves) állításhoz, hogy 4 GB-nál több memória nélkül hiábavaló a 64 bites architektúra. A nagyobb címterület még a kevesebb memóriával rendelkező rendszereken is hasznos. A memória-leképezett fájlok egy praktikus eszköz, ahol a fájl tartalmának egy része logikailag kapcsolódik a folyamat memóriájához anélkül, hogy a teljes fájlt be kellene tölteni a memóriába. Így a rendszer például fokozatosan képes feldolgozni a RAM kapacitásának sokszorosát meghaladó fájlokat. Egy 32 bites rendszeren az ekkora fájlokat nem lehet megbízhatóan leképezni a memóriakártyával, míg a 64 bites rendszeren ez a jóval nagyobb címtérnek köszönhetően egy darab torta.

A mutatók nagyobb mérete azonban egy nagy hátránnyal is jár: egyébként az azonos programoknak több memóriára van szükségük egy 64 bites processzoron (ezeket a nagyobb mutatókat el kell tárolni valahol). Mivel a mutatók gyakori részét képezik a programoknak, ez a különbség megterhelheti a gyorsítótárat, ami viszont az egész rendszer lassabb működését okozza. Láthatjuk tehát, hogy ha csak a processzor architektúrát 64 bitesre változtatnánk, az valójában lelassítaná az egész rendszert. Tehát ezt a tényezőt más helyeken végzett további optimalizálásokkal kell ellensúlyozni.

ARM64

Az A7, az új iPhone 64s 5 bites processzora nem csupán egy hagyományos ARM processzor szélesebb regiszterekkel. Az ARM64 jelentős fejlesztéseket tartalmaz a régebbi, 32 bites verzióhoz képest.

Apple A7 processzor.

iktató hivatal

Az ARM64 kétszer annyi egész regisztert tartalmaz, mint a 32 bites ARM (vigyázz, ne keverd össze a regiszterek számát és szélességét - a szélességről a "64 bites" részben beszéltünk. Tehát az ARM64-nek kétszer szélesebb és kétszer annyi regisztere van nyilvántartások). A 32 bites ARM 16 egész regiszterrel rendelkezik: egy programszámláló (PC - az aktuális utasítás számát tartalmazza), egy veremmutató (egy folyamatban lévő funkció mutatója), egy linkregiszter (egy mutató a vége utáni visszatérésre) függvény), a maradék 13 pedig alkalmazási használatra szolgál. Az ARM64 azonban 32 egész regiszterrel rendelkezik, köztük egy nulla regiszterrel, egy linkregiszterrel, egy keretmutatóval (hasonlóan a veremmutatóhoz), és egy a jövő számára fenntartott regiszterrel. Így 28 regiszter marad az alkalmazás használatára, ami több mint kétszerese a 32 bites ARM-nek. Ezzel egyidejűleg az ARM64 megduplázta a lebegőpontos szám (FPU) regiszterek számát 16-ról 32 128 bites regiszterre.

De miért olyan fontos a nyilvántartások száma? A memória általában lassabb, mint a CPU számításai, és az olvasás/írás nagyon sokáig tarthat. Így a gyors processzornak folyamatosan várnia kellene a memóriára, és ezzel elérnénk a rendszer természetes sebességkorlátját. A processzorok ezt a hátrányt pufferrétegekkel próbálják elrejteni, de még a leggyorsabb (L1) is lassabb, mint a processzor számítása. A regiszterek azonban közvetlenül a processzorban lévő memóriacellák, és olvasásuk/írásuk elég gyors ahhoz, hogy ne lassítsa le a processzort. A regiszterek száma gyakorlatilag a processzorszámításokhoz a leggyorsabb memória mennyiségét jelenti, ami nagyban befolyásolja a teljes rendszer sebességét.

Ugyanakkor ehhez a sebességhez jó optimalizálási támogatás kell a fordítótól, hogy a nyelv használni tudja ezeket a regisztereket, és ne kelljen mindent az általános alkalmazási (a lassú) memóriában tárolnia.

Utasításkészlet

Az ARM64 az utasításkészletben is jelentős változásokat hoz. Az utasításkészlet olyan atomi műveletek halmaza, amelyeket a processzor végrehajthat (pl. 'ADD register1 register2' összeadja a számokat két regiszterben). Az egyes nyelveken elérhető funkciók ezekből az utasításokból állnak. Az összetettebb függvényeknek több utasítást kell végrehajtaniuk, így lassabbak lehetnek.

Az ARM64 újdonságai az AES titkosításra, az SHA-1 és az SHA-256 hash funkciókra vonatkozó utasítások. Tehát a komplex megvalósítás helyett csak a nyelv fogja ezt az utasítást hívni - ami óriási felgyorsítást hoz az ilyen függvények kiszámításában, és remélhetőleg nagyobb biztonságot az alkalmazásokban. Például. az új Touch ID ezeket az utasításokat használja a titkosításban is, ami valós sebességet és biztonságot tesz lehetővé (elméletileg a támadónak magát a processzort kellene módosítania, hogy hozzáférjen az adatokhoz – miniatűr méretét tekintve ez enyhén szólva nem praktikus).

Kompatibilitás 32 bittel

Fontos megemlíteni, hogy az A7 teljes mértékben tud 32 bites módban futni anélkül, hogy emulációra lenne szükség. Ez azt jelenti, hogy az új iPhone 5s lassulás nélkül képes futtatni a 32 bites ARM-re fordított alkalmazásokat. Ekkor azonban nem tudja használni az új ARM64-es funkciókat, ezért mindig érdemes egy speciális buildet készíteni csak az A7-hez, aminek sokkal gyorsabban kellene futnia.

Futásidejű változások

A futási idő az a kód, amely olyan funkciókat ad hozzá a programozási nyelvhez, amelyeket az alkalmazás futása közben, a fordításig használhat. Mivel az Apple-nek nem kell fenntartania az alkalmazások kompatibilitását (ami 64 bites bináris 32 biten fut), megengedhetik maguknak, hogy néhány további fejlesztést hajtsanak végre az Objective-C nyelven.

Ezek egyike az ún címkézett mutató (jelölt jelző). Általában az objektumokat és az ezekre mutató mutatókat a memória különálló részein tárolják. Az új mutatótípusok azonban lehetővé teszik, hogy a kevés adattal rendelkező osztályok objektumokat közvetlenül a mutatóban tároljanak. Ez a lépés kiküszöböli a memória közvetlen lefoglalásának szükségességét az objektum számára, csak hozzon létre egy mutatót és a benne lévő objektumot. A címkézett mutatókat csak a 64 bites architektúra támogatja, mivel a 32 bites mutatóban már nincs elég hely elegendő hasznos adat tárolására. Ezért az iOS az OS X-től eltérően még nem támogatta ezt a funkciót. Az ARM64 érkezésével azonban ez megváltozik, és az iOS ebből a szempontból is utolérte az OS X-et.

Bár a mutatók 64 bitesek, az ARM64-en csak 33 bitet használnak a mutató saját címére. Ha pedig a többi mutatóbitet megbízhatóan le tudjuk fedni, akkor ezt a helyet további adatok tárolására használhatjuk fel – mint az említett tagged pointerek esetében. Elméletileg ez az egyik legnagyobb változás az Objective-C történetében, bár ez nem piacképes funkció – így a legtöbb felhasználó nem fogja tudni, hogy az Apple hogyan viszi előre az Objective-C-t.

Ami egy ilyen címkézett mutató fennmaradó területén tárolható hasznos adatokat illeti, az Objective-C például ma már az ún. referenciaszám (hivatkozások száma). Korábban a referenciaszámot a memóriában egy másik helyen, egy erre előkészített hash táblában tárolták, de ez nagyszámú alloc/dealloc/retain/release hívás esetén lelassíthatta az egész rendszert. A táblázatot a szálbiztonság miatt le kellett zárni, így két szálban két objektum referenciaszámát nem lehetett egyszerre módosítani. Ez az érték azonban újonnan bekerül a többi ún isa mutatók. Ez egy újabb feltűnő, de hatalmas előny és gyorsulás a jövőben. Ez azonban soha nem érhető el 32 bites architektúrában.

A társított objektumokra vonatkozó információk, hogy az objektumra gyenge hivatkozás, szükséges-e destruktort generálni az objektumhoz stb., szintén újonnan beszúrásra kerül az objektumokra mutató mutató fennmaradó helyére.. Ennek az információnak köszönhetően az Objective-C runtime alapvetően képes felgyorsítani a futásidőt, ami az egyes alkalmazások sebességében is megmutatkozik. A tesztelés alapján ez az összes memóriakezelési hívás körülbelül 40-50%-os felgyorsítását jelenti. Csak úgy, hogy 64 bites mutatókra vált, és használja ezt az új helyet.

Következtetés

Bár a versenytársak megpróbálják elterjeszteni azt a gondolatot, hogy a 64 bites architektúrára való átállás szükségtelen, Ön már tudja, hogy ez csak egy nagyon tájékozatlan vélemény. Igaz, hogy a 64 bitesre váltás a nyelv vagy az alkalmazások adaptálása nélkül nem igazán jelent semmit – még az egész rendszert is lelassítja. De az új A7 modern ARM64-et használ új utasításkészlettel, az Apple pedig vette a fáradságot, hogy modernizálja a teljes Objective-C nyelvet, és kihasználja az új képességeket – innen ered a beígért gyorsulás.

Itt számos okot említettünk, amiért a 64 bites architektúra a megfelelő lépés előre. Újabb forradalomról van szó "a motorháztető alatt", melynek köszönhetően az Apple nem csak a dizájnnal, a felhasználói felülettel és a gazdag ökoszisztémával, hanem elsősorban a piac legmodernebb technológiáival igyekszik az élvonalban maradni.

Forrás: mikeash.com
.