• Aucun résultat trouvé

R´ eduction de force des op´ erateurs

N/A
N/A
Protected

Academic year: 2022

Partager "R´ eduction de force des op´ erateurs"

Copied!
13
0
0

Texte intégral

(1)

Introduction aux optimisations

Martin Odersky

6 f´evrier 2006

version 1.2

(2)

Plan du cours

1 Optimisations simples

Optimisations non-contextuelles Optimisations contextuelles

2 Optimisations avanc´ees

(3)

Optimisations simples

Ce cours pr´esente quelques exemples d’optimisations simples qui pourraient facilement ˆetre ajout´ees au compilateur Zwei.

Le point commun de toutes ces optimisations est qu’elles peuvent s’effectuer directement sur l’arbre de syntaxe abstraite.

Certaines optimisations plus avanc´ees requi`erent une autre repr´esentation du code interm´ediaire.

(4)

R´ eduction d’expressions constantes

Exemple

Pour l’expression 4 * 7, on attend d’un bon compilateur qu’il

´emette l’instructionORIU R1 R0 28.

Le calcul des expressions constantes (constant folding) se fait `a la compilation.

On peut facilement ajouter cela dans une phase pr´ealable de transformation de l’arbre, voir le faire directement `a la construction de l’arbre ou durant l’analyse de types.

(5)

R´ eduction de force des op´ erateurs

Certaines op´erateurs «coˆuteux» peuvent ˆetre remplac´es par d’autres op´erateurs plus simples si une des op´erandes est une constante particuli`ere :

l’expression x * 2^n devientx << n, l’expression x / 2^n devientx >> n, l’expression x % 2^n devientx & (2^n-1).

Les deux derni`eres sont seulement correctes pour des xpositifs.

Pour desxn´egatifs il faut que la division arrondisse vers le bas, et pas vers z´ero (−3/10 doit valoir−1).

C, Java et la plupart des processeurs font le contraire.

(6)

Elimination de sous-expressions communes ´

Exemple Soit :

Int x = (a + b) / c;

Int y = (a + b) / d;

Le compilateur pourrait ´evaluer (a + b)une seule fois : Int temp = (a + b);

Int x = temp / c;

Int y = temp / d;

On appelle cette optimisation ´elimination de sous-expressions communes (common sub-expressions elimination,CSE).

(7)

Pourquoi ne pas demander au programmeur d’´ecrire lui-mˆeme la version optimis´ee ?

le premier programme peut ˆetre jug´e plus clair,

parfois les sous-expressions communes apparaissent dans du code que le programmeur n’a pas ´ecrit (en Java,

a[i] = b[i] contient implicitement deux sous-expressions de la formeR = i * 4 pour le calcul de l’adresse des ´el´ements du tableau).

(8)

L’´elimination de sous-expressions communes ne constitue pas toujours une am´elioration :

Le stockage et le chargement des variables temporaires introduites ont un coˆut.

Ce coˆut est n´egligeable si les variables temporaires ne sont jamais stock´ees en m´emoire.

Si l’´elimination de sous-expressions communes introduit trop de variables temporaires stock´ees dans des registres, il est possible qu’il ne reste que peu de registres pour stocker d’autres donn´ees ; la pression sur les registres augmente.

On n’effectue l’´elimination de sous-expressions communes que si on a assez de registres `a disposition.

(9)

D´ etection de sous-expressions communes

Exemple

Int x = (a + b) / c;

a = a + 1;

Int y = (a + b) / d;

(a + b) n’est pas une sous-expression commune car la variablea est modifi´ee dans le second ´enonc´e.

Ce probl`eme se pose dans tous les langages qui admettent les modifications de variables.

(10)

Pour d´etecter les sous-expressions communes, on utilise la num´erotation des versions :

lors de la production de code, on donne `a chaque variable locale un num´ero de version (dans le symbole, par exemple), chaque affectation `a la variable incr´emente sa version, on recherche ensuite les sous-expressions communes dans lesquelles les num´eros de version des variables utilis´ees concordent.

(11)

Exemple

L’exemple pr´ec´edent devient, une fois versionn´e : x1 = (a1 + b1) / c1;

a2 = a1 + 1;

y1 = (a2 + b1) / d1;

La fausse sous-expression commune (a + b) a d´esormais disparu.

Pour trouver les expressions qui ont d´ej`a ´et´e ´evalu´ees, on a en g´en´eral recours `a une table de hachage associant des arbres `a des variables temporaires ;

en Scala, elle aurait le type HashMap[Tree, Symbol].

Question :Que doit-on ajouter `a la classeTreepour l’utiliser dans une table de hachage ?

(12)

Optimisations avanc´ ees

Les optimisations pr´ec´edentes ne sont que le d´ebut. Les

compilateurs r´eels en effectuent bien d’autres, et on en d´ecouvre constamment de nouvelles.

Les principales sources d’optimisations sont : Limiter la«stupidit´e» en :

supprimant le code mort (dead code elimination), supprimant les sauts vers d’autres sauts,

supprimant les chargements de variable suivis d’un stockage de la mˆeme variable.

Am´eliorer l’utilisation de la m´emoire en : stockant les variables dans les registres,

am´eliorant la«localit´e»des acc`es aux variables, pour qu’elles restent dans l’ant´em´emoire du processeur.

(13)

Augmenter le parall´elisme en :

ordonnant les instructions pour que plus d’instructions puissent ˆetre ex´ecut´ees en parall`ele et pour ´eviter les«bulles»dans le pipeline,

r´e´ecrivant les programmes pour diminuer le nombre de sauts (d´erouler les boucles,loop unroll),

r´e´ecrivant les programmes pour utiliser les fils d’ex´ecution multiples (threads).

Eviter les calculs r´ep´et´es en :´

d´epla¸cant les instructions d’un endroit o`u elles sont ex´ecut´ees souvent vers un endroit o`u elles sont ex´ecut´ees moins souvent (d´eplacer les instructions en dehors d’une boucle si leur valeur est invariante par rapport `a la boucle).

Références

Documents relatifs

Afin de pouvoir continuer ` a utiliser HC4 pour la propagation et donc ˆ etre compatible avec les r´ esol- veurs par intervalles existants, nous g´ en´ erons, r´ ecursi- vement,

En extraire une base et exprimer les ´ el´ ements de la famille comme combinaison lin´ eaire de cette base.. Donner une combinaison lin´ eaire F de ces formes modulaires qui

Mais surtout, ce sch´ema logique ´eclaire le v´eritable rˆ ole fonctionnel de l’impulsion quantique: c’est l’op´erateur qui engendre le comportement des vecteurs d’´etat

(c) Montrer en toute g´ en´ eralit´ e que les valeurs propres d’un op´ erateur hermitien sont r´ eelles.. Puis, montrer que les vecteurs propres (de cet op´ erateur) pour des

On suppose que les lapins se reproduisent suivant la r` egle suivante : chaque couple engendre tous les mois un nouveau couple ` a compter du troisi` eme mois de son existence.. On

Certains r´esultats retourn´es par Maple (e.g. ´el´ements propres d’une matrice) se trouvent dans une structure ordonn´ee (e.g. liste, ensemble, vecteur).. Il est parfois

2 Op´ erateurs non born´ es dans un espace de Hilbert.

Le th´eor`eme suivant donne une description compl`ete des op´erateurs auto-adjoints compacts.. Th´ eor`