Tanca l'anunci

Mike Ash dedicada al seu blog les implicacions pràctiques de canviar a l'arquitectura de 64 bits a l'iPhone 5S. Aquest article es basa en les seves troballes.

El motiu d'aquest text es deu principalment a la gran quantitat de desinformació que es difon sobre el que realment significa per als usuaris i el mercat el nou iPhone 5s amb un processador ARM de 64 bits. Aquí intentarem aportar informació objectiva sobre el rendiment, les capacitats i les implicacions d'aquesta transició per als desenvolupadors.

"64 bits"

Hi ha dues parts d'un processador a les quals l'etiqueta "X-bit" pot referir-se: l'amplada dels registres enters i l'amplada dels punters. Afortunadament, a la majoria de processadors moderns aquestes amplades són les mateixes, de manera que en el cas de l'A7 això significa registres enters de 64 bits i punters de 64 bits.

Tanmateix, és igualment important assenyalar què NO vol dir "64 bits": Mida de l'adreça física de la RAM. El nombre de bits per comunicar-se amb la memòria RAM (per tant, la quantitat de RAM que pot suportar un dispositiu) no està relacionat amb el nombre de bits de la CPU. Els processadors ARM tenen adreces entre 26 i 40 bits i es poden canviar independentment de la resta del sistema.

  • Mida del bus de dades. La quantitat de dades rebudes de la memòria RAM o memòria intermèdia és igualment independent d'aquest factor. Les instruccions individuals del processador poden sol·licitar diferents quantitats de dades, però s'envien en trossos o es reben més del necessari de la memòria. Depèn de la mida del quàntic de dades. L'iPhone 5 ja rep dades de la memòria en quanta de 64 bits (i té un processador de 32 bits), i podem trobar mides de fins a 192 bits.
  • Qualsevol cosa relacionada amb el punt flotant. La mida d'aquests registres (FPU) són de nou independents del funcionament intern del processador. ARM ha estat utilitzant FPU de 64 bits des d'abans d'ARM64 (processador ARM de 64 bits).

Avantatges i inconvenients generals

Si comparem arquitectures idèntiques de 32 bits i 64 bits, generalment no són tan diferents. Aquest és un dels motius de la confusió general del públic que busca un motiu pel qual Apple també passa a 64 bits als dispositius mòbils. Tot i això, tot prové dels paràmetres específics del processador A7 (ARM64) i de com l'utilitza Apple, no només del fet que el processador tingui una arquitectura de 64 bits.

Tanmateix, si encara observem les diferències entre aquestes dues arquitectures, trobarem diverses diferències. L'obvi és que els registres de nombres enters de 64 bits poden gestionar nombres enters de 64 bits de manera més eficient. Fins i tot abans, era possible treballar amb ells en processadors de 32 bits, però això normalment significava dividir-los en peces llargues de 32 bits, la qual cosa provocava càlculs més lents. Per tant, un processador de 64 bits generalment pot calcular amb tipus de 64 bits tan ràpid com amb els de 32 bits. Això vol dir que les aplicacions que generalment utilitzen tipus de 64 bits es poden executar molt més ràpid en un processador de 64 bits.

Tot i que 64 bits no afecta la quantitat total de RAM que pot utilitzar el processador, pot facilitar el treball amb grans blocs de RAM en un sol programa. Qualsevol programa que s'executi en un processador de 32 bits només té uns 4 GB d'espai d'adreces. Tenint en compte que el sistema operatiu i les biblioteques estàndard ocupen alguna cosa, això deixa el programa amb entre 1 i 3 GB per utilitzar l'aplicació. Tanmateix, si un sistema de 32 bits té més de 4 GB de RAM, utilitzar aquesta memòria és una mica més complicat. Hem de recórrer a forçar el sistema operatiu a mapejar aquests trossos més grans de memòria per al nostre programa (virtualització de la memòria), o podem dividir el programa en diversos processos (on cada procés de nou té, teòricament, 4 GB de memòria disponible per a l'adreçament directe).

No obstant això, aquests "hacks" són tan difícils i lents que un mínim d'aplicacions els utilitzen. A la pràctica, en un processador de 32 bits, cada programa només utilitzarà els seus 1-3 GB de memòria, i es pot utilitzar més RAM disponible per executar diversos programes alhora o utilitzar aquesta memòria com a memòria intermèdia (caching). Aquests usos són pràctics, però ens agradaria que qualsevol programa pogués utilitzar fàcilment trossos de memòria superiors a 4 GB.

Ara arribem a l'afirmació freqüent (en realitat incorrecta) que sense més de 4 GB de memòria, una arquitectura de 64 bits és inútil. Un espai d'adreces més gran és útil fins i tot en un sistema amb menys memòria. Els fitxers assignats a la memòria són una eina útil on part del contingut del fitxer s'enllaça lògicament a la memòria del procés sense que s'hagi de carregar tot el fitxer a la memòria. Així, el sistema pot, per exemple, processar gradualment fitxers grans moltes vegades més grans que la capacitat de la memòria RAM. En un sistema de 32 bits, els fitxers tan grans no es poden assignar de manera fiable a la memòria, mentre que en un sistema de 64 bits és fàcil, gràcies a l'espai d'adreces molt més gran.

Tanmateix, la mida més gran dels punters també comporta un gran desavantatge: en cas contrari, els programes idèntics necessiten més memòria en un processador de 64 bits (aquests punters més grans s'han d'emmagatzemar en algun lloc). Com que els punters són una part freqüent dels programes, aquesta diferència pot sobrecarregar la memòria cau, cosa que fa que tot el sistema funcioni més lentament. Per tant, en perspectiva, podem veure que si acabés de canviar l'arquitectura del processador a 64 bits, en realitat alentiria tot el sistema. Per tant, aquest factor s'ha d'equilibrar amb més optimitzacions en altres llocs.

ARM64

L'A7, el processador de 64 bits que alimenta el nou iPhone 5s, no és només un processador ARM normal amb registres més amplis. ARM64 conté millores importants respecte a la versió antiga de 32 bits.

Processador Apple A7.

Registre

ARM64 conté el doble de registres enters que ARM de 32 bits (aneu amb compte de no confondre el nombre i l'amplada dels registres; hem parlat d'amplada a la secció "64 bits". Així que ARM64 té el doble de registres amples i el doble de registres). registres). L'ARM de 32 bits té 16 registres enters: un comptador de programa (PC - conté el número de la instrucció actual), un punter de pila (un punter a una funció en curs), un registre d'enllaç (un punter al retorn després del final). de la funció), i els 13 restants són per a l'ús d'aplicacions. Tanmateix, l'ARM64 té 32 registres enters, incloent un registre zero, un registre d'enllaç, un punter de trama (similar a un punter de pila) i un reservat per al futur. Això ens deixa amb 28 registres per utilitzar l'aplicació, més del doble de l'ARM de 32 bits. Al mateix temps, l'ARM64 va duplicar el nombre de registres de nombres de coma flotant (FPU) de 16 a 32 registres de 128 bits.

Però, per què és tan important el nombre de registres? La memòria és generalment més lenta que els càlculs de la CPU i la lectura/escriptura pot trigar molt de temps. Això faria que el processador ràpid hagués de seguir esperant memòria i arribaríem al límit de velocitat natural del sistema. Els processadors intenten amagar aquest handicap amb capes de buffers, però fins i tot el més ràpid (L1) és encara més lent que el càlcul del processador. Tanmateix, els registres són cèl·lules de memòria directament al processador i la seva lectura/escriptura és prou ràpida per no alentir el processador. El nombre de registres pràcticament significa la quantitat de memòria més ràpida per als càlculs del processador, la qual cosa afecta molt la velocitat de tot el sistema.

Al mateix temps, aquesta velocitat necessita un bon suport d'optimització per part del compilador, perquè el llenguatge pugui utilitzar aquests registres i no hagi d'emmagatzemar-ho tot a la memòria general de l'aplicació (la lenta).

Conjunt d'instruccions

ARM64 també aporta canvis importants al conjunt d'instruccions. Un conjunt d'instruccions és un conjunt d'operacions atòmiques que pot dur a terme un processador (per exemple, 'ADD register1 register2' afegeix els números en dos registres). Les funcions disponibles per a idiomes individuals es componen d'aquestes instruccions. Les funcions més complexes han d'executar més instruccions, de manera que poden ser més lentes.

Les novetats d'ARM64 són les instruccions per al xifratge AES, les funcions hash SHA-1 i SHA-256. Per tant, en comptes d'una implementació complexa, només el llenguatge anomenarà aquesta instrucció, la qual cosa augmentarà la velocitat del càlcul d'aquestes funcions i s'espera que afegeixi seguretat a les aplicacions. Per exemple. el nou Touch ID també utilitza aquestes instruccions en el xifratge, permetent una velocitat i seguretat reals (en teoria, un atacant hauria de modificar el processador mateix per accedir a les dades, com a mínim poc pràctic donada la seva mida en miniatura).

Compatibilitat amb 32 bits

És important esmentar que l'A7 pot funcionar completament en mode de 32 bits sense necessitat d'emulació. Significa que el nou iPhone 5s pot executar aplicacions compilades en ARM de 32 bits sense cap alentiment. Tanmateix, aleshores no pot utilitzar les noves funcions ARM64, de manera que sempre val la pena fer una compilació especial només per a l'A7, que hauria de funcionar molt més ràpid.

Canvis de temps d'execució

El temps d'execució és el codi que afegeix funcions al llenguatge de programació, que és capaç d'utilitzar mentre s'executa l'aplicació, fins després de la traducció. Com que Apple no necessita mantenir la compatibilitat de les aplicacions (que un binari de 64 bits s'executa en 32 bits), es podrien permetre fer algunes millores més al llenguatge Objective-C.

Un d'ells és l'anomenat punter etiquetat (indicador marcat). Normalment, els objectes i els punters a aquests objectes s'emmagatzemen en parts separades de la memòria. Tanmateix, els nous tipus de punter permeten que les classes amb poques dades emmagatzemin objectes directament al punter. Aquest pas elimina la necessitat d'assignar memòria directament per a l'objecte, només cal crear un punter i l'objecte que hi ha dins. Els punters etiquetats només s'admeten a l'arquitectura de 64 bits, també a causa del fet que ja no hi ha prou espai en un punter de 32 bits per emmagatzemar prou dades útils. Per tant, iOS, a diferència d'OS X, encara no admetia aquesta funció. Tanmateix, amb l'arribada d'ARM64, això està canviant i iOS també s'ha posat al dia amb OS X en aquest sentit.

Tot i que els punters tenen una longitud de 64 bits, a l'ARM64 només s'utilitzen 33 bits per a la pròpia adreça del punter. I si som capaços de desemmascarar de manera fiable la resta de bits del punter, podem utilitzar aquest espai per emmagatzemar dades addicionals, com en el cas dels punters etiquetats esmentats. Conceptualment, aquest és un dels canvis més grans en la història de l'Objective-C, tot i que no és una característica comercialitzable, de manera que la majoria dels usuaris no sabrà com Apple està avançant Objective-C.

Pel que fa a les dades útils que es poden emmagatzemar a l'espai restant d'aquest punter etiquetat, Objective-C, per exemple, ara les utilitza per emmagatzemar l'anomenat recompte de referència (nombre de referències). Anteriorment, el recompte de referència s'emmagatzemava en un lloc diferent de la memòria, en una taula hash preparada per a això, però això podria alentir tot el sistema en el cas d'un gran nombre de trucades alloc/dealloc/retain/release. La taula s'havia de bloquejar a causa de la seguretat del fil, de manera que el recompte de referència de dos objectes en dos fils no es va poder canviar al mateix temps. No obstant això, aquest valor s'insereix recentment a la resta de l'anomenat isa indicadors. Aquest és un altre avantatge i una acceleració poc visibles, però enormes en el futur. Tanmateix, això no es podria aconseguir mai en una arquitectura de 32 bits.

La informació sobre objectes associats, si l'objecte té una referència feble, si és necessari generar un destructor per a l'objecte, etc., també s'insereix recentment al lloc restant dels punters als objectes. Gràcies a aquesta informació, l'Objective-C runtime és capaç d'accelerar fonamentalment el temps d'execució, que es reflecteix en la velocitat de cada aplicació. A partir de les proves, això significa aproximadament un 40-50% d'acceleració de totes les trucades de gestió de memòria. Només canviant als punters de 64 bits i utilitzant aquest nou espai.

Conclusió

Encara que els competidors intentaran difondre la idea que passar a una arquitectura de 64 bits és innecessari, ja sabreu que aquesta és només una opinió molt poc informada. És cert que canviar a 64 bits sense adaptar l'idioma o les aplicacions no vol dir res, fins i tot alenteix tot el sistema. Però el nou A7 utilitza un ARM64 modern amb un nou conjunt d'instruccions, i Apple s'ha pres la molèstia de modernitzar tot el llenguatge Objective-C i aprofitar les noves capacitats, d'aquí l'acceleració promesa.

Aquí hem esmentat un gran nombre de raons per les quals una arquitectura de 64 bits és el pas endavant correcte. És una altra revolució "sota el capó", gràcies a la qual Apple intentarà mantenir-se a l'avantguarda no només amb disseny, interfície d'usuari i ecosistema ric, sinó sobretot amb les tecnologies més modernes del mercat.

Font: mikeash.com
.