Zatvori oglas

Mike Ash posvećeno na svom blogu praktične implikacije prelaska na 64-bitnu arhitekturu u iPhone 5S. Ovaj članak se oslanja na njegove nalaze.

Razlog za ovaj tekst je uglavnom zbog velike količine dezinformacija koje se šire o tome šta novi iPhone 5s sa 64-bitnim ARM procesorom zapravo znači za korisnike i tržište. Ovdje ćemo pokušati donijeti objektivne informacije o performansama, mogućnostima i implikacijama ove tranzicije za programere.

"64 bit"

Postoje dva dela procesora na koja se oznaka "X-bit" može odnositi - širina celobrojnih registara i širina pokazivača. Srećom, na većini modernih procesora ove širine su iste, tako da u slučaju A7 to znači 64-bitne cjelobrojne registre i 64-bitne pokazivače.

Međutim, jednako je važno istaći šta "64bit" NE znači: Veličina fizičke adrese RAM-a. Broj bitova za komunikaciju sa RAM-om (dakle, količina RAM-a koju uređaj može da podrži) nije povezan sa brojem CPU bitova. ARM procesori imaju bilo gde između 26- i 40-bitnih adresa i mogu se menjati nezavisno od ostatka sistema.

  • Veličina magistrale podataka. Količina podataka primljenih iz RAM-a ili međumemorije je na sličan način nezavisna od ovog faktora. Pojedinačne instrukcije procesora mogu zahtijevati različite količine podataka, ali se oni ili šalju u komadima ili primaju više nego što je potrebno iz memorije. Zavisi od veličine kvanta podataka. iPhone 5 već prima podatke iz memorije u 64-bitnim kvantima (i ima 32-bitni procesor), a možemo naići i na veličine do 192 bita.
  • Bilo šta vezano za pokretni zarez. Veličina takvih registara (FPU) je opet nezavisna od internog rada procesora. ARM koristi 64-bitni FPU od prije ARM64 (64-bitni ARM procesor).

Opće prednosti i nedostaci

Ako uporedimo inače identične 32-bitne i 64-bitne arhitekture, one se uglavnom ne razlikuju toliko. Ovo je jedan od razloga za opću zbunjenost javnosti koja traži razlog zašto Apple prelazi na 64-bit i na mobilnim uređajima. Međutim, sve dolazi iz specifičnih parametara A7 (ARM64) procesora i načina na koji ga Apple koristi, a ne samo iz činjenice da procesor ima 64-bitnu arhitekturu.

Međutim, ako još uvijek pogledamo razlike između ove dvije arhitekture, naći ćemo nekoliko razlika. Očigledno je da 64-bitni celobrojni registri mogu efikasnije da rukuju 64-bitnim celim brojevima. Čak je i prije bilo moguće raditi s njima na 32-bitnim procesorima, ali to je obično značilo podjelu na 32-bitne dugačke dijelove, što je uzrokovalo sporije proračune. Dakle, 64-bitni procesor općenito može računati sa 64-bitnim tipovima jednako brzo kao i sa 32-bitnim. To znači da aplikacije koje općenito koriste 64-bitne tipove mogu raditi mnogo brže na 64-bitnom procesoru.

Iako 64bit ne utiče na ukupnu količinu RAM-a koju procesor može da koristi, može olakšati rad sa velikim delovima RAM-a u jednom programu. Svaki pojedinačni program koji radi na 32-bitnom procesoru ima samo oko 4 GB adresnog prostora. Uzimajući u obzir da operativni sistem i standardne biblioteke nešto zauzimaju, ovo ostavlja programu negdje između 1-3 GB za korištenje aplikacije. Međutim, ako 32-bitni sistem ima više od 4 GB RAM-a, korištenje te memorije je malo složenije. Moramo pribjeći prisiljavanju operativnog sistema da mapira ove veće komade memorije za naš program (virtuelizacija memorije), ili možemo podijeliti program na više procesa (gdje svaki proces opet teoretski ima 4 GB memorije dostupne za direktno adresiranje).

Međutim, ovi "hakovi" su toliko teški i spori da ih koristi minimalan broj aplikacija. U praksi, na 32-bitnom procesoru, svaki program će koristiti samo svojih 1-3 GB memorije, a više raspoložive RAM memorije može se koristiti za pokretanje više programa u isto vrijeme ili korištenje ove memorije kao bafera (keširanje). Ove namjene su praktične, ali bismo željeli da bilo koji program može lako koristiti dijelove memorije veće od 4 GB.

Sada dolazimo do česte (zapravo netačne) tvrdnje da je bez više od 4 GB memorije 64-bitna arhitektura beskorisna. Veći adresni prostor je koristan čak i na sistemu sa manje memorije. Datoteke mapirane u memoriju su zgodan alat gdje je dio sadržaja datoteke logički povezan sa memorijom procesa bez potrebe da se cijeli fajl učitava u memoriju. Tako sistem može, na primjer, postepeno obraditi velike datoteke mnogo puta veće od kapaciteta RAM-a. Na 32-bitnom sistemu, tako velike datoteke ne mogu se pouzdano mapirati u memoriju, dok je na 64-bitnom sistemu to jednostavno, zahvaljujući mnogo većem adresnom prostoru.

Međutim, veća veličina pokazivača također donosi jedan veliki nedostatak: inače identični programi trebaju više memorije na 64-bitnom procesoru (ovi veći pokazivači moraju biti pohranjeni negdje). Budući da su pokazivači čest dio programa, ova razlika može opteretiti keš memoriju, što zauzvrat uzrokuje da cijeli sistem radi sporije. Dakle, u perspektivi, možemo vidjeti da ako samo promijenimo arhitekturu procesora u 64-bitnu, to bi zapravo usporilo cijeli sistem. Dakle, ovaj faktor mora biti uravnotežen sa više optimizacija na drugim mjestima.

ARM64

A7, 64-bitni procesor koji pokreće novi iPhone 5s, nije samo običan ARM procesor sa širim registrima. ARM64 sadrži velika poboljšanja u odnosu na stariju, 32-bitnu verziju.

Apple A7 procesor.

registar

ARM64 sadrži duplo više celobrojnih registara nego 32-bitni ARM (pazite da ne pobrkate broj i širinu registara - govorili smo o širini u odeljku "64-bit". Dakle, ARM64 ima i duplo šire registre i duplo više registri). 32-bitni ARM ima 16 celobrojnih registara: jedan programski brojač (PC - sadrži broj trenutne instrukcije), pokazivač steka (pokazivač na funkciju u toku), registar veze (pokazivač na povratak nakon završetka funkcije), a preostalih 13 je za upotrebu u aplikacijama. Međutim, ARM64 ima 32 celobrojna registra, uključujući jedan nulti registar, registar veze, pokazivač okvira (slično pokazivaču steka) i jedan rezervisan za budućnost. Ovo nam ostavlja 28 registara za upotrebu u aplikacijama, što je više nego dvostruko više od 32-bitnog ARM-a. U isto vrijeme, ARM64 je udvostručio broj registara brojeva s pomičnim zarezom (FPU) sa 16 na 32 128-bitna registra.

Ali zašto je broj registara toliko važan? Memorija je generalno sporija od CPU proračuna i čitanje/pisanje može potrajati jako dugo. Zbog toga bi brzi procesor morao stalno čekati na memoriju, a mi bismo dostigli prirodno ograničenje brzine sistema. Procesori pokušavaju da sakriju ovaj nedostatak slojevima bafera, ali čak i onaj najbrži (L1) je i dalje sporiji od procesorskog proračuna. Međutim, registri su memorijske ćelije direktno u procesoru i njihovo čitanje/pisanje je dovoljno brzo da ne uspori procesor. Broj registara praktično znači količinu najbrže memorije za procesorske proračune, što u velikoj meri utiče na brzinu čitavog sistema.

U isto vrijeme, ovoj brzini je potrebna dobra podrška za optimizaciju od kompajlera, tako da jezik može koristiti ove registre i ne mora sve pohranjivati ​​u opštu (sporu) memoriju aplikacije.

Set instrukcija

ARM64 također donosi velike promjene u skupu instrukcija. Skup instrukcija je skup atomskih operacija koje procesor može izvesti (npr. 'ADD register1 register2' dodaje brojeve u dva registra). Funkcije dostupne pojedinačnim jezicima sastavljene su od ovih uputstava. Složenije funkcije moraju izvršiti više instrukcija, tako da mogu biti sporije.

Novo u ARM64 su instrukcije za AES enkripciju, SHA-1 i SHA-256 hash funkcije. Dakle, umjesto složene implementacije, samo će jezik zvati ovu instrukciju - što će donijeti ogromno ubrzanje izračunavanja takvih funkcija i, nadamo se, dodatnu sigurnost u aplikacijama. Npr. novi Touch ID takođe koristi ove instrukcije u šifrovanju, omogućavajući stvarnu brzinu i sigurnost (u teoriji, napadač bi morao da modifikuje sam procesor da bi pristupio podacima - što je u najmanju ruku nepraktično s obzirom na njegovu minijaturnu veličinu).

Kompatibilnost sa 32bit

Važno je napomenuti da A7 može raditi u potpunosti u 32-bitnom modu bez potrebe za emulacijom. To znači da novi iPhone 5s može pokretati aplikacije kompajlirane na 32-bitnom ARM-u bez ikakvog usporavanja. Međutim, tada ne može koristiti nove funkcije ARM64, tako da uvijek vrijedi napraviti poseban build samo za A7, koji bi trebao raditi mnogo brže.

Promjene vremena izvođenja

Runtime je kod koji dodaje funkcije programskom jeziku, koje može koristiti dok je aplikacija pokrenuta, sve do prijevoda. Budući da Apple ne mora održavati kompatibilnost aplikacija (da 64-bitna binarna datoteka radi na 32-bitnoj), mogli bi sebi priuštiti još nekoliko poboljšanja jezika Objective-C.

Jedan od njih je tzv označeni pokazivač (označeni pokazivač). Obično se objekti i pokazivači na te objekte pohranjuju u odvojenim dijelovima memorije. Međutim, novi tipovi pokazivača dozvoljavaju klasama s malo podataka da pohranjuju objekte direktno u pokazivač. Ovaj korak eliminira potrebu da se memorija dodijeli direktno objektu, samo kreirajte pokazivač i objekt unutar njega. Označeni pokazivači su podržani samo u 64-bitnoj arhitekturi i zbog činjenice da više nema dovoljno prostora u 32-bitnom pokazivaču za pohranjivanje dovoljno korisnih podataka. Stoga iOS, za razliku od OS X, još nije podržavao ovu funkciju. Međutim, dolaskom ARM64 to se mijenja, a iOS je i po tom pitanju sustigao OS X.

Iako su pokazivači dugi 64 bita, na ARM64 se samo 33 bita koriste za vlastitu adresu pokazivača. A ako smo u mogućnosti da pouzdano demaskiramo ostatak bitova pokazivača, možemo koristiti ovaj prostor za pohranjivanje dodatnih podataka – kao u slučaju spomenutih označenih pokazivača. Konceptualno, ovo je jedna od najvećih promjena u historiji Objective-C, iako nije tržišna karakteristika - tako da većina korisnika neće znati kako Apple ide naprijed prema Objective-C.

Što se tiče korisnih podataka koji se mogu pohraniti u preostalom prostoru tako označenog pokazivača, Objective-C ga, na primjer, sada koristi za pohranjivanje tzv. broj referenci (broj referenci). Ranije je referentni broj bio pohranjen na drugom mjestu u memoriji, u hash tabeli pripremljenoj za to, ali bi to moglo usporiti cijeli sistem u slučaju velikog broja poziva alloc/dealloc/retain/release. Tabela je morala biti zaključana zbog sigurnosti niti, tako da se broj referenci dva objekta u dvije niti nije mogao mijenjati u isto vrijeme. Međutim, ova vrijednost je novo umetnuta u ostatak tzv je indikatori. Ovo je još jedna neupadljiva, ali ogromna prednost i ubrzanje u budućnosti. Međutim, to se nikada ne može postići u 32-bitnoj arhitekturi.

Informacije o pridruženim objektima, da li je objekt slabo referenciran, da li je potrebno generirati destruktor za objekt, itd., također se novo ubacuju na preostalo mjesto pokazivača na objekte. Zahvaljujući ovim informacijama, Objective-C runtime može fundamentalno ubrzati vrijeme izvođenja, što se odražava u brzini svake aplikacije. Iz testiranja, to znači oko 40-50% ubrzanja svih poziva upravljanja memorijom. Samo prelaskom na 64-bitne pokazivače i korištenjem ovog novog prostora.

Zaključak

Iako će konkurenti pokušati proširiti ideju da je prelazak na 64-bitnu arhitekturu nepotreban, već ćete znati da je to samo vrlo neupućeno mišljenje. Istina je da prelazak na 64-bitni bez prilagođavanja vašeg jezika ili aplikacija zapravo ne znači ništa - čak usporava cijeli sistem. Ali novi A7 koristi moderan ARM64 sa novim skupom instrukcija, a Apple se potrudio da modernizuje ceo Objective-C jezik i iskoristi prednosti novih mogućnosti – otuda i obećano ubrzanje.

Ovdje smo spomenuli veliki broj razloga zašto je 64-bitna arhitektura pravi korak naprijed. Riječ je o još jednoj revoluciji "ispod haube", zahvaljujući kojoj će Apple pokušati ostati u prvom planu ne samo dizajnom, korisničkim interfejsom i bogatim ekosistemom, već uglavnom najsavremenijim tehnologijama na tržištu.

Izvor: mikeash.com
.