Zatvori oglas

Mike Ash posvetio na svom blogu praktične implikacije prelaska na 64-bitnu arhitekturu u iPhoneu 5S. Ovaj se članak oslanja na njegova otkrića.

Razlog za ovaj tekst je uglavnom zbog velike količine dezinformacija koje se šire o tome što 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 izvedbi, mogućnostima i implikacijama ovog prijelaza za programere.

"64 bita"

Dva su dijela procesora na koje se oznaka "X-bit" može odnositi - širina registara cjelobrojnih brojeva i širina pokazivača. Srećom, kod većine modernih procesora te su širine 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 istaknuti što "64bit" NE znači: Veličina fizičke adrese RAM-a. Broj bitova za komunikaciju s RAM-om (dakle, količina RAM-a koju uređaj može podržati) nije povezana s brojem CPU bitova. ARM procesori imaju adrese između 26 i 40 bita i mogu se mijenjati neovisno o ostatku sustava.

  • Veličina sabirnice podataka. Količina primljenih podataka iz RAM-a ili međuspremnika također je neovisna o ovom faktoru. Pojedinačne instrukcije procesora mogu zahtijevati različite količine podataka, ali se ili šalju u komadima ili iz memorije primaju više nego što je potrebno. Ovisi o veličini kvantuma podataka. iPhone 5 već prima podatke iz memorije u 64-bitnim kvantima (i ima 32-bitni procesor), a možemo susresti veličine do 192 bita.
  • Sve što je povezano s pomičnim zarezom. Veličina takvih registara (FPU) opet je neovisna o unutarnjem radu procesora. ARM koristi 64-bitni FPU od prije ARM64 (64-bitni ARM procesor).

Opće prednosti i nedostaci

Ako usporedimo inače identične 32-bitne i 64-bitne arhitekture, one općenito nisu toliko različite. To je jedan od razloga opće zbunjenosti javnosti koja traži razlog zašto Apple prelazi na 64bit i u mobilnim uređajima. No, sve proizlazi 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, pronaći ćemo nekoliko razlika. Očigledno je da 64-bitni registri cijelih brojeva mogu učinkovitije rukovati 64-bitnim cijelim brojevima. I prije je bilo moguće raditi s njima na 32-bitnim procesorima, ali to je obično značilo njihovo dijeljenje na 32-bitne dijelove, što je uzrokovalo sporije izračune. Dakle, 64-bitni procesor općenito može računati sa 64-bitnim tipovima jednako brzo kao i s 32-bitnim. To znači da aplikacije koje općenito koriste 64-bitne vrste mogu raditi mnogo brže na 64-bitnom procesoru.

Iako 64-bitni ne utječe na ukupnu količinu RAM-a koju procesor može koristiti, može olakšati rad s velikim komadima 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 sustav i standardne biblioteke zauzimaju nešto, to programu ostavlja negdje između 1-3 GB za korištenje aplikacije. Međutim, ako 32-bitni sustav ima više od 4 GB RAM-a, korištenje te memorije je malo kompliciranije. Moramo pribjeći prisiljavanju operativnog sustava da mapira ove veće dijelove memorije za naš program (virtualizacija memorije), ili možemo podijeliti program u više procesa (gdje svaki proces opet teoretski ima 4 GB memorije dostupne za izravno adresiranje).

Međutim, ti "hakovi" su toliko teški i spori da ih koristi minimalno aplikacija. U praksi, na 32-bitnom procesoru, svaki program će koristiti samo svojih 1-3 GB memorije, a više dostupnog RAM-a može se koristiti za pokretanje više programa u isto vrijeme ili koristiti ovu memoriju kao međuspremnik (caching). Ove upotrebe su praktične, ali bismo voljeli da svaki program može lako koristiti dijelove memorije veće od 4 GB.

Sada dolazimo do česte (zapravo netočne) tvrdnje da je bez više od 4GB memorije 64-bitna arhitektura beskorisna. Veći adresni prostor koristan je čak i na sustavu s manje memorije. Datoteke s mapiranjem memorije zgodan su alat gdje je dio sadržaja datoteke logički povezan s memorijom procesa bez potrebe za učitavanjem cijele datoteke u memoriju. Tako sustav može, primjerice, postupno obraditi velike datoteke višestruko veće od kapaciteta RAM-a. Na 32-bitnom sustavu tako velike datoteke ne mogu se pouzdano memorijsko preslikati, dok je na 64-bitnom sustavu to jednostavno, zahvaljujući mnogo većem adresnom prostoru.

Međutim, veća veličina pokazivača donosi i jedan veliki nedostatak: inače identični programi trebaju više memorije na 64-bitnom procesoru (ovi veći pokazivači moraju biti negdje pohranjeni). Budući da su pokazivači čest dio programa, ova razlika može opteretiti predmemoriju, što zauzvrat uzrokuje sporiji rad cijelog sustava. Dakle, iz perspektive, možemo vidjeti da ako samo promijenimo arhitekturu procesora na 64-bitnu, to bi zapravo usporilo cijeli sustav. Stoga se ovaj faktor mora uravnotežiti dodatnim optimizacijama 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.

registra

ARM64 sadrži dvostruko više cijelih registara od 32-bitnog ARM-a (pazite da ne pomiješate broj i širinu registara - govorili smo o širini u odjeljku "64-bitni". Dakle, ARM64 ima i dvostruko šire registre i dvostruko više registri). 32-bitni ARM ima 16 cjelobrojnih registara: jedan programski brojač (PC - sadrži broj trenutne instrukcije), pokazivač stoga (pokazivač na funkciju u tijeku), registar veze (pokazivač na povratak nakon završetka funkcije), a preostalih 13 je za korištenje aplikacije. Međutim, ARM64 ima 32 cjelobrojna registra, uključujući jedan nulti registar, registar veze, pokazivač okvira (slično pokazivaču stoga) i jedan rezerviran za budućnost. To nam ostavlja 28 registara za korištenje aplikacija, 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 općenito sporija od CPU izračuna i čitanje/pisanje može trajati jako dugo. Zbog toga bi brzi procesor morao čekati na memoriju i dosegnuli bismo prirodno ograničenje brzine sustava. Procesori pokušavaju sakriti ovaj nedostatak slojevima međuspremnika, ali čak i onaj najbrži (L1) još uvijek je sporiji od proračuna procesora. Međutim, registri su memorijske ćelije izravno u procesoru i njihovo je čitanje/pisanje dovoljno brzo da ne usporavaju procesor. Broj registara praktički znači količinu najbrže memorije za proračune procesora, što uvelike utječe na brzinu cijelog sustava.

U isto vrijeme, ova brzina zahtijeva dobru optimizacijsku podršku prevoditelja, tako da jezik može koristiti te registre i ne mora sve pohranjivati ​​u memoriju opće aplikacije (sporu).

Skup 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' zbraja brojeve u dva registra). Funkcije dostupne pojedinim jezicima sastoje se od ovih uputa. Složenije funkcije moraju izvršavati više instrukcija, pa mogu biti sporije.

Novo u ARM64 su upute za AES enkripciju, SHA-1 i SHA-256 hash funkcije. Dakle, umjesto složene implementacije, samo će jezik pozivati ​​ovu instrukciju - što će donijeti veliko ubrzanje računanja takvih funkcija i nadamo se dodatnu sigurnost u aplikacijama. npr. novi Touch ID također koristi ove upute u enkripciji, što omogućuje stvarnu brzinu i sigurnost (u teoriji, napadač bi morao modificirati sam procesor da pristupi podacima - što je u najmanju ruku nepraktično s obzirom na njegovu minijaturnu veličinu).

Kompatibilnost s 32-bitnim

Važno je spomenuti da A7 može u potpunosti raditi u 32-bitnom načinu rada 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 ARM64 funkcije, pa se uvijek isplati napraviti posebnu verziju samo za A7, koja bi trebala raditi puno brže.

Promjene vremena izvođenja

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

Jedan od njih je i tzv označeni pokazivač (označeni indikator). Obično su objekti i pokazivači na te objekte pohranjeni u zasebnim dijelovima memorije. Međutim, novi tipovi pokazivača omogućuju klasama s malo podataka da spremaju objekte izravno u pokazivač. Ovaj korak eliminira potrebu za dodjeljivanjem memorije izravno za objekt, samo stvorite pokazivač i objekt unutar njega. Označeni pokazivači podržani su samo u 64-bitnoj arhitekturi i zbog činjenice da u 32-bitnom pokazivaču više nema dovoljno prostora za pohranu dovoljno korisnih podataka. Stoga iOS, za razliku od OS X, još nije podržavao ovu značajku. No, 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 koristi za vlastitu adresu pokazivača. A ako smo u mogućnosti pouzdano demaskirati ostatak bitova pokazivača, možemo koristiti ovaj prostor za pohranu dodatnih podataka – kao u slučaju spomenutih označenih pokazivača. Konceptualno, ovo je jedna od najvećih promjena u povijesti Objective-C, iako to nije tržišna značajka - tako da većina korisnika neće znati kako Apple pomiče Objective-C naprijed.

Što se tiče korisnih podataka koji se mogu pohraniti u preostali prostor tako označenog pokazivača, Objective-C ga, primjerice, sada koristi za pohranjivanje tzv. broj referenci (broj referenci). Prethodno je broj referenci bio pohranjen na drugom mjestu u memoriji, u hash tablici pripremljenoj za njega, ali to bi moglo usporiti cijeli sustav u slučaju velikog broja alloc/dealloc/retain/release poziva. Tablica je morala biti zaključana zbog sigurnosti niti, tako da se broj referenci dvaju objekata u dvije niti nije mogao promijeniti u isto vrijeme. Međutim, ta je vrijednost novoumetnuta u ostatak tzv isa indikatori. Ovo je još jedna neupadljiva, ali ogromna prednost i ubrzanje u budućnosti. Međutim, to se nikada ne bi moglo postići u 32-bitnoj arhitekturi.

Na preostala mjesta pokazivača na objekte također se novo ubacuju informacije o pridruženim objektima, je li objekt slabo referenciran, je li potrebno generirati destruktor za objekt itd. Zahvaljujući tim informacijama Objective-C runtime može bitno ubrzati vrijeme izvođenja, što se odražava na brzinu 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 jednostavno prebacivanje na 64bit bez prilagođavanja jezika ili aplikacija tome zapravo ne znači ništa - čak usporava cijeli sustav. Ali novi A7 koristi moderni ARM64 s novim skupom instrukcija, a Apple se potrudio modernizirati cijeli Objective-C jezik i iskoristiti 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 na čelu ne samo dizajnom, korisničkim sučeljem i bogatim ekosustavom, već ponajprije najmodernijim tehnologijama na tržištu.

Izvor: mikeash.com
.