Les trois générations de SoC ARM Cortex-A (ARMv7) et quelques options d’optimizations de GCC

J’ai commencé à rédiger cet article durant l’automne 2013, des changements ont été apportés depuis, ils sont en gras dans le texte.

Quelques références :
* ARM Compiler toolchain Assembler Reference sur les documentations d’ARM
* GCC ARM Options, que l’on trouve aussi dans le man de gcc.

Les trois séries de l’architecture ARMv7

Pour commencer, l’architecture ARMv7 est la dernière architecture 32 bits de la société britannique ARM. Cette architecture se décline en 3 versions :
* Cortex-A (comme appliance => application), les microprocesseurs informatique (téléphones, tablettes, ordinateurs, serveurs).
* Cortex-M (comme microcontroler), micro-contrôleur pour les systèmes embarqué (domotique, électronique…).
* Cortex-R (comme real-time => Temps réel), dans le monde du temps réel (robotique, transports, etc…).

L’architecture suivante, ARMv8 est une architecture 64 bits, les séries équivalentes au Cortex-A sont les séries Cortex-A50.

Les trois générations de Cortex-A

Les séries Cortex-A, qui nous intéressent dans cet article, sont décomposées en trois génération. A chaque génération des fonctionnalités majeur sont ajoutées, l’efficacité énergétique et améliorée et la puissance du processeur le plus puissant de sa génération est augmentée.
Sur les versions consommant moins d’énergie, des concessions sont faites sur la puissance de calcul, en réduisant les pipelines par exemple ou le nombre de registres. Dans tous les cas, la compatibilité totale est conservée entre différents processeurs d’une même génération, mais si un programme optimisé pour le Cortex-A7 par exemple, fonctionnera sur le Cortex-A15, elle ne sera pas forcément optimale pour celui-ci et réciproquement.

* La première génération se limitait au Cortex-A8, architecture mono-processeur, elle met à jour le SIMD des ARMv6 en NEON (ou advanced SIMD), passe l’unité de calcul vectoriel flottant à VFP3, mais en version allégée (dix fois plus lente que les générations suivantes), ajoute Thumb-EE et fait évolué Thumb2, en lui permettant d’utiliser des instructions 16bits, afin de rendre le code plus compact et donc plus efficace au niveau des caches et de la bande passante.
* La seconde génération ajoute le support du multiprocesseur (ou multicœur), celle-ci se limitant a un type de processeur à la fois. Elle utilise toujours VFPv3, mais en version complète. Cette génération comprend le Cortex-A9 (également appelée Cortex-A9 MP-Core), la version la plus puissante, et le Cortex-A5, la version très basse consommation.
* La troisième génération, ajoute la virtualisation matérielle, LPAE permettant un adressage étendu à 40 bits (jusqu’à 1 Tio), car avec 32 bits d’adressage, on ne peut gérer que 4 Gio (232= 22 × 210 × 210 × 210 = 4 × 1024 × 1024 × 1024 = 4194304 octets), elle est déclinée en 3 versions, le Cortex-A15, le plus puissant, le Cortex-A7, le plus économique en énergie, et le futur Cortex-A12, de puissance intermédiaire (Le Cortex-A12 a finalement été abandonné au profit du Cortex-A17 avec de bien meilleures performances, tout en réduisant sa consommation électrique. Il est par exemple utilisé dans l’excellent Rockchip RK3288, au top de la liste des ARM 32 bits, qui en comporte 4 cœurs. L’architecture big.LITTLE (gros.PETIT) à été ajoutée, permettant d’assembler de faire coopérer de différente puissance ensemble, afin d’améliorer encore l’efficacité énergétique, tout en augmentant la puissance de calcul potentielle, lorsqu’elle est nécessaire. Il passe également l’unité flottante à VFPv4.

Lequel choisir ?

Les différences entre les implémentations font, que les différences entre des modèles pris deux par deux, peuvent donner l’avantage sur un point, et le désavantage pour un un autre point.

Par exemple, si l’on cherche la puissance de calcul. Le Cortex-A8 est à peu près équivalent au Cortex-A7 au niveau puissance. Le Cortex-A7 est beaucoup plus efficace au niveau énergétique, bien meilleur au niveau flottant (VFPv4 contre VFPv3 lite), mais un tout petit peu moins bon au niveau calcul entier et exécution en général. Cela est largement compensé par le fait que le Cortex-A7 est multicœur, Lui permettant au final, d’avoir une plus basse consommation en général, et de bien meilleur performances lorsque nécessaire.

Le reste à été adapté ou augmenté avec la grosse évolution intervenue entre octobre 2013 et août 2014

Big.LITTLE, compromis permettant la très faible consommation et une certaine puissance

Les architectures de type big.LITTLE sont réputés peu efficace. Cela est principalement dû au fait que le premier modèle sorti, dans des smartphones Samsung, ne permettaient à l’époque que d’utiliser simultanément soit les 4 big, soit les 4 LITTLE. Ceci n’est pas une limitation matérielle mais logicielle. A cette époque, le premier gestionnaire de big.LITTLE développé dans le noyau Linux, appelé IKS (« In Kernel Switching », signifiant en anglais « Commutation dans le noyau » et également connu sous le nom CPU migration ou migration de CPU), encore rudimentaire ne permettait que ce type de changement. Au même moment était en développement dans le nouveau noyau Linux, le mode utilisé actuellement avec tous les processeurs big.LITTLE, le mode GTS (« Global Task Scheduling », signifiant en anglais « ordonnancement de tâches global »). Ce mode permet de n’utiliser qu’un seul, que quelques un ou tous les processeurs simultanément. Pour aller plus loin (en anglais). Pendant ce temps, GCC a également été améliorer pour optimiser le logiciel compilé pour ces architectures, via l’option -mcpu=cortex-a15.cortex-a7, son équivalent pour l’architecture ARM 64 bit (ARMv8 ou AARM64) qui est en train d’arriver sur le marché est -mcpu=cortex-a57.cortex-a53.

ARM 64 bits et PC industriels

D’ici la fin de cette année arrivent sur le marché les plate-formes 64 bits ARM, les principaux constructeurs (AllWinner, MediaTek, Nvidia, Qualcomm, Samsung). Des modèles expérimentaux, comme le XGene (en FGPA) étaient sortis il y a deux ans, Apple avait sorti le premier processeur ARMv8 en ASIC, avec l’Apple A7 conçu par Samsung et enfin, ARM à sorti la plate-forme de développement Juno cette année. Les autres constructeurs commencent à sortir des produits pour les développeurs, et les produits finis de la majorité des constructeurs devraient arriver fin 2014 ou début 2015. Ces processeurs pourront être intégrés dans les portables ou dans les serveurs. AMD propose par exemple une carte mère au format ATX, supportant de la DDR3 ECC (l’ECC est indispensable pour la disponibilité des serveurs industriels) via des ports DIMM standard, des bus PCI, des ports S-ATA, etc… et un bloc d’alimentation standard. On voyait différents constructeurs exposer ce type de carte mères dans les spécialisés il y a un an déjà, pour commencer à démarcher les développeurs et intégrateurs.

Les cartes mères liées à l’architecture 64 bits, permettrons de mettre des cartes graphiques de bureau, tout en réduisant drastiquement la consommation du processeur. Le rendement des processeurs Intel étant vraiment la partie la moins efficace des PC, on aura un bon compromis efficacité processeur, puissance raisonnable et efficacité GPU, comme ceux déjà présent aujourd’hui dans les serveurs de calcul et PC de jeux.

En pratique

Ce que j’ai constaté. la Cubieboard2 avec ses 2 Cortex-A7 (avant tout orientés très très basse conso), est suffisant pour un poste de travail de base (web, multimédia de base, bureautique). Ca n’est par contre pas du tout adapté au calcul intensif (traitement d’images RAW avec logiciels spécialisés par exemple, 3d (pas d’OpenGL, donc pas Blender), minage de bitcoin (même en LiteCoin, impossible de sortir quoi que ce soit). Les développements des fonctionnalités de base des SoC Allwinner ne sont pas terminés dans le noyau Linux standard, ce qui permettre d’espérer encore quelques très nettes améliorations dans des domaines essentiels (DMA, utilisation du proc spécialisé crypto dans les bibliothèques SSL, etc…), ce qui ne sera pas désagréable en soit, mais, finalement changera peu de chose, puisque c’est déjà largement utilisable pour du SSH ou du surf en HTTPS. La plus grande efficacité réduira par contre, probablement d’autant la consommation énergétique.

Le futur, commence aujourd’hui

Beau titre creux, mais ça m’amuse. Les tous nouveaux modèles 32 bits apportent tout de même l’avantage du support OpenGL complet et pas seulement OpenGL ES, ainsi qu’OpenCL permettant d’utiliser toutes les fonctions que l’on trouve sur un système standard. 4 cortex A15 + 4 Cortex A7 sont également beaucoup plus puissant que 2 Cortex A7, permettant de commencer à entrer dans des efficacités plus standard pour une utilisation encore légère du calcul intensif, comme par exemple pour le traitement d’image, les coprocesseur, et l’utilisation grandissante du SIMD NEON dans les bibliothèques aidant. Cela vaut peut être le coût d’attendre les ARM 64 bits, mais si les développement du support Linux (le principal support en fait) ont réellement commencé à tous les niveaux il y a 2 ans, devraient permettre d’obtenir assez rapidement une plate-forme stable et performante.

La décrépitude d’Intel annoncée

Intel demande à des constructeurs chinois qui font de l’ARM, comme Rockchip de construire des processeurs x86 très basse consommation pour tenter de combler son retard dans ce domaine, mais inefficacité de l’architecture x86 est lié à un lourd historique, qui était déjà critiqué il y a 15 ans, et qui n’est pas allé en s’améliorant depuis. D’un autre côté les fondeurs de processeurs, comme TSMC sont aujourd’hui plus intéressé par le développement de plate-forme ARM que dans les processeurs de cartes graphiques pour architecture x86 d’Intel, plutôt en raison du succès d’ARM dans le domaine des plate-formes mobiles (IoT (internet des choses), smartphones, tablettes, smartbook (ordinateur portables utilisant de l’ARM) et smarttop (client légers ou petites boites de puissance modérée pour bureautique et jeux vidéos utilisant des processeurs mobiles ARM).

Laisser un commentaire