Mbyll reklamën

Mike Ash dedikuar në blogun e tij implikimet praktike të kalimit në arkitekturën 64-bit në iPhone 5S. Ky artikull bazohet në gjetjet e tij.

Arsyeja e këtij teksti është kryesisht për shkak të sasisë së madhe të dezinformatave që po përhapen se çfarë do të thotë në të vërtetë iPhone 5s i ri me një procesor ARM 64-bit për përdoruesit dhe tregun. Këtu do të përpiqemi të sjellim informacion objektiv në lidhje me performancën, aftësitë dhe implikimet e këtij tranzicioni për zhvilluesit.

"64 bit"

Ekzistojnë dy pjesë të një procesori të cilave mund t'u referohet etiketa "X-bit" - gjerësia e regjistrave të numrave të plotë dhe gjerësia e treguesve. Për fat të mirë, në shumicën e procesorëve modernë këto gjerësi janë të njëjta, kështu që në rastin e A7 kjo do të thotë regjistrat e numrave të plotë 64-bit dhe treguesit 64-bit.

Sidoqoftë, është po aq e rëndësishme të theksohet se çfarë NUK do të thotë "64bit": Madhësia e adresës fizike të RAM-it. Numri i biteve për të komunikuar me RAM-in (pra sasia e RAM-it që një pajisje mund të mbështesë) nuk lidhet me numrin e biteve të CPU-së. Procesorët ARM kanë adresa midis 26 dhe 40-bit dhe mund të ndryshohen pavarësisht nga pjesa tjetër e sistemit.

  • Madhësia e autobusit të të dhënave. Sasia e të dhënave të marra nga RAM ose memoria buferike është në mënyrë të ngjashme e pavarur nga ky faktor. Instruksionet individuale të procesorit mund të kërkojnë sasi të ndryshme të dhënash, por ato ose dërgohen në copa ose merren më shumë se ç'duhet nga memoria. Varet nga madhësia e kuantit të të dhënave. iPhone 5 tashmë merr të dhëna nga memoria në kuantë 64-bit (dhe ka një procesor 32-bit), dhe mund të hasim në madhësi deri në 192 bit.
  • Çdo gjë që lidhet me pikën lundruese. Madhësia e regjistrave të tillë (FPU) është përsëri e pavarur nga funksionimi i brendshëm i procesorit. ARM ka përdorur FPU 64-bit që përpara ARM64 (procesor ARM 64-bit).

Përparësitë dhe disavantazhet e përgjithshme

Nëse krahasojmë arkitekturat identike 32 bit dhe 64 bit, ato në përgjithësi nuk janë aq të ndryshme. Kjo është një nga arsyet e konfuzionit të përgjithshëm të publikut që kërkon një arsye pse Apple po kalon në 64bit edhe në pajisjet mobile. Megjithatë, gjithçka vjen nga parametrat specifikë të procesorit A7 (ARM64) dhe mënyra se si Apple e përdor atë, jo vetëm nga fakti që procesori ka një arkitekturë 64-bit.

Sidoqoftë, nëse ende shikojmë ndryshimet midis këtyre dy arkitekturave, do të gjejmë disa dallime. E dukshme është se regjistrat e numrave të plotë 64-bit mund të trajtojnë numrat e plotë 64-bit në mënyrë më efikase. Edhe më parë ishte e mundur të punohej me ta në procesorë 32-bitësh, por kjo zakonisht nënkuptonte ndarjen e tyre në copa të gjata 32-bit, gjë që shkaktonte llogaritje më të ngadalta. Pra, një procesor 64-bit në përgjithësi mund të llogaritë me llojet 64-bit po aq shpejt sa me ato 32-bit. Kjo do të thotë që aplikacionet që zakonisht përdorin lloje 64-bit mund të funksionojnë shumë më shpejt në një procesor 64-bit.

Megjithëse 64 bit nuk ndikon në sasinë totale të RAM-it që mund të përdorë procesori, mund ta bëjë më të lehtë punën me pjesë të mëdha të RAM-it në një program. Çdo program i vetëm që funksionon në një procesor 32-bit ka vetëm rreth 4 GB hapësirë ​​adresash. Duke marrë parasysh që sistemi operativ dhe bibliotekat standarde marrin diçka, kjo i lë programit diku midis 1-3 GB për përdorim aplikacioni. Megjithatë, nëse një sistem 32-bitësh ka më shumë se 4 GB RAM, përdorimi i kësaj memorie është pak më i komplikuar. Ne duhet t'i drejtohemi detyrimit të sistemit operativ që të hartojë këto pjesë më të mëdha të memories për programin tonë (virtualizimi i memories), ose mund ta ndajmë programin në procese të shumta (ku secili proces përsëri teorikisht ka 4 GB memorie të disponueshme për adresim të drejtpërdrejtë).

Megjithatë, këto "hake" janë aq të vështira dhe të ngadalta sa që një minimum aplikacionesh i përdorin ato. Në praktikë, në një procesor 32-bit, çdo program do të përdorë vetëm 1-3 GB memorie, dhe RAM më i disponueshëm mund të përdoret për të ekzekutuar shumë programe në të njëjtën kohë ose për të përdorur këtë memorie si një buffer (caching). Këto përdorime janë praktike, por ne do të dëshironim që çdo program të mund të përdorte lehtësisht pjesë të memories më të mëdha se 4 GB.

Tani kemi ardhur te pretendimi i shpeshtë (në fakt i pasaktë) se pa më shumë se 4 GB memorie, një arkitekturë 64-bit është e padobishme. Një hapësirë ​​më e madhe adresash është e dobishme edhe në një sistem me më pak memorie. Skedarët e hartuar me memorie janë një mjet i dobishëm ku një pjesë e përmbajtjes së skedarit lidhet logjikisht me memorien e procesit pa pasur nevojë të ngarkohet i gjithë skedari në memorie. Kështu, sistemi, për shembull, mund të përpunojë gradualisht skedarë të mëdhenj shumë herë më të mëdhenj se kapaciteti RAM. Në një sistem 32-bitësh, skedarë të tillë të mëdhenj nuk mund të hartohen me memorie të besueshme, ndërsa në një sistem 64-bitësh, ai është një copë tortë, falë hapësirës shumë më të madhe të adresave.

Megjithatë, madhësia më e madhe e treguesve sjell edhe një disavantazh të madh: përndryshe programet identike kanë nevojë për më shumë memorie në një procesor 64-bitësh (këta tregues më të mëdhenj duhet të ruhen diku). Meqenëse treguesit janë pjesë e shpeshtë e programeve, ky ndryshim mund të rëndojë cache-in, i cili nga ana tjetër bën që i gjithë sistemi të funksionojë më ngadalë. Pra, në perspektivë, ne mund të shohim se nëse thjesht ndryshonim arkitekturën e procesorit në 64-bit, në fakt do të ngadalësonte të gjithë sistemin. Pra, ky faktor duhet të balancohet nga më shumë optimizime në vende të tjera.

ARM64

A7, procesori 64-bit që fuqizon iPhone 5s të ri, nuk është thjesht një procesor i rregullt ARM me regjistra më të gjerë. ARM64 përmban përmirësime të mëdha në krahasim me versionin më të vjetër 32-bit.

Procesori Apple A7.

regjistrimi

ARM64 mban dy herë më shumë regjistra të numrave të plotë se ARM 32-bit (kini kujdes që të mos ngatërroni numrin dhe gjerësinë e regjistrave - folëm për gjerësinë në seksionin "64-bit". Pra, ARM64 ka regjistra dy herë më të gjerë dhe dy herë më shumë regjistrat). ARM 32-bitësh ka 16 regjistra numrash të plotë: një numërues programi (PC - përmban numrin e instruksionit aktual), një tregues stack (një tregues për një funksion në progres), një regjistër lidhjeje (një tregues për kthimin pas përfundimit të funksionit), dhe 13 të tjerat janë për përdorim në aplikacion. Megjithatë, ARM64 ka 32 regjistra numrash të plotë, duke përfshirë një regjistër zero, një regjistër lidhjeje, një tregues kornizë (i ngjashëm me një tregues të stivës) dhe një të rezervuar për të ardhmen. Kjo na lë me 28 regjistra për përdorim aplikacioni, më shumë se dyfishi i ARM 32-bit. Në të njëjtën kohë, ARM64 dyfishoi numrin e regjistrave të numrave me pikë lundruese (FPU) nga 16 në 32 regjistra 128-bitësh.

Por pse është kaq i rëndësishëm numri i regjistrave? Kujtesa në përgjithësi është më e ngadaltë se llogaritjet e CPU-së dhe leximi/shkrimi mund të marrë shumë kohë. Kjo do të bënte që procesori i shpejtë të duhej të vazhdonte të presë për kujtesën dhe ne do të arrinim kufirin natyror të shpejtësisë së sistemit. Procesorët përpiqen ta fshehin këtë pengesë me shtresa buferash, por edhe më i shpejti (L1) është akoma më i ngadalshëm se llogaritja e procesorit. Sidoqoftë, regjistrat janë qeliza memorie direkt në procesor dhe leximi/shkrimi i tyre është mjaft i shpejtë për të mos ngadalësuar procesorin. Numri i regjistrave praktikisht nënkupton sasinë e memories më të shpejtë për llogaritjet e procesorit, gjë që ndikon shumë në shpejtësinë e të gjithë sistemit.

Në të njëjtën kohë, kjo shpejtësi ka nevojë për mbështetje të mirë optimizimi nga përpiluesi, në mënyrë që gjuha të mund të përdorë këto regjistra dhe të mos ketë nevojë të ruajë gjithçka në memorien e përgjithshme të aplikacionit (të ngadaltë).

Komplet udhëzues

ARM64 gjithashtu sjell ndryshime të mëdha në grupin e udhëzimeve. Një grup instruksionesh është një grup operacionesh atomike që mund të kryejë një procesor (p.sh. 'ADD register1 register2' shton numrat në dy regjistra). Funksionet e disponueshme për gjuhët individuale përbëhen nga këto udhëzime. Funksionet më komplekse duhet të ekzekutojnë më shumë instruksione, në mënyrë që ato të jenë më të ngadalta.

Të reja në ARM64 janë udhëzimet për enkriptimin AES, funksionet hash SHA-1 dhe SHA-256. Pra, në vend të një zbatimi kompleks, vetëm gjuha do ta quajë këtë udhëzim - i cili do të sjellë një shpejtësi të madhe në llogaritjen e funksioneve të tilla dhe shpresojmë të shtojë sigurinë në aplikacione. P.sh. Touch ID-ja e re i përdor këto udhëzime gjithashtu në enkriptim, duke lejuar shpejtësinë dhe sigurinë reale (teorikisht, një sulmues duhet të modifikojë vetë procesorin për të hyrë në të dhënat - gjë që është jopraktike për të thënë të paktën duke pasur parasysh madhësinë e tij në miniaturë).

Pajtueshmëria me 32 bit

Është e rëndësishme të përmendet se A7 mund të funksionojë plotësisht në modalitetin 32-bit pa pasur nevojë për emulim. Do të thotë që iPhone 5s i ri mund të ekzekutojë aplikacione të përpiluara në ARM 32-bit pa ndonjë ngadalësim. Sidoqoftë, atëherë nuk mund të përfitojë nga funksionet e reja ARM64, kështu që ia vlen gjithmonë të bëni një ndërtim të veçantë vetëm për A7, i cili duhet të funksionojë shumë më shpejt.

Ndryshimet e kohës së funksionimit

Runtime është kodi që shton funksione në gjuhën e programimit, të cilat mund t'i përdorë gjatë ekzekutimit të aplikacionit, deri pas përkthimit. Meqenëse Apple nuk ka nevojë të ruajë përputhshmërinë e aplikacioneve (që një binar 64-bit funksionon në 32-bit), ata mund të përballojnë të bëjnë disa përmirësime të tjera në gjuhën Objective-C.

Njëri prej tyre është i ashtuquajturi etiketuar tregues (tregues i shënuar). Normalisht, objektet dhe treguesit për ato objekte ruhen në pjesë të veçanta të memories. Megjithatë, llojet e reja të treguesve i lejojnë klasat me pak të dhëna të ruajnë objektet drejtpërdrejt në tregues. Ky hap eliminon nevojën për të shpërndarë memorie drejtpërdrejt për objektin, thjesht krijoni një tregues dhe objektin brenda tij. Treguesit e etiketuar mbështeten vetëm në arkitekturën 64-bit, edhe për faktin se nuk ka më hapësirë ​​të mjaftueshme në një tregues 32-bitësh për të ruajtur mjaftueshëm të dhëna të dobishme. Prandaj, iOS, ndryshe nga OS X, nuk e mbështeste ende këtë veçori. Megjithatë, me ardhjen e ARM64, kjo po ndryshon dhe iOS është kapur me OS X edhe në këtë drejtim.

Megjithëse treguesit janë 64 bit të gjatë, në ARM64 përdoren vetëm 33 bit për adresën e vetë treguesit. Dhe nëse jemi në gjendje të demaskojmë me besueshmëri pjesën tjetër të bitave të treguesit, mund ta përdorim këtë hapësirë ​​për të ruajtur të dhëna shtesë - si në rastin e treguesve të përmendur të etiketuar. Konceptualisht, ky është një nga ndryshimet më të mëdha në historinë e Objective-C, megjithëse nuk është një veçori e tregtueshme - kështu që shumica e përdoruesve nuk do të dinë se si Apple po e çon përpara Objective-C.

Sa i përket të dhënave të dobishme që mund të ruhen në hapësirën e mbetur të një treguesi të tillë të etiketuar, Objective-C, për shembull, tani po e përdor atë për të ruajtur të ashtuquajturat numërimi i referencës (numri i referencave). Më parë, numërimi i referencës ruhej në një vend tjetër në memorie, në një tabelë hash të përgatitur për të, por kjo mund të ngadalësonte të gjithë sistemin në rastin e një numri të madh thirrjesh alloc/dealloc/retain/release. Tabela duhej të kyçej për shkak të sigurisë së fillit, kështu që numërimi i referencës së dy objekteve në dy fije nuk mund të ndryshohej në të njëjtën kohë. Megjithatë, kjo vlerë është futur rishtazi në pjesën tjetër të të ashtuquajturave isa treguesit. Ky është një tjetër avantazh dhe përshpejtim i padukshëm, por i madh në të ardhmen. Megjithatë, kjo nuk mund të arrihet kurrë në një arkitekturë 32-bit.

Informacioni në lidhje me objektet e lidhura, nëse objekti është referuar dobët, nëse është i nevojshëm për të gjeneruar një destruktor për objektin, etj., është futur gjithashtu rishtazi në vendin e mbetur të treguesve për objektet. Falë këtij informacioni, Objektivi-C Runtime është në gjendje të përshpejtojë rrënjësisht kohën e ekzekutimit, gjë që reflektohet në shpejtësinë e secilit aplikacion. Nga testimi, kjo do të thotë rreth 40-50% përshpejtim i të gjitha thirrjeve të menaxhimit të kujtesës. Thjesht duke kaluar te treguesit 64-bit dhe duke përdorur këtë hapësirë ​​të re.

Zavër

Edhe pse konkurrentët do të përpiqen të përhapin idenë se kalimi në një arkitekturë 64-bitësh është i panevojshëm, tashmë do ta dini se ky është thjesht një opinion shumë i painformuar. Është e vërtetë që kalimi në 64-bit pa përshtatur gjuhën ose aplikacionet tuaja nuk do të thotë asgjë - madje ngadalëson të gjithë sistemin. Por A7 i ri përdor një ARM64 moderne me një grup të ri instruksionesh, dhe Apple ka marrë mundimin për të modernizuar të gjithë gjuhën Objective-C dhe për të përfituar nga aftësitë e reja - pra shpejtësia e premtuar.

Këtu kemi përmendur një numër të madh arsyesh pse një arkitekturë 64-bit është hapi i duhur përpara. Është një tjetër revolucion “nën kapuç”, falë të cilit Apple do të përpiqet të qëndrojë në ballë jo vetëm me dizajnin, ndërfaqen e përdoruesit dhe ekosistemin e pasur, por kryesisht me teknologjitë më moderne në treg.

burimi: mikeash.com
.