Compilation avancée et optimisation de programmes
Cours de recherche (30h de cours, travail
sur des articles scientifiques)
Cours : Fabrice Rastello, Alain Darte (Fabrice.Rastello, Alain.Darte)
Présentation générale
Un compilateur n'est autre qu'un traducteur d'un langage (par
exemple C ou Caml) vers un autre (par exemple un langage
assembleur). Bien entendu, les langages de programmation sont dotés
de propriétés sympathiques (par exemple grâce aux grammaires LALR)
qui font que les traductions des compilateurs sont, heureusement,
nettement plus convaincantes que celles d'un traducteur de langage
naturel comme Babel Fish! On ne s'intéressera pas dans ce cours à
ces problèmes de traduction, aujourd'hui bien maîtrisés.
Aujourd'hui, on demande bien plus à un compilateur, on veut qu'il
génère du code non seulement correct (traduction) mais aussi
efficace pour l'architecture cible (compilateur optimisant). Écrire
"from scratch" un compilateur pour un processeur spécifique prend
plusieurs années pour une équipe d'ingénieurs et, avec la pression
du marché ("time-to-market") et l'évolution rapide des processeurs,
cette approche n'est pas viable. On préfère produire des
compilateurs dits reciblables, optimisants, pour une gamme de
processeurs.
La difficulté et l'intérêt (du point de vue du chercheur) résident
dans la mise au point d'optimisations. On souhaite que le code soit
rapide, qu'il génère le moins de trafic mémoire possible, qu'il
consomme peu, qu'il soit compact, etc. En pratique, une
optimisation est une recette de cuisine pour transformer, améliorer
le code, enrichir l'information que l'on a de celui-ci. Les recettes
de cuisine sont bien entendu plus ou moins sophistiquées et
coûteuses, et la difficulté pour l'ingénieur-cuisinier est de les
faire cohabiter et de les utiliser à bon escient. Ainsi, la
compilation est avant tout un problème d'ingénierie (certes
d'experts) où la difficulté réside dans le choix des représentations
intermédiaires du code et des informations qui lui sont associées:
la représentation intermédiaire permet ou non d'exprimer
trivialement certaines propriétés, ce qui influence considérablement
l'implémentabilité de tel ou tel outil d'analyse.
On verra entre autres que les outils "mathématiques" nécessaires aux
optimisations en compilation sont relativement divers (théorie des
graphes, propriétés de treillis, programmation linéaire,
ordonnancement) selon les représentations intermédiaires (graphe de
flot de contrôle, forme SSA, forme psi-SSA, boucles imbriquées), les
niveaux d'abstraction du code (code source ou code assembleur), et
les fonctionnalités architecturales (instructions avec prédicats,
registres). Le but de ce cours sera donc de décrire un certain
nombre de phases d'analyses et de transformations relativement
classiques et d'en profiter pour donner un aperçu des outils
utilisés par le chercheur en optimisation de programmes.
Contenu du cours (indicatif)
Les thèmes suivants seront traités:
-
Représentations intermédiaires
- CFG, psi-SSA, dominance, loop-forest,
etc.
- Analyses
- dépendances, durée de vie, alias, flot de données:
treillis, points fixes
- Transformations
- fusion de boucles, pavage, contraction de
tableaux: ILP, graphes, polyèdres, "lattices"
- Allocation de registres
- affectation et allocation, vidage en
mémoire, "coalescing": graphes, optimisation combinatoire, LP
- Ordonnancement
- DAG, pipeline logiciel: ILP, approximabilité,
retiming
- Domaines d'application
- compilation parallèle, processeurs VLIW,
compilation dynamique et bytecode Java, synthèse de circuits
Note: Benoît Dupont de Dinechin (STMicroelectronics) interviendra
probablement lors d'un cours pour présenter les enjeux actuels de son
équipe de compilation.
Acronymes:
-
CFG: control flow graph
- SSA: static single assignment
- LP: linear programming
- ILP: integer linear programming
- DAG: directed acyclic graph
Bibliographie
-
Architecture
-
-
John L. Hennessy et David A. Patterson. Computer
architecture: a quantitative approach (2nd edition). Morgan
Kaufmann, 1996.
- W. A. Triebel. Itanium Architecture for Software
Developers. Intel Press, 2000.
- Compilation et parallélisation automatique
-
- Hans Zima et Barbara Chapman. Supercompilers for Parallel
and Vector Computers. ACM Press, 1990.
- Michael Wolfe. High Performance Compilers For Parallel
Computing. Addison-Wesley Publishing Company, 1996.
- A. W. Appel. Modern Compiler Implementation in ML (or
Java). Cambridge University Press, 1998.
- Alain Darte, Yves Robert et Frédéric Vivien. Scheduling
and Automatic Parallelization. Birkhauser, 2000.
- J. Xue. Loop Tiling for Parallelism. Kluwer Academic
Publishers, 2000.
- Randy Allen et Ken Kennedy. Optimizing Compilers for
Modern Architectures. Morgan Kaufman Publishers, 2002.
- Ordonnancement
-
-
R. G. Parker. Deterministic Scheduling Theory. Chapman and
Hall, 1995.
- P. Chrétienne et E. G. Coffman. Scheduling Theory and its
Applications. J. Wiley and Sons. 1995.
- P. Brucker. Scheduling Algorithms. Springer, 1998.