Sortie de la version 4.4 du compilateur GCC

Posté par  . Modéré par Anonyme.
Étiquettes :
38
21
avr.
2009
Gnu
Aujourd'hui la sortie de la version 4.4 du compilateur GCC a été annoncée sur la liste de diffusion du projet.
Écrit à l'origine par Richard Stallman, le logiciel GCC (GNU Compiler Collection) est le compilateur de référence du monde du logiciel libre. Il accepte des codes source écrits en C, C++, Objective-C, Fortran, Java et Ada et fonctionne sur une multitude d'architectures.

La sortie de GCC 4.4 a été grandement retardée par des questions d'ordre juridiques. En effet la FSF a dû se prononcer sur la nouvelle "Runtime Library Exception" qui autorise le passage des diverses bibliothèques sous licence GPLv3 ainsi que l'arrivée prochaine des greffons dans l'architecture de GCC. La FSF étant connue pour sa hâte toute relative sur les questions juridiques il a fallu patienter ce qui a provoqué un certain mécontentement chez plusieurs développeurs. Néanmoins le comité directeur de GCC a préféré jouer la prudence (better safe than fast) et attendre d'avoir l'aval des juristes de la FSF avant d'autoriser la sortie tant attendue.

Dans la suite de la dépêche, vous pourrez découvrir les nouveautés et les optimisations mises en œuvre dans cette version 4.4 de GCC.

NdM : pour l'anecdote, cette dépêche a été initialement soumise le 18 décembre 2008, a attendu la sortie officielle de GCC 4.4, et à ce titre remporte le titre de dépêche restée le plus longtemps en modération (le record précédent étant de 70 jours). Nouvel allocateur de registres

Un nouvel allocateur de registres sophistiqué est incorporé dans la version 4.4 de GCC.

L'allocation de registres est une tâche très importante qu'effectue le compilateur. En effet il doit arriver à assigner aux variables du programme un « endroit » où elles seront stockées pour exécution. Ce sont les registres du processeur qui vont accueillir ces variables mais, petit problème, ces registres sont fort peu nombreux alors que les variables d'un programme sont souvent très nombreuses. Typiquement un processeur x86 possède seulement 8 registres, la variante x86-64 en possède 16 et un processeur PowerPC jouit de 32 registres.

Pour trouver la solution optimale afin de « masquer » ce faible nombre de registres le compilateur doit s'appuyer sur des algorithmes très complexes souvent liés à la théorie des graphes et notamment au coloriage de graphes.

Le compilateur GCC 4.4 propose l'allocateur IRA (Integrated Register Allocator) qui est le résultat de plusieurs d'années d'expérimentation avec la branche YARA (Yet Another Register Allocator) par le développeur Vladimir Makarov qui travaille pour Red Hat.

Cet allocateur intégré ultra-moderne permet de choisir entre plusieurs algorithmes et plusieurs paramètres (avec les options -fira-algorithm et -fira-region).

En ce qui concerne les choix de -fira-algorithm on peut opter pour "CB" qui est un allocateur basé sur l'algorithme de Chaitin-Briggs ou pour "Priority" qui utilise l'algorithme de Chow. "CB" est utilisé par défaut.

Pour la région il est possible de choisir entre "All", "One" et "Mixed". L'option "All" fonctionne bien avec les processeurs n'ayant que peu de registres alors que l'option "One" considère toute la fonction comme une seule région et est bien adaptée aux architectures dotées d'un grand nombre de registres. Le troisième choix est un mélange des deux précédents (ce qui explique son nom "Mixed") et c'est celui qui est utilisé par défaut puisqu'il propose les meilleures performances dans la plupart des cas et sur la plupart des architectures de processeurs.

Pour avoir une idée du gain en performances il est possible de consulter cet article au format pdf de Vladimir Makarov. Les considérations techniques sont extrêmement absconses mais le paragraphe 3 propose un graphe comparant les scores des allocateurs de "Chaitin-Briggs" (sans région), de "Callahan-Koblenz" et du nouvel allocateur de GCC 4.4 (nommé "Regional" dans l'article). Que ce soit en terme de rapidité ou de taille de code la victoire du nouvel allocateur IRA est sans appel.

Branche Graphite

Après IRA la seconde grande nouveauté de GCC 4.4 est l'intégration de la branche "Graphite" qui permet d'optimiser l'exécution des boucles de code.

Cette étape d'optimisation des boucles effectuée par le compilateur est une tâche importante puisque le bénéfice en terme de temps d'exécution est souvent très visible. Du fait de ces optimisations savantes effectuées par le compilateur la pression sur la mémoire cache peut être réduite et le travail peut être mieux distribué entre les processeurs.

L'orientation choisie par la branche Graphite relève de la méthode des polytopes qui est une approche très mathématisée de la théorie des compilateurs. Pour résumer ce soubassement théorique on peut dire que cela consiste à transformer les boucles de code en figures géométriques complexes afin de trouver des optimisations puis à transformer à nouveau les figures en code optimisé.

Plus techniquement : un polygone est une figure fermée sur le plan et qui est délimitée par des segments de droite, un polyèdre c'est la même chose en trois dimensions et un polytope c'est la même chose en dimension n.

La méthode des polytopes consiste à transformer les boucles des programmes en polytopes (les itérations d'une boucle de code sont représentées comme des points à la "surface" de la figure multidimensionnelle), appliquer diverses opérations mathématiques sur ces polytopes (des transfomations affines) puis à transformer à nouveau les polytopes en boucles sémantiquement équivalentes aux boucles initiales mais super-optimisées.

On voit bien que le sujet est complexe et on ne s'étonnera donc pas que cette méthode ait surtout été développée par des universitaires dans diverses bibliothèques de programmes. Ainsi la bibliothèque Graphite qui est intégré dans GCC 4.4 est décrite en détail dans ce fichier pdf par des chercheurs de l'École des mines de Paris, de L'INRIA et de l'université d'Orsay. Selon ce document, GCC 4.4 est le tout premier compilateur de production au monde qui intègre une optimisation par la méthode des polytopes.

Les passes d'optimisation qui sont prises en charge par Graphite se déroulent quand le code source a été transformé dans la représentation générique GIMPLE. On fait ainsi une transformation GIMPLE -> Graphite -> GIMPLE pour optimiser toutes les boucles avec la méthode des polytopes ce qui explique le nom choisi pour Graphite (GIMPLE Represented as Polyhedra with Interchangeable Envelopes).

Actuellement ces passes d'optimisations sont mises en œuvre à l'aide des commandes "-floop-block", "-floop-interchange", "-floop-stripmine" et "-fgraphite" mais la discussion a été vive afin de trouver les conventions de nommages les plus explicites.

Le résultat brut est très impressionnant puisque selon Sebastian Pop (premier auteur de l'article sur Graphite et auteur de plusieurs autres présentations) le gain apporté par cette optimisation est inégalé (test effectué sur le benchmark spécifique swim du comparatif standard SPEC2000) : "Comparé aux performances du meilleur compilateur disponible, PathScale EKOPath (V2.1) avec l'option d'optimisation peak-SPEC, notre outil permet d'obtenir un gain de vitesse de 32% sur Athlon XP et de 38% sur Athlon 64. Nous ne sommes pas au courant d'un autre projet d'optimisation - manuel ou automatique - qui permettrait au benchmark swim d'atteindre ce niveau de performance sur processeur x86".

D'autres nouveautés en bref...

  • La nouvelle version 3 d'OpenMP (sortie en mai 2008) est gérée par GCC 4.4. OpenMP est une interface de programmation permettant d'écrire des programmes parallèles et cette version 3 apporte de nombreuses nouveautés (dont le très attendu tasking évoqué ici avec un comparatif des performances).

  • En ce qui concerne le langage C++ le travail sur le support de la future norme ISO C++0x continue vigoureusement et GCC 4.4 améliore encore la compatibilité avec ce nouveau standard. Ces nouvelles fonctions sont activables avec -std=c++0x et les progrès peuvent être suivis sur la page spéciale consacrée à C++0x du site GCC.

  • Côté Fortran on note l'amélioration du support de la norme Fortran 2003 avec l'introduction, par exemple, des entrées/sorties asynchrones ou des entrées/sorties en UTF-8. GCC 4.4 apporte également le tout début du support de Fortran 2008 (accessible avec -std=f2008) et on peut donc utiliser, entre autres, les nouvelles primitives mathématiques (ASINH, ACOSH, ATANH, BESSEL, etc).

  • En utilisant __attribute__ on peut profiter de nombreuses extensions spécifiques à GCC. La version 4.4 introduit la possibilité de changer le niveau d'optimisation pour certaines fonctions bien spécifiques dans son code. Il suffit d'utiliser pour ces fonctions l'attribut optimize et de spécifier un niveau d'optimisation. Cela peut être très utile pour optimiser dans son code une fonction qui est appelée fréquemment afin qu'elle s'exécute plus rapidement (-O3) alors qu'on préfère que les autres fonctions soient optimisées pour la taille (-Os).

  • Les processeurs Intel Itanium profitent, quand on sélectionne le niveau d'optimisation -O3, d'un tout nouvel ordonnanceur d'instructions. On sait que l'architecture VLIW est très sensible à la qualité du code généré par le compilateur car tout le pari de cette architecture est de simplifier la partie hardware pour déporter la complexité coté génération de code. Le nouvel ordonnanceur permet de mieux fusionner les instructions, de renommer les registres et de faire de la spéculation d'exécution pendant la phase d'ordonnancement.

  • GCC 4.4 apporte le support des dernières nouveautés du monde des processeurs. L'accélération matérielle du chiffrage AES est accessible (en ayant pour cible les processeurs Intel récents) avec l'option -maes tandis que les futures instructions vectorielles 256 bits AVX d'Intel, qui seront disponibles avec l'architecture Sandy Bridge prévue pour 2010/2011, sont accessibles avec l'option -mavx.

  • Le code généré pour l'architecture de processeur ARM est largement optimisé par rapport aux versions antérieures. Il est maintenant possible d'optimiser spécifiquement pour des cibles telles que la version ARM Cortex-A9 (dont le support a été introduit dans le dernier noyau 2.6.29) ou la version Cortex-R4(F).

  • Le support de l'architecture MIPS est significativement amélioré dans cette nouvelle version de GCC. Outre la génération de code pour les processeurs R10K, R12K, R14K et R16K on peut noter la possibilité d'optimiser le binaire pour les processeurs Cavium Octeon et pour les Loongson 2E/2F (du type de ceux qui se trouvent dans l'ultra-portable Gdium).

  • Les processeurs de type Picochip font leur entrée dans la très longue liste des architectures supportées par GCC. Picochip est un processeur 16 bits multi-cœur qui regroupe plusieurs centaines de cœurs DSP sur une seule puce afin d'accélérer les traitements réseaux.

  • Comme d'habitude avec chaque nouvelle version de GCC, la tolérance envers un code fautif est diminuée et le compilateur générera maintenant des erreurs alors que de simples alertes étaient signalées précédemment. On citera par exemple la sensibilité accrue du préprocesseur (chargé de lire les directives d'inclusions) qui refuse maintenant les #elif sans argument. Le développeur Debian Martin Michlmayr a listé les changements du préprocesseur ainsi que les nouveaux tests des includes manquants. Si vous êtes le mainteneur d'un paquet Debian alors Martin a déjà fait pour vous la déclaration de ces bugs triviaux (plus de 220 on été ouverts) et il ne vous reste plus qu'à corriger votre paquet pour que la compilation avec GCC 4.4 se déroule normalement.

L'infrastructure du projet...

La ferme de compilation du projet GCC a grandement augmenté ces derniers mois sa couverture des architectures supportées par le compilateur libre. Ce sont maintenant 12 architectures différentes qui sont représentées et on peut noter la présence de plusieurs bêtes de guerre (serveurs x86-64 bi-quad-cores avec 16 Go de mémoire vive).

Laurent Guerby est très impliqué dans la mise en place et l'organisation de cette ferme de compilation alors n'hésitez pas à prendre contact avec lui si vous pouvez faire un don de matériel ou obtenir des rabais auprès de vendeurs. Des machines puissantes en architecture mips, arm, powerpc64 ou sparc64 sont recherchées.

Pour finir...

Le compte rendu complet du sommet annuel GCC 2008 permet d'avoir une bonne idée du travail en cours sur le compilateur libre et de connaître à l'avance les nouveautés qui rentreront dans les futures versions. Les articles (très techniques) au format PDF sont disponibles sur le site du projet Fedora.

On y trouve notamment l'utilisation de GCC en tant qu'outil de vérification statique du code par les développeurs de Mozilla (Using GCC Instead of Grep and Sed), le travail sur la compilation incrémentale afin d'accélérer le cycle de développement (Incremental Compilation for GCC) ou encore l'inclusion de règles de codage directement dans le compilateur afin d'interdire la compilation de code non conforme aux normes édictées par un projet (Adding Coding Rule Checking Capabilities to the GCC Toolchain).

Aller plus loin

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.