Aizvērt sludinājumu

Maiks Ešs veltīts viņa emuārā praktiskās sekas, ko rada pāreja uz 64 bitu arhitektūru iPhone 5S. Šis raksts balstās uz viņa atklājumiem.

Iemesls šim tekstam galvenokārt ir saistīts ar lielo dezinformācijas daudzumu, kas tiek izplatīts par to, ko jaunais iPhone 5s ar 64 bitu ARM procesoru patiesībā nozīmē lietotājiem un tirgum. Šeit mēs centīsimies sniegt objektīvu informāciju par šīs pārejas veiktspēju, iespējām un ietekmi uz izstrādātājiem.

"64 biti"

Ir divas procesora daļas, uz kurām var atsaukties "X-bit" etiķete - veselo skaitļu reģistru platums un rādītāju platums. Par laimi, lielākajā daļā mūsdienu procesoru šie platumi ir vienādi, tāpēc A7 gadījumā tas nozīmē 64 bitu veselu skaitļu reģistrus un 64 bitu rādītājus.

Tomēr vienlīdz svarīgi ir norādīt, ko "64 biti" NAV: RAM fiziskās adreses lielums. Bitu skaits, kas jāsazinās ar RAM (tātad RAM apjoms, ko ierīce var atbalstīt), nav saistīts ar CPU bitu skaitu. ARM procesoriem ir 26–40 bitu adreses, un tos var mainīt neatkarīgi no pārējās sistēmas.

  • Datu kopnes lielums. No RAM vai buferatmiņas saņemto datu apjoms tāpat nav atkarīgs no šī faktora. Atsevišķas procesora instrukcijas var pieprasīt dažādus datu apjomus, taču tās tiek nosūtītas pa daļām vai saņemtas no atmiņas vairāk nekā nepieciešams. Tas ir atkarīgs no datu kvantu lieluma. IPhone 5 jau saņem datus no atmiņas 64 bitu kvantos (un tam ir 32 bitu procesors), un mēs varam saskarties ar izmēriem līdz 192 bitiem.
  • Viss, kas saistīts ar peldošo komatu. Šādu reģistru (FPU) lielums atkal nav atkarīgs no procesora iekšējās darbības. ARM ir izmantojis 64 bitu FPU kopš pirms ARM64 (64 bitu ARM procesors).

Vispārējās priekšrocības un trūkumi

Ja salīdzinām citādi identiskas 32 bitu un 64 bitu arhitektūras, tās parasti nav tik atšķirīgas. Tas ir viens no iemesliem vispārējai sabiedrības apjukumam, kas meklē iemeslu, kāpēc Apple pāriet uz 64 bitu versiju arī mobilajās ierīcēs. Tomēr tas viss izriet no A7 (ARM64) procesora specifiskajiem parametriem un tā, kā Apple to izmanto, nevis tikai no tā, ka procesoram ir 64 bitu arhitektūra.

Tomēr, ja mēs joprojām aplūkosim atšķirības starp šīm divām arhitektūrām, mēs atradīsim vairākas atšķirības. Acīmredzami ir tas, ka 64 bitu veselo skaitļu reģistri var efektīvāk apstrādāt 64 bitu veselus skaitļus. Jau iepriekš ar tiem bija iespējams strādāt ar 32 bitu procesoriem, taču tas parasti nozīmēja to sadalīšanu 32 bitu garos gabalos, kas radīja lēnākus aprēķinus. Tātad 64 bitu procesors parasti var aprēķināt ar 64 bitu tipiem tikpat ātri kā ar 32 bitu procesoriem. Tas nozīmē, ka lietojumprogrammas, kas parasti izmanto 64 bitu tipus, var darboties daudz ātrāk ar 64 bitu procesoru.

Lai gan 64 biti neietekmē kopējo procesora izmantoto RAM apjomu, tas var atvieglot darbu ar lieliem RAM gabaliem vienā programmā. Jebkurai atsevišķai programmai, kas darbojas ar 32 bitu procesoru, ir tikai aptuveni 4 GB adrešu vietas. Ņemot vērā, ka operētājsistēma un standarta bibliotēkas kaut ko aizņem, tas atstāj programmai 1-3 GB lietojumprogrammu lietošanai. Tomēr, ja 32 bitu sistēmai ir vairāk nekā 4 GB RAM, šīs atmiņas izmantošana ir nedaudz sarežģītāka. Mums ir jāpiespiež operētājsistēma kartēt šos lielākos atmiņas gabalus mūsu programmai (atmiņas virtualizācija), vai arī mēs varam sadalīt programmu vairākos procesos (kur katram procesam atkal teorētiski ir pieejama 4 GB atmiņas tiešai adresēšanai).

Tomēr šie "uzlauzumi" ir tik sarežģīti un lēni, ka tos izmanto minimālas lietojumprogrammas. Praksē 32 bitu procesorā katra programma izmantos tikai savu 1–3 GB atmiņu, un vairāk pieejamās RAM var izmantot, lai vienlaikus darbinātu vairākas programmas vai izmantotu šo atmiņu kā buferi (kešatmiņu). Šie lietojumi ir praktiski, taču mēs vēlamies, lai jebkura programma varētu viegli izmantot atmiņas gabalus, kas lielāki par 4 GB.

Tagad mēs nonākam pie biežā (faktiski nepareizā) apgalvojuma, ka bez vairāk nekā 4 GB atmiņas 64 bitu arhitektūra ir bezjēdzīga. Lielāka adrešu telpa ir noderīga pat sistēmā ar mazāku atmiņu. Atmiņas kartētie faili ir ērts rīks, kurā daļa no faila satura ir loģiski saistīta ar procesa atmiņu, un viss fails nav jāielādē atmiņā. Tādējādi sistēma, piemēram, var pakāpeniski apstrādāt lielus failus, kas daudzkārt pārsniedz RAM ietilpību. 32 bitu sistēmā tik lielus failus nevar uzticami kartēt atmiņā, turpretim 64 bitu sistēmā tas ir vienkāršs gabals, pateicoties daudz lielākai adrešu telpai.

Tomēr lielāks rādītāju izmērs rada arī vienu lielu trūkumu: pretējā gadījumā identiskām programmām ir nepieciešams vairāk atmiņas 64 bitu procesorā (šīs lielākās norādes ir kaut kur jāglabā). Tā kā norādes ir bieži sastopama programmu sastāvdaļa, šī atšķirība var noslogot kešatmiņu, kas savukārt liek visai sistēmai darboties lēnāk. Tātad perspektīvā mēs varam redzēt, ka, ja mēs vienkārši mainītu procesora arhitektūru uz 64 bitu, tas faktiski palēninātu visu sistēmu. Tāpēc šis faktors ir jālīdzsvaro ar lielāku optimizāciju citās vietās.

ARM64

A7, 64 bitu procesors, kas darbina jauno iPhone 5s, nav tikai parasts ARM procesors ar plašākiem reģistriem. ARM64 satur lielus uzlabojumus salīdzinājumā ar vecāku 32 bitu versiju.

Apple A7 procesors.

reģistra

ARM64 satur divreiz vairāk veselu skaitļu reģistru nekā 32 bitu ARM (uzmanieties, lai nesajauktu reģistru skaitu un platumu - par platumu mēs runājām sadaļā "64 biti". Tātad ARM64 ir gan divreiz platāki reģistri, gan divreiz vairāk reģistri). 32 bitu ARM ir 16 veselu skaitļu reģistri: viens programmas skaitītājs (PC - satur pašreizējās instrukcijas numuru), steka rādītājs (rādītājs uz notiekošu funkciju), saišu reģistrs (rādītājs uz atgriešanos pēc beigām no funkcijas), un atlikušie 13 ir paredzēti lietošanai lietojumprogrammās. Tomēr ARM64 ir 32 veselu skaitļu reģistri, tostarp viens nulles reģistrs, saišu reģistrs, kadra rādītājs (līdzīgi steka rādītājam) un viens, kas rezervēts nākotnei. Tādējādi lietojumprogrammu lietošanai ir pieejami 28 reģistri, kas ir vairāk nekā divas reizes vairāk nekā 32 bitu ARM. Tajā pašā laikā ARM64 dubultoja peldošā komata skaitļu (FPU) reģistru skaitu no 16 līdz 32 128 bitu reģistriem.

Bet kāpēc reģistru skaits ir tik svarīgs? Atmiņa parasti ir lēnāka nekā CPU aprēķini, un lasīšana/rakstīšana var aizņemt ļoti ilgu laiku. Tas liktu ātrajam procesoram turpināt gaidīt atmiņu, un mēs sasniegtu sistēmas dabisko ātruma ierobežojumu. Procesori mēģina slēpt šo handikapu ar buferu slāņiem, taču pat ātrākais (L1) joprojām ir lēnāks nekā procesora aprēķins. Tomēr reģistri ir atmiņas šūnas tieši procesorā un to lasīšana/rakstīšana ir pietiekami ātra, lai nepalēninātu procesora darbību. Reģistru skaits praktiski nozīmē ātrākās atmiņas apjomu procesora aprēķiniem, kas ļoti ietekmē visas sistēmas ātrumu.

Tajā pašā laikā šim ātrumam ir nepieciešams labs optimizācijas atbalsts no kompilatora, lai valoda varētu izmantot šos reģistrus un nebūtu viss jāglabā vispārējās lietojumprogrammas (lēnajā) atmiņā.

Instrukciju komplekts

ARM64 arī ienes lielas izmaiņas instrukciju komplektā. Instrukciju kopa ir atomu operāciju kopa, ko procesors var veikt (piemēram, 'ADD register1 register2') tiek pievienoti skaitļi divos reģistros. Atsevišķām valodām pieejamās funkcijas sastāv no šīm instrukcijām. Sarežģītākām funkcijām ir jāizpilda vairāk instrukciju, tāpēc tās var darboties lēnāk.

Jaunums ARM64 ir instrukcijas AES šifrēšanai, SHA-1 un SHA-256 jaucējfunkcijām. Tātad sarežģītas ieviešanas vietā tikai valoda izsauks šo instrukciju - kas nodrošinās milzīgu ātrumu šādu funkciju aprēķināšanai un, cerams, papildu drošību lietojumprogrammās. Piem. jaunais Touch ID arī izmanto šīs instrukcijas šifrēšanā, nodrošinot reālu ātrumu un drošību (teorētiski uzbrucējam būtu jāmaina pats procesors, lai piekļūtu datiem – tas ir maigi izsakoties nepraktiski, ņemot vērā tā miniatūru izmēru).

Saderība ar 32 bitu

Ir svarīgi pieminēt, ka A7 var pilnībā darboties 32 bitu režīmā bez emulācijas. Tas nozīmē, ka jaunais iPhone 5s bez palēninājuma var palaist lietojumprogrammas, kas kompilētas uz 32 bitu ARM. Taču tad tas nevar izmantot jaunās ARM64 funkcijas, tāpēc vienmēr ir vērts izveidot īpašu būvējumu tieši A7, kam vajadzētu darboties daudz ātrāk.

Izpildes laika izmaiņas

Izpildlaiks ir kods, kas programmēšanas valodai pievieno funkcijas, kuras tā var izmantot lietojumprogrammas darbības laikā līdz pēc tulkošanas. Tā kā Apple nav jāuztur lietojumprogrammu saderība (ka 64 bitu binārais fails darbojas 32 bitu versijā), viņi varētu atļauties veikt vēl dažus Objective-C valodas uzlabojumus.

Viens no tiem ir t.s marķētais rādītājs (atzīmēts indikators). Parasti objekti un norādes uz šiem objektiem tiek glabāti atsevišķās atmiņas daļās. Tomēr jaunie rādītāju veidi ļauj klasēm ar maziem datiem saglabāt objektus tieši rādītājā. Šī darbība novērš nepieciešamību piešķirt atmiņu tieši objektam, vienkārši izveidojiet rādītāju un tajā esošo objektu. Atzīmētās norādes tiek atbalstītas tikai 64 bitu arhitektūrā arī tāpēc, ka 32 bitu rādītājā vairs nav pietiekami daudz vietas, lai saglabātu pietiekami daudz noderīgu datu. Tāpēc iOS, atšķirībā no OS X, šo funkciju vēl neatbalstīja. Tomēr līdz ar ARM64 ienākšanu tas mainās, un iOS ir panākusi OS X arī šajā ziņā.

Lai gan rādītāji ir 64 biti gari, ARM64 rādītāja adresei tiek izmantoti tikai 33 biti. Un, ja mēs varam droši atmaskot pārējos rādītāja bitus, mēs varam izmantot šo vietu, lai saglabātu papildu datus – kā tas ir pieminēto marķēto rādītāju gadījumā. Konceptuāli šī ir viena no lielākajām izmaiņām Objective-C vēsturē, lai gan tā nav nopērkama funkcija - tāpēc lielākā daļa lietotāju nezinās, kā Apple virza Objective-C uz priekšu.

Runājot par noderīgajiem datiem, ko var glabāt šāda marķēta rādītāja atlikušajā vietā, tagad, piemēram, Objective-C to izmanto, lai saglabātu t.s. atsauces skaits (atsauču skaits). Iepriekš atsauces skaits tika saglabāts citā vietā atmiņā, tam sagatavotā hash tabulā, taču tas varēja palēnināt visu sistēmu liela skaita alloc/dealloc/retain/release zvanu gadījumā. Tabula bija jābloķē vītnes drošības dēļ, tāpēc divu objektu atskaites skaitu divos pavedienos nevarēja mainīt vienlaikus. Tomēr šī vērtība ir tikko ievietota pārējā t.s ISA rādītājiem. Šī ir vēl viena neuzkrītoša, bet milzīga priekšrocība un paātrinājums nākotnē. Tomēr to nekad nevarētu panākt 32 bitu arhitektūrā.

Informācija par saistītajiem objektiem, vai objekts ir vāji saistīts, vai ir nepieciešams objektam ģenerēt destruktoru utt., arī tiek no jauna ievietota atlikušajā objektu rādītāju vietā. Pateicoties šai informācijai, Objective-C izpildlaiks spēj būtiski paātrināt izpildes laiku, kas atspoguļojas katras lietojumprogrammas ātrumā. No testēšanas tas nozīmē aptuveni 40–50% paātrinājumu visiem atmiņas pārvaldības zvaniem. Vienkārši pārejot uz 64 bitu rādītājiem un izmantojot šo jauno vietu.

Záver

Lai gan konkurenti mēģinās izplatīt domu, ka pāreja uz 64 bitu arhitektūru nav nepieciešama, jūs jau zināt, ka tas ir tikai ļoti neinformēts viedoklis. Tā ir taisnība, ka pāreja uz 64 bitu versiju, nepielāgojot valodu vai lietojumprogrammas, patiesībā neko nenozīmē – tas pat palēnina visas sistēmas darbību. Taču jaunais A7 izmanto modernu ARM64 ar jaunu instrukciju komplektu, un Apple ir uzņēmies pūles, lai modernizētu visu Objective-C valodu un izmantotu jaunās iespējas – līdz ar to arī solīts paātrinājums.

Šeit mēs esam minējuši lielu skaitu iemeslu, kāpēc 64 bitu arhitektūra ir pareizais solis uz priekšu. Tā ir kārtējā revolūcija "zem motora pārsega", pateicoties kurai Apple centīsies noturēties priekšgalā ne tikai ar dizainu, lietotāja interfeisu un bagātīgu ekosistēmu, bet galvenokārt ar modernākajām tehnoloģijām tirgū.

Avots: mikeash.com
.