Pechar anuncio

Mike Ash dedicado no seu blog as implicacións prácticas de cambiar á arquitectura de 64 bits no iPhone 5S. Este artigo baséase nos seus descubrimentos.

O motivo deste texto débese principalmente á gran cantidade de información errónea que se estende sobre o que realmente significa para os usuarios e o mercado o novo iPhone 5s cun procesador ARM de 64 bits. Aquí tentaremos achegar información obxectiva sobre o rendemento, as capacidades e as implicacións desta transición para os desenvolvedores.

"64 bits"

Hai dúas partes dun procesador ás que se pode referir a etiqueta "X-bit": o ancho dos rexistros enteiros e o ancho dos punteiros. Afortunadamente, na maioría dos procesadores modernos estes anchos son os mesmos, polo que no caso do A7 isto significa rexistros enteiros de 64 bits e punteiros de 64 bits.

Non obstante, é igualmente importante sinalar o que NON significa "64 bits": Tamaño da dirección física da RAM. O número de bits para comunicarse coa RAM (polo tanto, a cantidade de RAM que pode soportar un dispositivo) non está relacionado co número de bits da CPU. Os procesadores ARM teñen enderezos entre 26 e 40 bits e pódense cambiar independentemente do resto do sistema.

  • Tamaño do bus de datos. A cantidade de datos recibidos da memoria RAM ou buffer é igualmente independente deste factor. As instrucións individuais do procesador poden solicitar diferentes cantidades de datos, pero envíanse en anacos ou reciben máis do necesario da memoria. Depende do tamaño do quantum de datos. O iPhone 5 xa recibe datos da memoria en quanta de 64 bits (e ten un procesador de 32 bits), e podemos atoparnos con tamaños de ata 192 bits.
  • Calquera cousa relacionada co punto flotante. O tamaño destes rexistros (FPU) volve ser independente do funcionamento interno do procesador. ARM usa FPU de 64 bits desde antes de ARM64 (procesador ARM de 64 bits).

Vantaxes e inconvenientes xerais

Se comparamos arquitecturas idénticas de 32 bits e 64 bits, xeralmente non son tan diferentes. Esta é unha das razóns da confusión xeral do público que busca unha razón pola que Apple tamén se move a 64 bits nos dispositivos móbiles. Non obstante, todo provén dos parámetros específicos do procesador A7 (ARM64) e de como Apple o usa, non só do feito de que o procesador teña unha arquitectura de 64 bits.

Porén, se aínda observamos as diferenzas entre estas dúas arquitecturas, atoparemos varias diferenzas. O obvio é que os rexistros de enteiros de 64 bits poden manexar os enteiros de 64 bits de forma máis eficiente. Mesmo antes, era posible traballar con eles en procesadores de 32 bits, pero isto normalmente significaba dividilos en anacos longos de 32 bits, o que provocaba cálculos máis lentos. Polo tanto, un procesador de 64 bits xeralmente pode calcular con tipos de 64 bits tan rápido como cos de 32 bits. Isto significa que as aplicacións que normalmente usan tipos de 64 bits poden executarse moito máis rápido nun procesador de 64 bits.

Aínda que 64 bits non afecta a cantidade total de RAM que pode usar o procesador, pode facilitar o traballo con grandes anacos de RAM nun programa. Calquera programa que se execute nun procesador de 32 bits só ten uns 4 GB de espazo de enderezos. Tendo en conta que o sistema operativo e as bibliotecas estándar ocupan algo, isto deixa o programa entre 1 e 3 GB para o uso da aplicación. Non obstante, se un sistema de 32 bits ten máis de 4 GB de RAM, usar esa memoria é un pouco máis complicado. Temos que recorrer a forzar o sistema operativo a mapear estes anacos máis grandes de memoria para o noso programa (virtualización da memoria), ou podemos dividir o programa en múltiples procesos (onde cada proceso de novo ten teoricamente 4 GB de memoria dispoñibles para o enderezo directo).

Non obstante, estes "hacks" son tan difíciles e lentos que un mínimo de aplicacións os usan. Na práctica, nun procesador de 32 bits, cada programa só usará os seus 1-3 GB de memoria, e pódese usar máis memoria RAM dispoñible para executar varios programas ao mesmo tempo ou usar esta memoria como búfer (caché). Estes usos son prácticos, pero gustaríanos que calquera programa puidese usar facilmente anacos de memoria maiores de 4 GB.

Agora chegamos á afirmación frecuente (realmente incorrecta) de que sen máis de 4 GB de memoria, unha arquitectura de 64 bits é inútil. Un espazo de enderezos maior é útil incluso nun sistema con menos memoria. Os ficheiros mapeados na memoria son unha ferramenta útil onde parte do contido do ficheiro está loxicamente ligado á memoria do proceso sen que todo o ficheiro teña que cargarse na memoria. Así, o sistema pode, por exemplo, procesar gradualmente ficheiros grandes moitas veces máis grandes que a capacidade da memoria RAM. Nun sistema de 32 bits, os ficheiros tan grandes non se poden mapear de forma fiable na memoria, mentres que nun sistema de 64 bits, é fácil, grazas ao espazo de enderezos moito maior.

Non obstante, o maior tamaño dos punteiros tamén trae unha gran desvantaxe: se non, programas idénticos necesitan máis memoria nun procesador de 64 bits (estes punteiros máis grandes teñen que almacenarse nalgún lugar). Dado que os punteiros son unha parte frecuente dos programas, esta diferenza pode cargar a caché, o que á súa vez fai que todo o sistema funcione máis lento. Polo tanto, en perspectiva, podemos ver que se cambiamos a arquitectura do procesador a 64 bits, en realidade ralentizaría todo o sistema. Polo tanto, este factor ten que ser equilibrado con máis optimizacións noutros lugares.

ARM64

O A7, o procesador de 64 bits que alimenta o novo iPhone 5s, non é só un procesador ARM normal con rexistros máis amplos. ARM64 contén melloras importantes sobre a versión antiga de 32 bits.

Procesador Apple A7.

Rexistro

ARM64 contén o dobre de rexistros enteiros que ARM de 32 bits (teña coidado de non confundir o número e o ancho dos rexistros; falamos do ancho na sección "64 bits". Polo tanto, ARM64 ten o dobre de rexistros de ancho e o dobre de rexistros). rexistros). O ARM de 32 bits ten 16 rexistros enteiros: un contador de programa (PC - contén o número da instrución actual), un punteiro de pila (un punteiro a unha función en curso), un rexistro de ligazón (un punteiro para devolver despois de que a función sexa terminado), e os 13 restantes son para uso da aplicación. Non obstante, o ARM64 ten 32 rexistros enteiros, incluíndo un rexistro cero, un rexistro de ligazón, un punteiro de marco (similar a un punteiro de pila) e un reservado para o futuro. Isto déixanos 28 rexistros para o uso da aplicación, máis do dobre do ARM de 32 bits. Ao mesmo tempo, o ARM64 duplicou o número de rexistros de número de coma flotante (FPU) de 16 a 32 rexistros de 128 bits.

Pero por que é tan importante o número de rexistros? A memoria é xeralmente máis lenta que os cálculos da CPU e a lectura/escritura pode levar moito tempo. Isto faría que o procesador rápido tivese que seguir esperando por memoria e acadariamos o límite de velocidade natural do sistema. Os procesadores intentan ocultar esta desventaja con capas de búfers, pero incluso o máis rápido (L1) aínda é máis lento que o cálculo do procesador. Non obstante, os rexistros son celas de memoria directamente no procesador e a súa lectura/escritura é o suficientemente rápida como para non ralentizar o procesador. O número de rexistros practicamente significa a cantidade de memoria máis rápida para os cálculos do procesador, o que afecta moito á velocidade de todo o sistema.

Ao mesmo tempo, esta velocidade necesita un bo soporte de optimización do compilador, para que a linguaxe poida usar estes rexistros e non teña que almacenar todo na memoria xeral da aplicación (a lenta).

Conxunto de instrucións

ARM64 tamén trae cambios importantes ao conxunto de instrucións. Un conxunto de instrucións é un conxunto de operacións atómicas que pode realizar un procesador (por exemplo, 'ADD register1 register2' engade os números en dous rexistros). As funcións dispoñibles para as linguas individuais están compostas destas instrucións. As funcións máis complexas deben executar máis instrucións, polo que poden ser máis lentas.

Novidades en ARM64 son as instrucións para o cifrado AES, as funcións hash SHA-1 e SHA-256. Polo tanto, en lugar dunha implementación complexa, só a linguaxe chamará a esta instrución, o que achegará unha enorme aceleración ao cálculo de tales funcións e, con sorte, aumentará a seguridade nas aplicacións. p.ex. o novo Touch ID tamén utiliza estas instrucións na encriptación, o que permite unha velocidade e seguridade real (en teoría, un atacante tería que modificar o propio procesador para acceder aos datos, o que é pouco práctico dado o seu tamaño en miniatura).

Compatibilidade con 32 bits

É importante mencionar que o A7 pode funcionar completamente en modo de 32 bits sen necesidade de emulación. Significa que o novo iPhone 5s pode executar aplicacións compiladas en ARM de 32 bits sen ningunha desaceleración. Non obstante, entón non pode usar as novas funcións ARM64, polo que sempre paga a pena facer unha construción especial só para o A7, que debería funcionar moito máis rápido.

Cambios de tempo de execución

Runtime é o código que engade funcións á linguaxe de programación, que é capaz de utilizar mentres a aplicación está en execución, ata despois da tradución. Dado que Apple non precisa manter a compatibilidade das aplicacións (que un binario de 64 bits se executa en 32 bits), poderían permitirse facer algunhas melloras máis na linguaxe Objective-C.

Un deles é o chamado punteiro etiquetado (indicador marcado). Normalmente, os obxectos e os punteiros a eses obxectos almacénanse en partes separadas da memoria. Non obstante, os novos tipos de punteiro permiten que as clases con poucos datos almacenen obxectos directamente no punteiro. Este paso elimina a necesidade de asignar memoria directamente ao obxecto, só tes que crear un punteiro e o obxecto dentro del. Os punteiros etiquetados só se admiten na arquitectura de 64 bits tamén debido ao feito de que xa non hai espazo suficiente nun punteiro de 32 bits para almacenar suficientes datos útiles. Polo tanto, iOS, a diferenza de OS X, aínda non admitía esta función. Non obstante, coa chegada de ARM64, isto está cambiando e iOS tamén se puxo ao día con OS X neste sentido.

Aínda que os punteiros teñen 64 bits de lonxitude, no ARM64 só se usan 33 bits para o propio enderezo do punteiro. E se somos capaces de desenmascarar de forma fiable o resto dos bits do punteiro, podemos usar este espazo para almacenar datos adicionais, como no caso dos punteiros marcados mencionados. Conceptualmente, este é un dos maiores cambios na historia de Objective-C, aínda que non é unha característica comercializable, polo que a maioría dos usuarios non saberán como Apple está avanzando en Objective-C.

En canto aos datos útiles que se poden almacenar no espazo restante dun punteiro tan marcado, Objective-C, por exemplo, agora utilízao para almacenar o chamado conta de referencia (número de referencias). Anteriormente, o reconto de referencias almacenábase nun lugar diferente da memoria, nunha táboa hash preparada para iso, pero isto podería ralentizar todo o sistema no caso dunha gran cantidade de chamadas alloc/dealloc/retain/release. A táboa tivo que estar bloqueada debido á seguridade dos fíos, polo que non se puido cambiar o reconto de referencia de dous obxectos en dous fíos ao mesmo tempo. Non obstante, este valor insírese recentemente no resto dos chamados Xesús indicadores. Esta é outra vantaxe e aceleración discretas, pero enormes, no futuro. Non obstante, isto nunca se puido conseguir nunha arquitectura de 32 bits.

A información sobre obxectos asociados, se o obxecto ten unha referencia débil, se é necesario xerar un destrutor para o obxecto, etc., tamén se inseriu recentemente no lugar restante dos punteiros aos obxectos. Grazas a esta información, o Objective-C runtime é capaz de acelerar fundamentalmente o tempo de execución, o que se reflicte na velocidade de cada aplicación. A partir das probas, isto significa un 40-50% de aceleración de todas as chamadas de xestión de memoria. Só cambiando a punteiros de 64 bits e usando este novo espazo.

Conclusión

Aínda que os competidores tentarán difundir a idea de que pasar a unha arquitectura de 64 bits é innecesario, xa saberás que esta é só unha opinión moi pouco informada. É certo que cambiar a 64 bits sen adaptar o teu idioma ou as túas aplicacións non significa nada, incluso ralentiza todo o sistema. Pero o novo A7 usa un ARM64 moderno cun novo conxunto de instrucións, e Apple tomouse a molestia de modernizar toda a linguaxe Objective-C e aproveitar as novas capacidades, de aí a aceleración prometida.

Aquí mencionamos un gran número de razóns polas que unha arquitectura de 64 bits é o paso correcto. É outra revolución "baixo o capó", grazas á cal Apple intentará manterse á vangarda non só co deseño, a interface de usuario e o rico ecosistema, senón sobre todo coas tecnoloxías máis modernas do mercado.

Fonte: mikeash.com
.