Fermer l'annonce

Mike Ash dédié sur son blog les implications pratiques du passage à l'architecture 64 bits dans l'iPhone 5S. Cet article s’appuie sur ses conclusions.

La raison de ce texte est principalement due à la grande quantité de fausses informations diffusées sur ce que le nouvel iPhone 5s doté d'un processeur ARM 64 bits signifie réellement pour les utilisateurs et le marché. Nous essaierons ici d'apporter des informations objectives sur les performances, les capacités et les implications de cette transition pour les développeurs.

"64 bits"

Il y a deux parties d'un processeur auxquelles l'étiquette "X-bit" peut faire référence : la largeur des registres entiers et la largeur des pointeurs. Heureusement, sur la plupart des processeurs modernes, ces largeurs sont les mêmes, donc dans le cas de l'A7, cela signifie des registres entiers de 64 bits et des pointeurs de 64 bits.

Cependant, il est tout aussi important de souligner ce que « 64 bits » ne signifie PAS : Taille de l'adresse physique de la RAM. Le nombre de bits à communiquer avec la RAM (donc la quantité de RAM qu'un périphérique peut prendre en charge) n'est pas lié au nombre de bits du processeur. Les processeurs ARM ont des adresses comprises entre 26 et 40 bits et peuvent être modifiés indépendamment du reste du système.

  • Taille du bus de données. La quantité de données reçues de la RAM ou de la mémoire tampon est également indépendante de ce facteur. Les instructions de processeur individuelles peuvent demander différentes quantités de données, mais elles sont soit envoyées par morceaux, soit reçues plus que nécessaire de la mémoire. Cela dépend de la taille du quantum de données. L'iPhone 5 reçoit déjà les données de la mémoire en quanta de 64 bits (et dispose d'un processeur de 32 bits), et nous pouvons rencontrer des tailles allant jusqu'à 192 bits.
  • Tout ce qui concerne la virgule flottante. La taille de ces registres (FPU) est là encore indépendante du fonctionnement interne du processeur. ARM utilisait un FPU 64 bits avant ARM64 (processeur ARM 64 bits).

Avantages et inconvénients généraux

Si nous comparons des architectures 32 bits et 64 bits par ailleurs identiques, elles ne sont généralement pas si différentes. C'est l'une des raisons de la confusion générale du public qui cherche une raison pour laquelle Apple passe également au 64 bits sur les appareils mobiles. Cependant, tout vient des paramètres spécifiques du processeur A7 (ARM64) et de la manière dont Apple l'utilise, et pas seulement du fait que le processeur a une architecture 64 bits.

Cependant, si l’on regarde encore les différences entre ces deux architectures, on trouvera plusieurs différences. La plus évidente est que les registres d’entiers de 64 bits peuvent gérer les entiers de 64 bits plus efficacement. Même avant, il était possible de travailler avec eux sur des processeurs 32 bits, mais cela impliquait généralement de les diviser en morceaux de 32 bits, ce qui entraînait des calculs plus lents. Ainsi, un processeur 64 bits peut généralement calculer avec des types 64 bits aussi rapidement qu'avec des types 32 bits. Cela signifie que les applications qui utilisent généralement des types 64 bits peuvent s'exécuter beaucoup plus rapidement sur un processeur 64 bits.

Bien que 64 bits n'affecte pas la quantité totale de RAM que le processeur peut utiliser, cela peut faciliter le travail avec de grandes quantités de RAM dans un seul programme. Tout programme exécuté sur un processeur 32 bits ne dispose que d'environ 4 Go d'espace d'adressage. En tenant compte du fait que le système d'exploitation et les bibliothèques standard occupent quelque chose, cela laisse au programme entre 1 et 3 Go pour l'utilisation des applications. Cependant, si un système 32 bits dispose de plus de 4 Go de RAM, l’utilisation de cette mémoire est un peu plus compliquée. Nous devons forcer le système d'exploitation à mapper ces plus gros morceaux de mémoire pour notre programme (virtualisation de la mémoire), ou nous pouvons diviser le programme en plusieurs processus (où chaque processus dispose à nouveau théoriquement de 4 Go de mémoire disponible pour l'adressage direct).

Cependant, ces « hacks » sont si difficiles et lents qu’un minimum d’applications les utilisent. En pratique, sur un processeur 32 bits, chaque programme n'utilisera que ses 1 à 3 Go de mémoire, et plus de RAM disponible pourra être utilisée pour exécuter plusieurs programmes en même temps ou utiliser cette mémoire comme tampon (mise en cache). Ces utilisations sont pratiques, mais nous aimerions que n'importe quel programme puisse utiliser facilement des morceaux de mémoire supérieurs à 4 Go.

Venons-en maintenant à l’affirmation fréquente (en réalité incorrecte) selon laquelle sans plus de 4 Go de mémoire, une architecture 64 bits est inutile. Un espace d'adressage plus grand est utile même sur un système avec moins de mémoire. Les fichiers mappés en mémoire sont un outil pratique dans lequel une partie du contenu du fichier est logiquement liée à la mémoire du processus sans que l'intégralité du fichier doive être chargée en mémoire. Ainsi, le système peut, par exemple, traiter progressivement des fichiers volumineux plusieurs fois supérieurs à la capacité de la RAM. Sur un système 32 bits, des fichiers aussi volumineux ne peuvent pas être mappés en mémoire de manière fiable, alors que sur un système 64 bits, c'est un jeu d'enfant, grâce à l'espace d'adressage beaucoup plus grand.

Cependant, la taille plus grande des pointeurs présente également un inconvénient majeur : sinon, des programmes identiques nécessitent plus de mémoire sur un processeur 64 bits (ces pointeurs plus grands doivent être stockés quelque part). Étant donné que les pointeurs font fréquemment partie des programmes, cette différence peut surcharger le cache, ce qui à son tour ralentit l'exécution de l'ensemble du système. Donc, en perspective, nous pouvons voir que si nous changeions simplement l’architecture du processeur en 64 bits, cela ralentirait en fait l’ensemble du système. Ce facteur doit donc être contrebalancé par davantage d’optimisations à d’autres endroits.

ARM64

L'A7, le processeur 64 bits qui équipe le nouvel iPhone 5s, n'est pas seulement un processeur ARM classique avec des registres plus larges. ARM64 contient des améliorations majeures par rapport à l'ancienne version 32 bits.

Processeur Apple A7.

Registre

ARM64 contient deux fois plus de registres entiers qu'ARM 32 bits (attention à ne pas confondre le nombre et la largeur des registres - nous avons parlé de largeur dans la section "64 bits". Ainsi, ARM64 a à la fois deux fois plus de registres larges et deux fois plus de registres. registres). L'ARM 32 bits possède 16 registres entiers : un compteur de programme (PC - contient le numéro de l'instruction en cours), un pointeur de pile (un pointeur vers une fonction en cours), un registre de liaison (un pointeur vers le retour après la fin de la fonction), et les 13 restants sont destinés à une utilisation applicative. Cependant, l'ARM64 dispose de 32 registres entiers, dont un registre zéro, un registre de liaison, un pointeur de trame (similaire à un pointeur de pile) et un réservé pour le futur. Cela nous laisse avec 28 registres pour l'utilisation des applications, soit plus du double de l'ARM 32 bits. Dans le même temps, l'ARM64 a doublé le nombre de registres à virgule flottante (FPU), passant de 16 à 32 registres de 128 bits.

Mais pourquoi le nombre de registres est-il si important ? La mémoire est généralement plus lente que les calculs du processeur et la lecture/écriture peut prendre beaucoup de temps. Cela obligerait le processeur rapide à continuer d'attendre de la mémoire et nous atteindrions la limite de vitesse naturelle du système. Les processeurs tentent de masquer ce handicap avec des couches de tampons, mais même la plus rapide (L1) reste plus lente que le calcul du processeur. Cependant, les registres sont des cellules mémoire directement dans le processeur et leur lecture/écriture est suffisamment rapide pour ne pas ralentir le processeur. Le nombre de registres signifie pratiquement la quantité de mémoire la plus rapide pour les calculs du processeur, ce qui affecte grandement la vitesse de l'ensemble du système.

En même temps, cette vitesse nécessite un bon support d'optimisation de la part du compilateur, afin que le langage puisse utiliser ces registres et n'ait pas à tout stocker dans la mémoire générale de l'application (la lente).

Jeu d'instructions

ARM64 apporte également des changements majeurs au jeu d'instructions. Un jeu d'instructions est un ensemble d'opérations atomiques qu'un processeur peut effectuer (par exemple, « ADD registre1 registre2 » ajoute les nombres dans deux registres). Les fonctions disponibles dans chaque langue sont composées de ces instructions. Les fonctions plus complexes doivent exécuter plus d’instructions, elles peuvent donc être plus lentes.

Les nouveautés d'ARM64 sont les instructions pour le cryptage AES et les fonctions de hachage SHA-1 et SHA-256. Ainsi, au lieu d'une implémentation complexe, seul le langage appellera cette instruction - ce qui accélérera considérablement le calcul de ces fonctions et, espérons-le, renforcera la sécurité des applications. Par exemple. le nouveau Touch ID utilise également ces instructions dans le cryptage, permettant une réelle vitesse et sécurité (en théorie, un attaquant devrait modifier le processeur lui-même pour accéder aux données - ce qui est pour le moins peu pratique compte tenu de sa taille miniature).

Compatibilité avec 32 bits

Il est important de mentionner que l'A7 peut fonctionner entièrement en mode 32 bits sans avoir besoin d'émulation. Cela signifie que le nouvel iPhone 5s peut exécuter des applications compilées sur ARM 32 bits sans aucun ralentissement. Cependant, il ne peut pas utiliser les nouvelles fonctions ARM64, il est donc toujours intéressant de créer une version spéciale uniquement pour l'A7, qui devrait fonctionner beaucoup plus rapidement.

Modifications de l'exécution

Le runtime est le code qui ajoute des fonctions au langage de programmation, qu'il peut utiliser pendant l'exécution de l'application, jusqu'après la traduction. Étant donné qu'Apple n'a pas besoin de maintenir la compatibilité des applications (un binaire 64 bits fonctionne sur 32 bits), ils pourraient se permettre d'apporter quelques améliorations supplémentaires au langage Objective-C.

L'un d'eux est ce qu'on appelle pointeur étiqueté (indicateur marqué). Normalement, les objets et les pointeurs vers ces objets sont stockés dans des parties distinctes de la mémoire. Cependant, de nouveaux types de pointeurs permettent aux classes contenant peu de données de stocker des objets directement dans le pointeur. Cette étape élimine le besoin d'allouer de la mémoire directement à l'objet, il suffit de créer un pointeur et l'objet qu'il contient. Les pointeurs balisés ne sont pris en charge que dans l'architecture 64 bits, également en raison du fait qu'il n'y a plus assez d'espace dans un pointeur 32 bits pour stocker suffisamment de données utiles. Par conséquent, iOS, contrairement à OS X, ne prenait pas encore en charge cette fonctionnalité. Cependant, avec l'arrivée d'ARM64, la situation est en train de changer et iOS a également rattrapé OS X à cet égard.

Bien que les pointeurs aient une longueur de 64 bits, sur l'ARM64, seuls 33 bits sont utilisés pour la propre adresse du pointeur. Et si nous parvenons à démasquer de manière fiable le reste des bits du pointeur, nous pouvons utiliser cet espace pour stocker des données supplémentaires – comme dans le cas des pointeurs étiquetés mentionnés. Conceptuellement, il s'agit de l'un des changements les plus importants de l'histoire d'Objective-C, même s'il ne s'agit pas d'une fonctionnalité commercialisable. La plupart des utilisateurs ne sauront donc pas comment Apple fait avancer Objective-C.

Quant aux données utiles qui peuvent être stockées dans l'espace restant d'un tel pointeur balisé, Objective-C, par exemple, l'utilise désormais pour stocker ce qu'on appelle nombre de références (nombre de références). Auparavant, le décompte de références était stocké à un endroit différent de la mémoire, dans une table de hachage préparée à cet effet, mais cela pouvait ralentir l'ensemble du système dans le cas d'un grand nombre d'appels alloc/dealloc/retain/release. La table devait être verrouillée en raison de la sécurité des threads, de sorte que le nombre de références de deux objets dans deux threads ne pouvait pas être modifié en même temps. Cependant, cette valeur est nouvellement insérée dans le reste de ce que l'on appelle isa indicateurs. Il s’agit d’un autre avantage et d’une accélération discrets mais énormes pour l’avenir. Cependant, cela ne pourrait jamais être réalisé dans une architecture 32 bits.

Les informations sur les objets associés, si l'objet est faiblement référencé, s'il est nécessaire de générer un destructeur pour l'objet, etc., sont également nouvellement insérées à la place restante des pointeurs vers les objets. Grâce à ces informations, l'Objective-C Le runtime est capable d'accélérer fondamentalement le temps d'exécution, ce qui se reflète dans la vitesse de chaque application. D'après les tests, cela signifie une accélération d'environ 40 à 50 % de tous les appels de gestion de la mémoire. Simplement en passant aux pointeurs 64 bits et en utilisant ce nouvel espace.

Conclusion

Même si les concurrents tenteront de propager l’idée selon laquelle passer à une architecture 64 bits n’est pas nécessaire, vous savez déjà qu’il ne s’agit là que d’une opinion très mal informée. Il est vrai que passer simplement au 64 bits sans y adapter le langage ou les applications ne veut rien dire, cela ralentit même tout le système. Mais le nouvel A7 utilise un ARM64 moderne avec un nouveau jeu d'instructions, et Apple a pris la peine de moderniser l'ensemble du langage Objective-C et de profiter des nouvelles capacités - d'où l'accélération promise.

Nous avons mentionné ici un grand nombre de raisons pour lesquelles une architecture 64 bits constitue un bon pas en avant. C'est une autre révolution "sous le capot", grâce à laquelle Apple tentera de rester à l'avant-garde non seulement avec le design, l'interface utilisateur et l'écosystème riche, mais surtout avec les technologies les plus modernes du marché.

Source: mikeash.com
.