Anuncio cerrado

mike ceniza dedicado en su blog las implicaciones prácticas de cambiar a la arquitectura de 64 bits en el iPhone 5S. Este artículo se basa en sus hallazgos.

El motivo de este texto se debe principalmente a la gran cantidad de desinformación que se está difundiendo sobre lo que realmente significa para los usuarios y el mercado el nuevo iPhone 5s con procesador ARM de 64 bits. Aquí intentaremos brindar información objetiva sobre el rendimiento, las capacidades y las implicaciones de esta transición para los desarrolladores.

"64 bits"

Hay dos partes de un procesador a las que puede hacer referencia la etiqueta "X-bit": el ancho de los registros enteros y el ancho de los punteros. Afortunadamente, en la mayoría de los procesadores modernos estos anchos son los mismos, por lo que en el caso del A7 esto significa registros enteros de 64 bits y punteros de 64 bits.

Sin embargo, es igualmente importante señalar lo que NO significa "64 bits": Tamaño de la dirección física de la RAM. La cantidad de bits para comunicarse con la RAM (por lo tanto, la cantidad de RAM que puede admitir un dispositivo) no está relacionada con la cantidad de bits de la CPU. Los procesadores ARM tienen direcciones de entre 26 y 40 bits y se pueden cambiar independientemente del resto del sistema.

  • Tamaño del bus de datos. La cantidad de datos recibidos de la RAM o de la memoria intermedia es igualmente independiente de este factor. Las instrucciones individuales del procesador pueden solicitar diferentes cantidades de datos, pero se envían en fragmentos o se reciben de la memoria más de lo necesario. Depende del tamaño del cuanto de datos. El iPhone 5 ya recibe datos de la memoria en cuantos de 64 bits (y tiene un procesador de 32 bits), y podemos encontrar tamaños de hasta 192 bits.
  • Todo lo relacionado con punto flotante.. El tamaño de dichos registros (FPU) vuelve a ser independiente del funcionamiento interno del procesador. ARM ha estado usando FPU de 64 bits desde antes de ARM64 (procesador ARM de 64 bits).

Ventajas y desventajas generales.

Si comparamos arquitecturas de 32 bits y 64 bits idénticas, generalmente no son tan diferentes. Esta es una de las razones de la confusión general del público que busca una razón por la que Apple también está migrando a 64 bits en dispositivos móviles. Sin embargo, todo proviene de los parámetros específicos del procesador A7 (ARM64) y de cómo lo usa Apple, no solo del hecho de que el procesador tiene una arquitectura de 64 bits.

Sin embargo, si seguimos mirando las diferencias entre estas dos arquitecturas, encontraremos varias diferencias. La obvia es que los registros de enteros de 64 bits pueden manejar números enteros de 64 bits de manera más eficiente. Incluso antes, era posible trabajar con ellos en procesadores de 32 bits, pero esto generalmente significaba dividirlos en partes de 32 bits, lo que provocaba cálculos más lentos. Por lo tanto, un procesador de 64 bits generalmente puede calcular con tipos de 64 bits tan rápido como con los de 32 bits. Esto significa que las aplicaciones que generalmente utilizan tipos de 64 bits pueden ejecutarse mucho más rápido en un procesador de 64 bits.

Aunque 64 bits no afecta la cantidad total de RAM que puede usar el procesador, puede facilitar el trabajo con grandes cantidades de RAM en un programa. Cualquier programa que se ejecute en un procesador de 32 bits sólo tiene unos 4 GB de espacio de direcciones. Teniendo en cuenta que el sistema operativo y las bibliotecas estándar ocupan algo, esto deja al programa entre 1 y 3 GB para uso de la aplicación. Sin embargo, si un sistema de 32 bits tiene más de 4 GB de RAM, utilizar esa memoria es un poco más complicado. Tenemos que recurrir a forzar al sistema operativo a asignar estos fragmentos más grandes de memoria para nuestro programa (virtualización de memoria), o podemos dividir el programa en múltiples procesos (donde cada proceso nuevamente tiene teóricamente 4 GB de memoria disponible para direccionamiento directo).

Sin embargo, estos "trucos" son tan difíciles y lentos que un mínimo de aplicaciones los utilizan. En la práctica, en un procesador de 32 bits, cada programa sólo utilizará entre 1 y 3 GB de memoria, y se puede utilizar más RAM disponible para ejecutar varios programas al mismo tiempo o utilizar esta memoria como búfer (almacenamiento en caché). Estos usos son prácticos, pero nos gustaría que cualquier programa pudiera utilizar fácilmente fragmentos de memoria superiores a 4 GB.

Ahora llegamos a la afirmación frecuente (en realidad incorrecta) de que sin más de 4 GB de memoria, una arquitectura de 64 bits es inútil. Un espacio de direcciones más grande es útil incluso en un sistema con menos memoria. Los archivos mapeados en memoria son una herramienta útil donde parte del contenido del archivo está vinculado lógicamente a la memoria del proceso sin que sea necesario cargar todo el archivo en la memoria. De este modo, el sistema puede, por ejemplo, procesar gradualmente archivos de gran tamaño que superan con creces la capacidad de la RAM. En un sistema de 32 bits, archivos tan grandes no se pueden mapear en memoria de manera confiable, mientras que en un sistema de 64 bits, es pan comido, gracias al espacio de direcciones mucho mayor.

Sin embargo, el mayor tamaño de los punteros también conlleva una gran desventaja: por lo demás, programas idénticos necesitan más memoria en un procesador de 64 bits (estos punteros más grandes deben almacenarse en algún lugar). Dado que los punteros son una parte frecuente de los programas, esta diferencia puede sobrecargar el caché, lo que a su vez hace que todo el sistema funcione más lento. Entonces, en perspectiva, podemos ver que si simplemente cambiáramos la arquitectura del procesador a 64 bits, en realidad ralentizaría todo el sistema. Por lo tanto, este factor debe equilibrarse con más optimizaciones en otros lugares.

ARM64

El A7, el procesador de 64 bits que alimenta el nuevo iPhone 5s, no es sólo un procesador ARM normal con registros más amplios. ARM64 contiene importantes mejoras con respecto a la versión anterior de 32 bits.

Procesador Apple A7.

registro

ARM64 contiene el doble de registros enteros que ARM de 32 bits (tenga cuidado de no confundir el número y el ancho de los registros; hablamos del ancho en la sección "64 bits". Por lo tanto, ARM64 tiene registros el doble de ancho y el doble de registros). El ARM de 32 bits tiene 16 registros enteros: un contador de programa (PC - contiene el número de la instrucción actual), un puntero de pila (un puntero a una función en curso), un registro de enlace (un puntero al retorno después del final de la función), y los 13 restantes son para uso de la aplicación. Sin embargo, el ARM64 tiene 32 registros de números enteros, incluido un registro cero, un registro de enlace, un puntero de marco (similar a un puntero de pila) y uno reservado para el futuro. Esto nos deja con 28 registros para uso de aplicaciones, más del doble que ARM de 32 bits. Al mismo tiempo, el ARM64 duplicó el número de registros de números de punto flotante (FPU) de 16 a 32 registros de 128 bits.

Pero ¿por qué es tan importante el número de registros? La memoria es generalmente más lenta que los cálculos de la CPU y la lectura/escritura puede llevar mucho tiempo. Esto haría que el rápido procesador tuviera que seguir esperando memoria y alcanzaríamos el límite natural de velocidad del sistema. Los procesadores intentan ocultar esta desventaja con capas de buffers, pero incluso el más rápido (L1) es aún más lento que el cálculo del procesador. Sin embargo, los registros son celdas de memoria directamente en el procesador y su lectura/escritura es lo suficientemente rápida como para no ralentizar el procesador. El número de registros prácticamente significa la cantidad de memoria más rápida para los cálculos del procesador, lo que afecta en gran medida la velocidad de todo el sistema.

Al mismo tiempo, esta velocidad necesita un buen soporte de optimización por parte del compilador, para que el lenguaje pueda usar estos registros y no tenga que almacenar todo en la memoria general de la aplicación (la lenta).

Conjunto de instrucciones

ARM64 también trae cambios importantes al conjunto de instrucciones. Un conjunto de instrucciones es un conjunto de operaciones atómicas que un procesador puede realizar (por ejemplo, 'AGREGAR registro1 registro2' suma los números en dos registros). Las funciones disponibles para cada idioma se componen de estas instrucciones. Las funciones más complejas deben ejecutar más instrucciones, por lo que pueden ser más lentas.

Lo nuevo en ARM64 son las instrucciones para el cifrado AES, las funciones hash SHA-1 y SHA-256. Entonces, en lugar de una implementación compleja, solo el lenguaje llamará a esta instrucción, lo que acelerará enormemente el cálculo de dichas funciones y, con suerte, agregará seguridad en las aplicaciones. P.ej. el nuevo Touch ID también utiliza estas instrucciones en el cifrado, lo que permite una velocidad y seguridad reales (en teoría, un atacante tendría que modificar el procesador para acceder a los datos, lo cual es poco práctico, por decir lo menos, dado su tamaño en miniatura).

Compatibilidad con 32 bits

Es importante mencionar que el A7 puede ejecutarse completamente en modo de 32 bits sin necesidad de emulación. Significa que el nuevo iPhone 5s puede ejecutar aplicaciones compiladas en ARM de 32 bits sin ninguna ralentización. Sin embargo, entonces no puede utilizar las nuevas funciones ARM64, por lo que siempre vale la pena hacer una compilación especial solo para el A7, que debería funcionar mucho más rápido.

Cambios de tiempo de ejecución

El tiempo de ejecución es el código que agrega funciones al lenguaje de programación, que es capaz de utilizar mientras la aplicación se está ejecutando, hasta después de la traducción. Dado que Apple no necesita mantener la compatibilidad de las aplicaciones (que un binario de 64 bits se ejecuta en 32 bits), podrían permitirse el lujo de realizar algunas mejoras más en el lenguaje Objective-C.

Uno de ellos es el llamado puntero etiquetado (puntero marcado). Normalmente, los objetos y los punteros a esos objetos se almacenan en partes separadas de la memoria. Sin embargo, los nuevos tipos de puntero permiten que las clases con pocos datos almacenen objetos directamente en el puntero. Este paso elimina la necesidad de asignar memoria directamente para el objeto, simplemente cree un puntero y el objeto dentro de él. Los punteros etiquetados solo se admiten en la arquitectura de 64 bits, también debido al hecho de que ya no hay suficiente espacio en un puntero de 32 bits para almacenar suficientes datos útiles. Por lo tanto, iOS, a diferencia de OS X, aún no admitía esta función. Sin embargo, con la llegada de ARM64 esto está cambiando, y iOS ha alcanzado a OS X también en este aspecto.

Aunque los punteros tienen una longitud de 64 bits, en el ARM64 sólo se utilizan 33 bits para la dirección propia del puntero. Y si podemos desenmascarar de manera confiable el resto de los bits del puntero, podemos usar este espacio para almacenar datos adicionales, como en el caso de los punteros etiquetados mencionados. Conceptualmente, este es uno de los mayores cambios en la historia de Objective-C, aunque no es una característica comercializable, por lo que la mayoría de los usuarios no sabrán cómo Apple está haciendo avanzar Objective-C.

En cuanto a los datos útiles que se pueden almacenar en el espacio restante de dicho puntero etiquetado, Objective-C, por ejemplo, ahora lo utiliza para almacenar el llamado recuento de referencias (número de referencias). Anteriormente, el recuento de referencias se almacenaba en un lugar diferente de la memoria, en una tabla hash preparada para ello, pero esto podría ralentizar todo el sistema en el caso de una gran cantidad de llamadas alloc/dealloc/retain/release. La tabla tuvo que bloquearse debido a la seguridad de los subprocesos, por lo que el recuento de referencias de dos objetos en dos subprocesos no se pudo cambiar al mismo tiempo. Sin embargo, este valor se inserta nuevamente en el resto de los llamados isa indicadores. Esta es otra ventaja y aceleración discreta pero enorme en el futuro. Sin embargo, esto nunca podría lograrse en una arquitectura de 32 bits.

En el lugar restante de los punteros a los objetos también se inserta información sobre los objetos asociados, si el objeto tiene una referencia débil, si es necesario generar un destructor para el objeto, etc.. Gracias a esta información, Objective-C runtime es capaz de acelerar fundamentalmente el tiempo de ejecución, lo que se refleja en la velocidad de cada aplicación. Según las pruebas, esto significa una aceleración de entre un 40% y un 50% de todas las llamadas de administración de memoria. Simplemente cambiando a punteros de 64 bits y usando este nuevo espacio.

Záver

Aunque los competidores intentarán difundir la idea de que pasar a una arquitectura de 64 bits es innecesario, ya sabrás que esto es sólo una opinión muy desinformada. Es cierto que pasar a 64 bits sin adaptar el idioma o las aplicaciones no significa nada, incluso ralentiza todo el sistema. Pero el nuevo A7 utiliza un ARM64 moderno con un nuevo conjunto de instrucciones, y Apple se ha tomado la molestia de modernizar todo el lenguaje Objective-C y aprovechar las nuevas capacidades, de ahí la aceleración prometida.

Aquí hemos mencionado una gran cantidad de razones por las que una arquitectura de 64 bits es el paso correcto hacia adelante. Se trata de otra revolución "bajo el capó", gracias a la cual Apple intentará mantenerse a la vanguardia no sólo con el diseño, la interfaz de usuario y el rico ecosistema, sino principalmente con las tecnologías más modernas del mercado.

Fuente: mikeash.com
.