Académique Documents
Professionnel Documents
Culture Documents
THSE
Informatique
par
David PARELLO
Sujet :
Mthodologie d'optimisation de programmes
pour architectures complexes de processeurs
M. Olivier TEMAM
Universit de Paris-Sud
Directeur
M. Franois BODIN
Universit de Rennes 1
Rapporteur
M. Pascal SAINRAT
Rapporteur
M. Albert COHEN
INRIA
Examinateur
M. Jean-Marie VERDUN
HP France
Examinateur
Remerciements
Je tiens adresser mes remerciements Franois Bodin et Pascal Sainrat pour avoir accept
d'tre rapporteurs. Je remercie galement les autres membres du jury : Albert Cohen, Jean-Marie
Verdun et Olivier Temam.
Je remercie nouveau Albert Cohen pour les prcieuses connaissances dans le domaine de
la compilation qu'il dissipe autour de lui. Je remercie nouveau Jean-Marie Verdun pour sa
disponibilit et les prcieuses informations et connaissances qu'il m'a apportes. Je remercie Olivier Temam pour m'avoir enseign non seulement la recherche mais galement l'art de partager,
diuser et prsenter son travail.
Je remercie les membres de l'quipe Avant-Vente de HP France pour m'avoir chaleureusement
accueilli. Je remercie galement tous les membres de l'quipe Alchemy pour leur convivialit.
Je remercie ma famille et mes amis pour m'avoir soutenu pendant la thse. Je remercie tout
particulirement mon amie Anne-Lise.
ii
Remerciements
iii
Rsum
L'augmentation de la complexit des processeurs rend de plus en plus dicile l'intgration
de modles prcis d'architectures dans les compilateurs. En consquence, l'ecacit des compilateurs statiques dcrot. Actuellement, les compilateurs statiques sont enrichis d'informations
dynamiques sur le comportement de l'architecture la manire des techniques d'optimisation
bases sur les prols d'excutions ou des techniques de re-compilation dynamique. Malheureusement, seules quelques informations lmentaires sur le comportement de l'architecture sont
utilises.
Dans cette thse, nous montrons de quelle manire les interactions entre les dirents composants d'une architecture rendent complexe le comportement des programmes et nous montrons
qu'il est possible de capturer cette complexit pour en dduire les transformations apporter aux
programmes. Nous avons tudi une mthode plus systmatique pour adresser le problme de la
complexit. Nous proposons un processus itratif d'optimisation manuelle bas sur une analyse
dynamique dtaille. Nous montrons exprimentalement l'ecacit de ce processus.
Cette approche prsente potentiellement une stratgie pour guider de futurs environnements
d'optimisation itratifs et propose, dans l'immdiat, un processus d'optimisation manuelle systmatique pouvant tre utilis par des ingnieurs ou des chercheurs.
iv
Rsum
1.2
. . . . . . . . . . . . . . . . . . . . .
i
iii
v
1
5
5
1.1.1
1.1.2
1.1.3
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
Optimisation de programmes
1.2.1
Transformations de programmes
. . . . . . . . . . . . . . . . . . . . . . .
10
1.2.2
Optimisation automatique . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
1.2.3
Optimisation manuelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
1.3
Synthse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
2.1
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2
Environnement de travail
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
2.3
24
2.4
Conclusions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
3.1
3.2
40
3.3
3.5
23
37
37
. . . . . . . . . . . . . . . . . . . . . . . . . .
42
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
Processus d'optimisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
43
3.4.1
Description du processus . . . . . . . . . . . . . . . . . . . . . . . . . . . .
43
3.4.2
49
3.4.3
. . . . . . . . . . . . . . . . . . . . . . . . . . .
51
3.4.4
3.3.1
3.4
23
Construction empirique
51
Rsultats exprimentaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
52
3.5.1
53
vi
3.6
3.5.2
57
3.5.3
Squences d'optimisations . . . . . . . . . . . . . . . . . . . . . . . . . . .
58
Conclusions
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Conclusions et perspectives
Table des gures
Liste des tableaux
A Journaux d'optimisations itratives
A.1
A.1.1
Itration 1 :
A.1.2
Itration 2 :
232
210
7! 210 (sec.)
7 80 (sec.) .
!
. . . . . . . . . . . . . . . . . . . . . . . . .
A.2
A.3
A.2.1
Itration 1 :
A.3.1
Itration 1 :
A.3.2
Itration 2 :
A.3.3
Itration 3 :
Bibliographie
290
312
294
211
7! 116 (sec.)
7! 294 (sec.)
7 211 (sec.)
!
7 143 (sec.)
!
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
58
60
62
65
71
71
71
72
81
81
. . . . . . . . . . . . . . . . . . . .
94
. . . . . . . . . . . . . . . . . . . . . . . . .
94
. . . . . . . . . . . . . . . . . . . . . . . . .
99
. . . . . . . . . . . . . . . . . . . . . . . . .
106
110
Introduction
L'augmentation de la performance des processeurs est due d'une part l'avance des techniques de gravure qui permettent d'accrotre la vitesse de fonctionnement des processeurs et d'autre
part l'volution de l'architecture qui intgre de nombreux mcanismes complexes. Ces mcanismes, comme par exemple la prdiction de branchement, l'excution dans le dsordre et la
hirarchie mmoire, ont pour objectif d'acclrer l'excution du programme en exploitant au
mieux le paralllisme des instructions et la localit des donnes. Les optimisations modient les
programmes an qu'ils protent pleinement de ces dirents mcanismes.
Quel que soit le domaine, les excutions des applications sont soumises des contraintes
donnant l'optimisation de programmes toute son importance. Dans le domaine du calcul scientique, les applications de modlisation et de simulation numriques ralisent de grands volumes
de calculs. Aussi bien le secteur de la recherche que le secteur industriel ont besoin de modles
de plus en plus prcis et de plus en plus grands, rclamant sans cesse d'importantes ressources
de calculs. L'optimisation de programmes est donc cruciale pour ces applications an de leur
permettre d'utiliser pleinement ces ressources. La principale contrainte est donc le temps d'excution. Les applications embarques ont la fois des contraintes de temps, des contraintes sur
l'espace mmoire et des contraintes sur la consommation d'nergie. Ce domaine a galement des
besoins croissants notamment avec le rle croissant des applications de traitement de l'image
et du son. La recherche d'une utilisation optimale des ressources est donc primordiale dans le
domaine de l'embarqu.
L'optimisation de programmes
Mme si les contraintes de chaque domaine d'application sont direntes, les techniques
d'optimisation sont trs similaires. L'optimisation de programmes peut se faire de manire automatique ou manuelle.
L'optimisation automatique
pr-processeur. Dans chacun des cas, elle consiste eectuer une longue squence de transformations parmi lesquelles certaines sont parfois rptes. A chaque tape de cette squence, la
phase d'optimisation utilise une analyse statique de la reprsentation intermdiaire dans le but
de dcider l'application ou non de la transformation et si oui avec quels paramtres. Les analyses statiques se basent sur des modles de l'architecture et du programme pour en deviner leur
comportement. Les optimisations diriges par l'analyse dynamique apportent des informations
supplmentaires que l'analyse statique ne peut pas obtenir pour apprhender plus prcisment
Introduction
L'optimisation manuelle
n'est pas satisfaisante. Un utilisateur peut transformer le programme source ou bien intervenir
sur les optimisations du compilateur au travers des options de compilations. Son champ d'actions
est trs vaste : il peut en eet modier l'algorithme, les boucles et galement apporter des modications qui peuvent changer le comportement des optimisations du compilateur (par exemple, il
peut agir sur la gnration de code). Le programmeur peut utiliser des informations sur le comportement du programme lors de son excution pour choisir les optimisations. Par l'exemple, il
peut utiliser des outils de prolage. Gnralement, l'optimisation manuelle est une tche dicile
qui est rserve un petit nombre d'experts ayant une bonne connaissance de l'architecture du
compilateur et des transformations de programmes.
Problmatique
Les mcanismes, comme la prdiction de branchement, l'excution dans le dsordre et la
hirarchie mmoire augmentent la performance crte des architectures. Le comportement de ces
mcanismes volue durant l'excution des programmes gnrant parfois des phnomnes complexes ayant des eets nfastes sur les performances. Par exemple, des conits de mmoire cache
peuvent fortement dgrader les performances. Il est dicile de modliser ces phnomnes et leurs
interactions et donc de comprendre prcisment le comportement des programmes sur les architectures. Par consquent, la comprhension du comportement devient de moins en moins prcise,
empchant ainsi l'optimisation automatique comme manuelle de maintenir des performances
Contribution et Organisation
Dans le premier chapitre, nous prsentons l'architecture du processeur Alpha-21264 que nous
avons utilis comme cible pour l'ensemble de nos tudes. Nous illustrons galement les mcanismes complexes des processeurs superscalaires et dtaillons des particularits d'excution qui
sont rarement prises en compte lors de l'optimisation de programmes. Ensuite, nous examinons
l'optimisation de programmes.
Le second chapitre prsente l'tude de l'optimisation d'un noyau de calcul sur le processeur
Alpha-21264. Cette tude montre la complexit des phnomnes se produisant au sein d'une
architecture superscalaire lors de l'excution d'un programme. Elle montre que certains problmes
de performance peuvent tre mis en vidence uniquement par une analyse dynamique dtaille
et suggre donc l'adoption d'une telle analyse pour guider un processus d'optimisation ecace.
Le troisime chapitre prsente un processus systmatique d'optimisation manuelle bas sur
l'analyse dynamique dtaille. L'identication des problmes de performances base sur une
analyse dynamique dtaille est systmatique et formalise par un arbre de dcision. Ce dernier
permet de formaliser l'exprience empirique de l'optimisation manuelle. La nature itrative du
processus permet de construire des squences d'optimisations et permet ainsi d'adresser plusieurs
Introduction
Introduction
Chapitre 1
Architecture et Optimisation
Nous avons brivement prsent l'optimisation manuelle et l'optimisation automatique. Dans
la section 1.1, nous dcrivons l'architecture d'un processeur superscalaire complexe. La section 1.2
prsente l'optimisation de programmes. Elle se concentre plus particulirement sur les mthodes
de slection des optimisations.
1.1.1
L'architecture gnrale du processeur Alpha-21264 est dcrite par la gure 1.1. Les composants Ebox et Fbox contiennent respectivement 4 units fonctionnelles entires et 2 units
fonctionnelles ottantes. Le composant Ibox contient les dirents mcanismes relatifs au pipe-
line, il est capable de charger 4 instructions depuis le cache d'instructions et de lancer jusqu'
6 instructions vers les units fonctionnelles chaque cycle. Il gre l'excution dans le dsordre
des instructions. Les caches d'instructions (Icache) et de donnes (Dcache) ont chacun une taille
de 64 Koctets, une associativit d'ordre 2 et des lignes de 64 octets. Le second niveau de cache
a galement des lignes de 64 octets mais il a une taille de 8 Moctets et il est correspondance
directe. Le composant Mbox contrle les accs au cache de donnes et assure une excution correcte de toutes les oprations mmoires. Il contient une queue des oprations de lecture et une
queue des oprations d'criture de 32 entres chacune (Load/Store queue), une table des adresses
1. Architecture et Optimisation
des oprations mmoires en chec (MAF Miss Address File) et un cache de translation d'adresses
(TLB) de 128 entres compltement associatif mmorisant les adresses des pages dont la taille
est de 8 Koctets ou des adresses de groupes de 8, de 64 ou de 512 pages de 8Koctets. Les registres
du processeur sont dupliqus : 2 x 80 registres entiers et 2 x 72 registres ottants.
Cbox
Probe
Queue
Ibox
20
IOWB
BCache
128
Cache
Index
Dup.
Tag
Ebox
Cache
Data
8MB direct
mapped
System
Bus
Fbox
Victim
Buffer
64
System
Adress
Arbiter
Memory
Chipset
15
Mbox
TLB
(128 entry)
Load
Queue
Store
Queue
MAF
(8 entry)
Data
Physical
Adress
Data
1.1.2
Le pipeline du processeur comporte 8 tages qui sont reprsents sur la gure 1.2 et dont le
fonctionnement est dcrit dans les paragraphes suivants.
1.1.
Fetch
0
Branch
Predictor
Rename
2
Issue
3
Integer
Register
Rename
Integer
Issue
Queue
(20
entries)
Memory
6
Integer
Execution
Integer
Execution
Integer
Reg.
File
(80)
Addr
Integer
Execution
Integer
Execution
Addr
Data
Cache
64 KB
2-way
LevelTwo
Cache
and
System
Interface
Line / Set
Prediction
Inst.
Cache
64 KB
2-way
FloatingPoint
Register
Rename
FloatingPoint
Issue
Queue
(15)
FP
Reg.
File
(72)
Floating-Point Multiply
Execution
Floating-Point Add
Execution
la ligne suivante, lorsqu'un branchement est pris, le champ est mis jour.
est eectu. Les instructions se voient attribuer un numro unique (inum ) d'identication pour
la dure pendant laquelle elles seront en vol dans le pipeline. Ces numros permettent d'identier
les instructions et l'ordre du programme. Les instructions sont considres comme tant en vol
(inight ) entre l'tage de renommage et l'tage de terminaison des instructions. Les instructions
sont places dans les queues d'instructions ottante et entire.
cer jusqu' 4 instructions par cycle et la queue de lancement ottante peut lancer jusqu' 2
instructions par cycle. Les instructions ne sont supprimes des queues que 2 cycles aprs leur
lancement.
leurs oprandes dans les bancs de registres et reoivent les renvois anticips (bypass ).
calculs, l'addition et la multiplication ottantes ont une latence de 4 cycles, la division ottante
a une latence entre 9 et 15 cycles et la racine carre a une latence entre 15 et 33 cycles. La
plupart des oprations arithmtiques entires ont une latence de 1 cycle sauf la multiplication
entire qui a une latence de 7 cycles.
1. Architecture et Optimisation
cache de donnes et au cache de traduction d'adresses (TLB ). Les oprations de lectures accdent
aux tables d'tiquettes et de donnes alors que les oprations d'criture n'accdent qu' la table
d'tiquettes, la donne est crite dans la queue des instructions d'criture et ne sera crite dans
le cache que lorsque l'instruction sera retire.
instructions sont retires dans l'ordre du programme. Le processeur peut retirer jusqu' 11 instructions par cycles.
1.1.3
i1
i2
dpen-
est donc lance dans l'tage de lecture des registres pendant le cycle
i1.
Lorsqu'une instruction
i2
truction de lecture mmoire i1, elle est lance spculativement : si i1 fait un succs dans le cache
alors l'instruction
i2
i2
i1
fait
i2
et i3 sont lances. Un
compteur, fonctionnant en mode satur, est incrment chaque fois qu'une opration de lecture
entire fait un succs dans le cache et est dcrment chaque dfaut. Lorsque le bit de poids
fort de ce compteur est zro, la latence des lectures entires passe de 3 5 cycles et la fentre de
spculation est ainsi supprime. Les oprations de prchargement dans le registre
R31
ne crent
Cycles
i1 (lecture entire)
i2
i3
1
Q
2
R
3
E
4
D
Q
5
B
R
Q
Symboles Descriptions
Q
R
E
D
B
Queue de lancement
Lecture des registres
Excution
Accs au cache
Accs au bus
La fentre de spculation des instructions ottantes n'est que d'un cycle. Si une instruction i1
se trouve dans la fentre de spculation d'une opration de lecture ottante faisant un dfaut de
cache alors cette instruction (i1) est annule uniquement si elle dpend de l'opration mmoire.
La table 1.2 montre la fentre de spculation ottante de 1 cycle dans laquelle l'instruction
est lance.
i2
1.1.
Cycles
i1 (lecture ottante)
i2
i3
1
Q
2
R
3
E
4
D
5
B
Q
Symboles Descriptions
Q
R
E
D
B
Queue de lancement
Lecture des registres
Excution
Accs au cache
Accs au bus
est calcule et compare avec les adresses des oprations se trouvant dans les queues des oprations de lecture et d'criture. Si une opration mmoire est en cours sur la mme adresse,
l'excution est annule partir de l'opration la plus jeune. Dans le cas o l'adresse d'une opration d'criture est identique l'adresse d'une opration de lecture plus jeune, se trouvant dans
la queue de lectures, l'opration de lecture est annule. Cet vnement est appel une purge
d'ordonnancement d'criture-lecture (store-load order trap ). Pour viter que cet vnement ne
se reproduise trop souvent, une table de 1024 entres indexe par le compteur de programme,
mmorise dans 1 bit si cet vnement s'est dj produit. Si une opration de lecture se trouve
dans la queue de lancement et que le bit correspondant est 1 alors le lancement de l'opration
est retard jusqu' ce que toutes les oprations mmoires d'criture plus anciennes soient lances.
La table des bits d'attente est remise zro tous les 16384 cycles.
correcte d'une opration de lecture et d'criture dans le mme ensemble. Toute nouvelle opration
mmoire qui entre en conit avec une opration dans les queues des oprations mmoires est
relance.
utilis pour relancer les oprations lorsque les queues des oprations mmoires sont pleines ou
10
1. Architecture et Optimisation
slectionner
vrier
transformer
Pour raliser une optimisation de programmes, il est ncessaire de raliser trois tapes :
du programme,
et enn
le programme.
La sous-section suivante prsente un aperu des transformations que l'on peut appliquer aux
programmes.
1.2.1
Transformations de programmes
procdurales.
Au niveau du programme complet : les transformations aectent plusieurs procdures ; elles
sont appeles transformations inter-procdurales.
Plus le niveau d'une transformation est lev, comme c'est le cas pour les transformations
inter-procdurales, plus les trois tapes ncessaires pour raliser la transformation (slection,
vrication et transformation) sont diciles mettre en uvre. En revanche, plus le niveau
d'une transformation est lev et plus ses gains de performance sont potentiellement importants.
Des ouvrages de rfrences prsentent les transformations de programmes de manire dtaille
et exhaustive [AhSeUl86, Mu97, AlKe01]. Bacon et al. [BaGrSh94] prsentent les bnces et
les dfauts de nombreuses transformations au niveau des nids de boucles. Les dirents niveaux
d'applications des transformations peuvent servir de classement. Cependant de plus en plus de
transformations sont ralises plusieurs niveaux, par exemple la propagation de constantes est
ralise au niveau des blocs de bases et au niveau inter-procdurale. Le classement n'a donc plus
un intrt majeur.
Les optimisations peuvent tre groupes en 3 grandes catgories :
autres optimisations et leur eet sur la performance est le plus souvent positif. Il est donc possible
de slectionner ces optimisations de manire systmatique pour l'ensemble du programme. Parmi
1.2.
11
Optimisation de programmes
L'allocation de registres et le
rordonnancement d'instructions sont deux optimisations qui ne doivent tre eectues qu'une
fois les simplications faites et la structure du programme xe.
L'allocation de registres dtermine les variables temporaires du programme qui vont tre
mmorises dans les registres logiques de la machine pour minimiser le nombre des instructions
de lecture et des instructions d'criture mmoire. Lorsqu'il n'y a plus susamment de registres
disponibles, les variables temporaires sont mmorises dans la pile par du code de dbordement
(Spill code ) [BrCoKe89].
Le rordonnancement d'instructions est une optimisation uniquement ddie au paralllisme
d'instructions. Elle rordonne les instructions pour maximiser l'utilisation des ressources du processeur. Les techniques bases sur le rordonnancement par liste (list scheduling ) [GiMu86] sont
trs ecaces pour optimiser l'ordre des instructions dans un bloc de base.
L'allocation de registres et le rordonnancement des instructions sont corrls. Le rordonnancement des instructions modie la dure de vie des registres et a un impact direct sur l'allocation
des registres [Pi93].
La promotion de scalaires n'est pas une transformation spcique la gnration de code,
cependant elle est fortement lie l'allocation de registres. Elle consiste identier les multiples
accs une mme rfrence mmoire pour placer la valeur de celle-ci dans un registre. La gure 1.3
montre la promotion des scalaires
do j = 1, n
do i = 1, m
a(i) = 2 * b(i)
c(j) = c(j) + b(i)
b(i)
et
c(j).
do j = 1, n
t = c(j)
do i = 1, m
u = b(i)
a(i) = 2 * u
t = t + u
c(j) = t
(a) avant
(b) aprs
Fig. 1.3 Promotion de scalaires
La promotion des scalaires augmente le nombre de registres utiliss, par consquent, promouvoir agressivement les scalaires peut gnrer du code de dbordement et peut ainsi dgrader les
performances. La promotion des scalaires [CaKe94] doit donc tenir compte de la pression qu'elle
exerce sur les registres.
tant sur les optimisations des deux groupes prcdents et plus particulirement sur l'allocation
de registres et le rordonnancement des instructions. Ce groupe est form des transformations
12
1. Architecture et Optimisation
relatives la structure de procdure, celles relatives aux nids de boucles et celles relatives aux
structures de donnes.
Expansion de code
par le code de celle-ci. Cette transformation est gnralement ralise lorsque le corps de la
procdure est de petite taille et si l'appel est souvent excut. La taille de la procdure peut tre
connue statiquement, en revanche, le nombre d'excutions de l'appel peut dpendre du jeu de
donnes.
Droulage de boucles
k.
excutes relatives au branchement et ventuellement le nombre d'instructions excutes relatives aux calculs d'adresse des rfrences mmoires. Cette instruction a un impact important sur
le rordonnancement des instructions et l'allocation de registres. Dans le cas idal, c'est--dire
lorsqu'il n'y a pas de dpendances entre les itrations, le droulage de boucle permet au rordonnancement d'instructions de trouver plus de paralllisme. Ce rordonnancement augmente
le nombre de variables temporaires en vie simultanment ce qui peut permettre de proter des
registres potentiellement disponibles mais cela peut galement obliger l'allocation de registres
gnrer du code de dbordement. Dans le mme temps, le droulage de boucles augmente la taille
du programme, cela peut avoir un impact sur le nombre de dfauts du cache d'instructions. Le
droulage de boucles peut aussi favoriser la promotion de scalaires, par exemple dans la boucle
droule de la gure 1.4, les rfrences
et
b(i+3)
peuvent proter de
la promotion de scalaires. Le nombre d'itrations droules doit donc tre judicieusement choisi
an d'obtenir le meilleur compromis entre paralllisme, utilisation des registres, rduction des
instructions excutes et dfauts du cache d'instructions.
do i = 2, n
a(i) = b(i+1) + b(i) + b(i-1)
do i = 2, n-3, 4
a(i) = b(i+1) +
a(i+1) = b(i+2)
a(i+2) = b(i+3)
a(i+3) = b(i+4)
do i = i, n
a(i) = b(i+1) +
(a) avant
b(i) + b(i-1)
+ b(i+1) + b(i)
+ b(i+2) + b(i+1)
+ b(i+3) + b(i+2)
b(i) + b(i-1)
(b) aprs
Fig. 1.4 Droulage de boucles
Permutation de boucles
appartenant un mme nid. Cette optimisation est gnralement utilise pour amliorer la
localit mais ses eets sont varis. Considrons l'exemple de la gure 1.5, supposons que le
tableau
est rang en mmoire par colonne. La localit spatiale des rfrences au tableau
est
mal exploite. La permutation de boucles permet de l'amliorer. Cet exemple, montre galement
que la permutation un impact sur la promotion des scalaires et sur le paralllisme d'instructions.
Supposons cette fois-ci que le code original est le code de droite (b) sur la gure, la permutation
de boucles favorise la promotion des scalaires du tableau
toutes les itrations de la boucle interne
a. En revanche,
1.2.
13
Optimisation de programmes
facile de slectionner une permutation d'autant plus que le comportement du programme dpend
des paramtres
m,n
do j = 1, n
do i = 1, m
a(j) = a(j) + b(j,i)
et
b.
do i = 1, m
do j = 1, n
a(j) = a(j) + b(j,i)
(a) avant
(b) aprs
Fig. 1.5 Permutation de boucles
amliorer la localit et le paralllisme d'instructions. Ces deux optimisations sont opposes mais
ont pourtant les mmes objectifs. La fusion consiste regrouper les oprations eectues dans
deux boucles spares dans une seule boucle. La ssion est l'inverse de la fusion, elle spare des
calculs eectus dans une boucle en deux boucles spares. La gure 1.6 montre un exemple
de fusion ou bien de ssion de boucles. Le premier bnce apport par la fusion est la rduction du nombre d'instructions excutes relatives aux instructions de branchement et de calcul
d'adresses. La fusion permet d'amliorer la rutilisation des donnes et peut favoriser l'application de la promotion des scalaires et d'optimisations de simplications comme la suppression
des tableaux temporaires. Elle permet aussi d'augmenter la diversit des oprations d'une mme
boucle et d'amliorer ainsi l'utilisation des ressources. Dans le cas o l'architecture cible du programme de la gure 1.6 possde une unit fonctionnelle d'addition et une unit fonctionnelle
de multiplication, la fusion amliore le paralllisme. Cependant, la fusion peut galement avoir
des eets opposes aux amliorations que nous venons de citer. Dans l'exemple, le bnce de
l'amlioration de la localit sur le tableau
tableaux
et
d.
elle peut augmenter les dpendances dans le corps de la boucle. La ssion de boucle est donc
utilise pour rduire les conits de cache et les dpendances.
do i =
a(i)
do i =
d(i)
1, n
= b(i) + c(i)
1, n
= a(i) * d(i)
do i = 1, n
a(i) = b(i) + c(i)
d(i) = a(i) * d(i)
Dcalage d'itrations
nom de pipeline logiciel en permettant de dcaler des groupes complets d'oprations dans l'espace d'itration. La gure 1.7 montre un exemple de dcalage d'itrations o des calculs intermdiaires sont anticips en tant dcals sur les deux itrations prcdentes. Le dcalage d'itrations
augmente le paralllisme d'instructions en augmentant la dure de vie des variables temporaires
et donc la pression sur les registres.
Blocage de boucles
nid de boucles pour le parcourir diremment. Cette transformation est habituellement utilise
14
1. Architecture et Optimisation
do i = 1, n
a(i) = a(i)-k*(b(i)+c(i))*(d(i)+e(i))
t3
t1
t2
do
(a) avant
(b) aprs
Fig. 1.7 Dcalage d'itrations
pour amliorer la localit. La gure 1.8 montre un exemple de blocage de boucles sur un produit
de matrices et la gure 1.9 reprsente les accs aux matrices correspondantes. Cette optimisation
peut tre ralise pour des niveaux dirents de la hirarchie mmoire et de manire hirarchique [NaJuLa94, CaFeHu95]. Dans l'exemple du produit de matrices, les paramtres
doivent tre choisis de manire ce que le bloc
matrice
Tj*Tk
de la matrice
et la colonne
do kk=1,Nk,Tk
do jj=1,Nj,Tj
do i=1,Ni
do k=kk, MIN(kk+Tk-1,Nk)
R=b(k,i)
do j=jj, MIN(jj+Tj-1,Nj)
c(j,i)=c(j,i)+R*a(j,k)
do i=1,Ni
do k=1,Nk
R=b(k,i)
do j=1,Nj
c(j,i)=c(j,i)+R*a(j,k)
boucle j (interne)
boucle j (interne)
boucle k
boucle k
boucle i
B
k
boucle i
j
j
j
A
Tj
Tk
et
Tk
de la
1.2.
15
Optimisation de programmes
Rarrangement de donnes
rations de donnes et ventuellement les accs aux donnes an que le placement des donnes en
mmoire permette au programme d'exploiter une meilleure localit. La gure 1.10 montre deux
types de rarrangement de donnes. Le premier modie la structure du tableau
en inversant
ses dimensions et modie les rfrences correspondantes. Ce genre de rarrangement peut tre
plus complexe lorsque, par exemple, les accs une matrice se font en diagonale. Le second est
l'insertion d'une variable fantme
de matrices sont des multiples d'une puissance de 2 ; cette transformation est appele padding.
(a) avant
(b) aprs
Fig. 1.10 Rarrangement des donnes
1.2.2
Optimisation automatique
Les optimisations automatiques sont ralises par les compilateurs et les prprocesseurs qui
doivent suivre l'volution des architectures et s'adapter leur complexit croissante.
Pour raliser une optimisation automatiquement, un compilateur doit raliser les trois tapes
ncessaires : la slection, la validation et la transformation. Nous nous intressons plus particulirement l'tape de slection. Elle ncessite une analyse du programme et une modlisation
de l'architecture pour valuer le comportement du programme sur celle-ci. Cette valuation doit
permettre de dterminer si une transformation doit tre applique, c'est--dire si elle amliore la
performance.
16
1. Architecture et Optimisation
consquents en analyse ddie la slection sont ceux de Wolf et Lam [WoLa91] qui ont formalis deux concepts : la rutilisation et la localit. Cette formalisation leur a permis d'automatiser
des transformations uni-modulaires avec un algorithme favorisant la rutilisation. Le modle de
hirarchie mmoire implicitement utilis est trs abstrait car il s'agit d'un espace mmoire sans
fonction de placement.
Nous allons illustrer ci-dessous, l'aide des optimisations pour la mmoire, comment des
modles de plus en plus prcis de l'architecture ont t utiliss.
ont mis en vidence les problmes lis au comportement du cache sur les programmes utilisant
le blocage de boucles. Les dfauts de caches sont de trois types : les dfauts de dmarrage (com-
pulsory misses ), les dfauts de conits (conict misses ), et les dfauts de capacit (capacity
misses ). Ils ont montr la dicult du choix des paramtres (T j et
T k)
dans le cache et ont tudi le comportement du cache en faisant varier la taille des blocs et la
taille des matrices. Ils prsentent un algorithme permettant de calculer la taille de bloc rectangulaire maximale n'engendrant pas de conit de cache sur lui-mme (self interference ). Le cache
considr pour l'algorithme est un cache correspondance directe. Le modle utilis pour guider
l'algorithme est trs simple puisqu'il utilise uniquement la taille du cache.
Coleman et McKinley [CoKi95] prsentent un algorithme bas sur la division euclidienne pour
calculer plusieurs tailles de blocs rectangulaires sans conit de cache entre eux. Ils enrichissent
leur algorithme d'une fonction de cot qui propose de slectionner les tailles de blocs minimisant
les interfrences entre les dirents blocs et entre les direntes variables. Le cache considr
pour l'algorithme est toujours un cache correspondance directe mais le modle utilis pour
guider l'algorithme prend en considration la taille du cache et la taille d'une ligne du cache.
Rivera et Tseng [RiTs99] comparent dirents algorithmes de blocage de boucles. Ils simplient l'algorithme de Coleman et McKinley par un algorithme rcursif. Ils proposent de combiner
le rarrangement des donnes (padding ) avec les algorithmes de blocage pour rsoudre les problmes de conits de cache rencontrs pour certaines tailles de matrices. Le cache considr pour
tous les algorithmes reste un cache correspondance directe et les modles utilisent la taille du
cache et de la ligne.
Navarro, Juan et Lang [NaJuLa94] gnralisent un algorithme de blocage pour une hirarchie
mmoire
niveaux prenant ainsi en compte les eets du blocage sur le cache de traductions
d'adresses (TLB ). L'algorithme ralise le blocage successivement sur les dirents niveaux de la
hirarchie mmoire. La hirarchie mmoire considre est un ensemble de caches correspondance
directe modliss par leurs tailles et celles de leur ligne.
Mitchell et al. [MiCaFe97] revisitent cet algorithme de blocage pour une hirarchie mmoire
en utilisant une fonction de cot global pour l'ensemble de la hirarchie.
Ghosh, Martonosi et Malik [GhMaMa99] dcrivent une mthode gnrale pour mettre en
quations les relations prcises entre les indices des nids de boucles, les tailles de tableaux,
leurs adresses de bases, et les paramtres du cache. Ces quations appeles CME pour Cache
1.2.
Optimisation de programmes
17
prohibitif.
Chatterjee et al. [ChPaHaLe01] ont dvelopp un modle pour caractriser le comportement
exact des nids de boucles sur une hirarchie mmoire. Ils utilisent l'arithmtique de Presburger [We97] pour identier dirents types de dfauts de caches et pour dterminer l'tat du
cache la n des boucles. La hirarchie mmoire considre possde deux niveaux de cache
allou en criture avec une associativit quelconque.
Les architectures deviennent de plus en plus complexes, par consquent, les modles d'architectures utiliss par les heuristiques des compilateurs sont de moins en moins prcis et de plus
en plus diciles construire et intgrer dans les compilateurs.
Monsifrot, Bodin et Quiniou [MoBoQu02] ont montr qu'il tait possible de gnrer une heuristique l'aide d'une mthode d'apprentissage pour le droulage de boucle. Ils utilisent une
mthode d'apprentissage base sur les arbres de dcision. Les paramtres d'apprentissage qui
caractrisent les boucles sont extraits statiquement du programme. Pour le droulage de boucles,
la mthode utilise 6 paramtres : le nombre d'instructions, le nombre des oprations arithmtiques, le nombre minimum d'itrations, le nombre d'accs aux tableaux, le nombre d'lments de
tableau rutiliss et le nombre d'instructions conditionnelles. Les boucles ayant des paramtres
identiques appartiennent la mme classe. Le processus d'apprentissage applique le droulage
un ensemble de boucles et identie les classes bnciant de cette optimisation. Ils utilisent
un outil de classication gnrant des arbres de dcision obliques. L'intgration des heuristiques
dans le compilateur se fait par une implmentation des arbres de dcision gnrs. Le temps
moyen des excutions des programmes dont le droulage est guid par l'heuristique d'apprentissage est infrieur de 4% au temps moyen des excutions des programmes dont le droulage est
guid par l'heuristique du compilateur g77. En appliquant la mthode d'apprentissage avec les
mmes paramtres sur deux architectures direntes, ils dmontrent que la mthode s'adapte
l'architecture cible.
Stephenson et al. [StAmMaOR03] proposent un algorithme gntique permettant de construire des fonctions de priorits utilises par les heuristiques. L'algorithme gntique gnre
directement la fonction de priorit. Ils montrent le fonctionnement de l'algorithme pour construire
les fonctions de priorits des heuristiques pour trois optimisations : la construction d'hyper-blocs,
l'allocation des registres et le prchargement des donnes. Contrairement aux travaux prcdents,
les paramtres d'apprentissage ne sont pas uniquement statiques, ils utilisent galement des
informations dynamiques obtenues par prolage. Par exemple, pour la construction d'hyperblocs, ils utilisent comme paramtre la frquence d'excutions des chemins.
Le compromis des mthodes d'apprentissage est le choix des paramtres. En eet, la taille
de l'ensemble des programmes d'apprentissage ou de la population (et par voie de consquence
le temps d'apprentissage) crot de manire exponentielle avec le nombre de paramtres. Les
mthodes d'apprentissage simplient la construction des compilateurs, il reste cependant des
eorts fournir pour identier les paramtres d'apprentissage pertinents et pour congurer le
processus d'apprentissage.
18
1. Architecture et Optimisation
phases dans lesquelles sont eectues plusieurs optimisations. La plupart du temps l'ordre suivant
lequel sont appliques les transformations est g. Allen et Kennedy ainsi que Muchnick[AlKe01,
Mu97] dcrivent les structures gnrales des compilateurs et les optimisations de chaque phase
de manire dtaille. Par exemple, la structure du compilateur Open Research Compiler [ORC]
est dcoupe en 5 phases ralisant toutes les optimisations :
PreOPT
mination de code mort et ralise aussi les analyses statiques qui vont tre utilises par les
phases suivantes.
LNO
(Loop Nest Optimizations ) : cette phase contient toutes les transformations sur les
WOPT
comme l'limination d'expressions redondantes, des optimisations sur les pointeurs et sur
le graphe de contrle ainsi que des optimisations de simplications arithmtiques.
CG (Code
de code.
Gnralement, les squences d'optimisations ralises dans chaque phase sont ges. Seules
quelques transformations peuvent tre rptes et permutes, par exemple dans le compilateur
ORC, seules la fusion et la ssion de boucles peuvent tre permutes et appeles plusieurs fois.
L'importance des compositions de transformations a t montre par de nombreux travaux.
Rivera et Tseng [RiTs98, RiTs98+] ont propos des algorithmes de rarrangement des donnes
(Padding ) pour minimiser les interfrences dans le cache. Ils ont ensuite tudi le comportement
du cache vis--vis de direntes transformations de programmes et ils ont commenc tudier les
combinaisons d'optimisations comme la fusion de boucles et le rarrangement des donnes pour
augmenter la rutilisation tout en limitant les conits de cache. Ils ont tendu ces combinaisons
d'optimisations pour des hirarchies mmoires plusieurs niveaux de caches [RiTs99].
Whiteld et Soa [WhSo90] proposent un environnement pour tudier les interactions entre
les optimisations. L'environnement permet d'exprimer les pr-conditions et post-conditions des
transformations. Si la pr-condition d'une transformation
d'une transformation
t1
alors
t1
autorise
t2 .
t2
1.2.
Optimisation de programmes
19
Almagor et al. [AlCoGr04] ont tudi l'espace des squences d'optimisations an de caractriser celui-ci et de dterminer le cot de construction de squences d'optimisations adaptes. Ils
proposent trois algorithmes de recherche dans l'espace des squences d'optimisations.
20
1. Architecture et Optimisation
1.2.3
Optimisation manuelle
tium ont parfois des dicults identier l'instruction provoquant un vnement. En revanche,
les processeurs excution dans l'ordre comme les processeurs EV5 ou Itanium attribuent les
vnements prcisment aux instructions qui les provoquent. Les processeurs les plus rcents,
comme l'Itanium2 [IPF2], permettent de mesurer jusqu' 4 compteurs simultanment et plus de
300 vnements dirents.
L'optimisation manuelle de programmes est une tche dicile car elle ncessite une connaissance prcise de l'architecture des machines et des transformations de programmes. Cette double
connaissance doit permettre de trouver les opportunits de transformations et de construire
des squences de transformations. L'objectif des travaux prsents ci-dessous est de faciliter et
d'acclrer le processus manuel d'optimisation.
Le projet MHAOTEU [AbToAn00] propose un ensemble organis d'outils d'analyse (statiques
et dynamiques) et d'optimisation pour les hirarchies mmoires. Les outils sont accessibles par
l'utilisateur travers une interface unique. Elle est connecte un serveur qui communiquent avec
les outils d'analyses et de transformations. Le serveur enregistre toutes les informations relatives
aux analyses dans une base de donnes. Parmi les outils d'analyses dynamiques proposs pour
la hirarchie mmoire, les outils de visualisation de mmoire cache (CVT ) [Wa02] permettent
l'utilisateur de visualiser les phnomnes de conits. Cet outil instrumente le programme de
l'utilisateur pour que l'excution de celui-ci transmette les oprations mmoires un simulateur
de cache pas pas. Une interface graphique montre le placement des donnes dans le cache.
Monsifrot et Bodin [MoBo01] proposent un environnement interactif d'optimisation. L'environnement CAHT est bas sur le raisonnement partir de cas. Il permet de rechercher, dans
les parties critiques d'un programme, les opportunits d'optimisation (dont la lgalit n'est pas
garantie) et de les proposer l'utilisateur. Ce dernier a la responsabilit de vrier et de valider le
programme optimis. Une base de connaissances mmorise les couples (cas,transformation). Les
cas sont des conjonctions de proprits de boucles ou des reconnaissances de structures de calculs.
Les proprits, au nombre de 31, sont extraites par une analyse statique des nids de boucles.
Les cas ont t construits partir des guides d'optimisation. L'environnement est volutif car
l'utilisateur peut dnir de nouveaux cas et ajouter des transformations de programmes.
1.3.
Synthse
21
La construction des cas est un travail d'expert qui ncessite une bonne pratique de l'optimisation de programmes. Cette automatisation de la recherche des cas est complmentaire de nos
travaux, qui sont focaliss sur la slection rapide des transformations et l'ordre de composition
des transformations.
L'environnement CAHT prsente un point commun majeur avec le processus d'optimisation
que nous proposons dans le chapitre 3 : ils mettent prot l'expertise empirique de l'optimisation
manuelle en la formalisant et permettent son volution, En revanche, les principales dirences
apparaissent dans l'identication des cas. Eectivement, l'identication est base sur une analyse
statique des programmes pour CAHT alors qu'elle est base sur une analyse dynamique pour le
processus prsent. Enn contrairement CAHT, le processus que nous proposons est itratif.
1.3 Synthse
Les architectures ont volu de manire incrmentale en intgrant des mcanismes de plus
en plus complexes. L'association de ces mcanismes et l'volution de la technologie ont considrablement augment la performance crte des processeurs. Les optimisations des compilateurs
sont cruciales pour permettre aux programmes d'exploiter une partie de cette performance (la
performance soutenue ). L'augmentation de la complexit des architectures rend trs dicile le
maintien d'une performance soutenue peu loigne de la performance crte des processeurs.
Les techniques classiques d'optimisation automatique utilisent des analyses statiques et des
modles simplis des architectures pour prdire le comportement des programmes.
Ces techniques rencontrent deux problmes majeurs :
d'une part certains paramtres des programmes ne sont connus qu'au moment de l'excution ce qui restreint le pouvoir de l'analyse statique,
d'autre part, les architectures devenant de plus en plus complexes, les modles d'architectures ont de plus en plus de dicults reprsenter dlement le comportement des
composants.
Les optimisations guides par l'analyse dynamique pallient le manque d'information des analyses statiques. Les informations extraites de l'analyse dynamique prcisent gnralement le comportement du programme vis--vis d'un seul composant de l'architecture, par exemple le cache
d'instructions. Malheureusement, la majeure partie de la prdiction du comportement des programmes reste la charge des modles d'architectures.
Les mthodes d'apprentissage et les algorithmes gntiques ont montr des rsultats intressants pour automatiser la cration des heuristiques. Malheureusement, ces mthodes sont coteuses en temps d'apprentissage et ne sont envisageables qu'individuellement pour chaque optimisation. La complexit de ces mthodes ne permet pas de les utiliser pour crer des heuristiques
prenant en compte des ensembles d'optimisations.
Les techniques d'optimisation automatiques doivent aronter une dicult supplmentaire
qu'elles utilisent ou non des analyses dynamiques. Cette dicult est le choix de l'ordre d'application des transformations. En eet, le plus souvent cet ordre est g. Peu de travaux ont tudi les
interactions entre les optimisations, notamment l'impact des compositions des transformations
sur la performance. Comme pour les heuristiques, les mthodes d'apprentissage sont des moyens
22
1. Architecture et Optimisation
23
Chapitre 2
24
Pour chaque exprience ralise sur le produit de matrices, nous avons mesur les temps
d'excutions pour un intervalle de tailles de matrices centr autour de 1060 lments. Tous
les gains en temps d'excution indiqus dans cette section sont donc calculs l'aide de cette
moyenne.
+ KAP).
Etape
Transformation
gain
Etape 0
Programme initial
1.00
Etape 1
2.48
Etape 2
2.62
Etape 3
3.11
3.71
9.90
8.43
copie pour TLB + permutation de boucle + droulage de boucle + blocage pour les registres
Etape 7
12.25
12.75
boucle + droulage de boucle + blocage pour registres + prchargement pour latence + Blocage sur
3 dimensions pour cache de niveau 2
Etape 9
13.56
boucle + droulage de boucle + blocage pour registres + prchargements pour latence + Blocage sur
3 dimensions pour cache de niveau 2 + optimisation
spcique pour l'architecture
-O5
3.26
-O5 + KAP
3.37
106 lments
Le programme initial (Etape 0) est prsent dans la gure 2.1. Chaque version a t compile
2.3.
25
dtaille
la gnration de code et d'inhiber les optimisations spciques l'architecture et les transformations sur les boucles. Ces options de compilation vitent galement que les optimisations
manuelles ne soient dtruites par les optimisations du compilateur.
do i=1,Ni
do k=1,Nk
R=b(k,i)
do j=1,Nj
c(j,i)=c(j,i)+R*a(j,k)
Dans les paragraphes suivants, nous tudions chaque composant de l'architecture. Au dbut
de chaque paragraphe, nous nommons le composant cible et nous donnons le gain obtenu par
l'optimisation ainsi que sa contribution au gain nal en pourcentage.
Cache de niveau 1
A. Nous avons
trouver une taille de bloc qui minimise le temps d'excution et nous avons trouv
Tk
Tj
= 33.
do kk=1,Nk,Tk
do jj=1,Nj,Tj
do i=1,Ni
do k=kk, MIN(kk+Tk-1,Nk)
R=b(k,i)
do j=jj, MIN(jj+Tj-1,Nj)
c(j,i)=c(j,i)+R*a(j,k)
[MiCaFe97] ont montr que le blocage de boucle pour le cache peut avoir un eet nfaste sur le
26
cache de traduction d'adresse (TLB). La gure 2.3a reprsente l'ordre d'accs aux matrices pour
le produit de matrices de l'tape 0 avant le blocage et la gure 2.3b reprsente l'ordre d'accs
aprs le blocage. Rappelons-nous qu'en fortran les lments des tableaux sont rangs en mmoire
suivant la premire dimension (la plus gauche), ici les lments des matrices sont rangs suivant
les colonnes. Supposons que la taille d'une colonne des matrices soit gale la taille d'une page
mmoire (8Koctets sur le processeur Alpha). Dans la version non-bloque, pour chaque itration
de
i,
une entre du cache de translation d'adresse est utilise pour chacune des colonnes des
matrices
C.
et
l'entre de la colonne de
itrations
et
jj
j.
et
sont beaucoup plus courtes, les entres de TLB ne sont donc que partiellement
et
et
i tant
kk
est importante. Nous avons observ une augmentation du taux d'checs de TLB de 4,98e-4
5,08e-4. Ce taux est relativement faible mais l'impact des dfauts de TLB sur la performance
est important.
boucle j (interne)
boucle j (interne)
boucle k
boucle k
boucle i
B
k
boucle i
j
j
j
A
An de ne pas perdre le bnce du blocage pour le cache, nous avons bloqu la troisime
dimension
de
en faisant en sorte que le nombre d'entres de TLB utilises par les blocs de
et
soit infrieur au nombre total d'entres de TLB. Le programme correspondant est prsent
dans la gure 2.4. Le blocage sur les trois dimensions a rduit le taux d'chec de TLB de 5,08e-4
2,08e-5. Cette optimisation a augment le nombre de dfauts de cache de premier niveau mais
cela n'est pas susant pour compenser le bnce obtenu par la rduction des dfauts de TLB.
Le gain a donc augment, il est de : 2,62.
Gnralement, les oprations mmoires d'criture (de rangement) ne sont pas considres comme
tant prioritaires pour les optimisations. En eet les oprations d'criture sont envoyes la mmoire et aucun calcul ne dpend de leurs excutions (contrairement aux oprations de lecture ou
de chargement). Cependant, plusieurs composants de l'architecture peuvent dgrader les performances du processeur cause des oprations d'criture, en particulier la queue des oprations
d'criture. Nous avons observ ici un phnomne dirent. Dans les processeurs superscalaires,
on rencontre des cas o des oprations mmoires doivent tre annules et leurs excutions doivent
2.3.
27
dtaille
do ii=1,Ni,Ti
do kk=1,Nk,Tk
do jj=1,Nj,Tj
do i=ii, MIN(ii+Ti-1,Ni)
do k=kk, MIN(kk+Tk-1,Nk)
R=b(k,i)
do j=jj, MIN(jj+Tj-1,Nj)
c(j,i)=c(j,i)+R*a(j,k)
tre retardes. Dans le processeur Alpha, il y a plusieurs cas o deux oprations mmoires ne
peuvent pas tre excutes simultanment. Un exemple serait lorsqu'une opration d'criture et
une opration de lecture doivent accder au mme ensemble dans le cache. Comme le montre
l'exemple de la gure 2.5, si l'opration de lecture
celui de l'opration d'criture
plus jeunes que
Sj (k > j ).
Si
Sj
Sk
Etage memoire
programme :
Queue de lectures
...
Si: stt $F1, @A
...
comparaison
...
dadresses
Sj: ldt @A, $F3
...
Queue decritures
...
Conflit memoire : Purge de Sk pour k>=j,
Rechargement de toutes les instructions depuis Sj
Execution dans le desordre
Fig. 2.5 Conit mmoire
Pour le programme optimis de l'tape 2, nous avons observ un nombre important de purges
dues des conits mmoires qui taient souvent produits par l'opration d'criture et les deux
oprations de lecture de la boucle interne (j ). An de rduire la probabilit d'avoir des conits
et donc des purges du pipeline, nous avons rduit le nombre d'oprations d'criture. Nous avons,
pour cela, permut les boucles
et
conits mmoires a ainsi t divis par 24 et le gain est pass de 2,62 3,11.
tion=5%). Les registres sont souvent une ressource critique et les corps de boucles importants
produisent gnralement des instructions de dbordements (lectures/critures), appeles aussi
28
do ii=1,Ni,Ti
do kk=1,Nk,Tk
do jj=1,Nj,Tj
do i=ii, MIN(ii+Ti-1,Ni)
do j=jj, MIN(jj+Tj-1,Nj)
R=c(j,i)
do k=kk, MIN(kk+Tk-1,Nk)
R=R+b(k,i)*a(j,k)
c(j,i)=R
i
boucle k (interne)
boucle j
boucle i
Fig. 2.7 Ordre d'accs aux matrices aprs blocage sur 3 dimensions
spill code. Dans le cas du produit de matrices, le corps de la boucle est relativement petit
et plusieurs registres restent donc disponibles. Les compilateurs utilisent gnralement ces registres disponibles pour augmenter le paralllisme d'instructions (ILP) en utilisant le droulage
de boucles ou bien le pipeline logiciel. An d'augmenter le paralllisme d'instructions, nous avons
droul 8 fois la boucle interne et obtenu un gain de 3,71.
(Etape 5, gain=9,90,
contribution=49%). Durant les tapes prcdentes, nous avons rduit les nombres de dfauts du
cache de donnes et du cache de traduction d'adresses (TLB). Nous avons ainsi rduit la latence
mmoire moyenne. Cependant, les performances du programme optimis sont toujours limites
par la mmoire. Eectivement, le rapport du nombre de calculs sur le nombre d'oprations
mmoires est faible, il est approximativement gal 1. Or, les registres (premier niveau de
la hirarchie mmoire) peuvent tre utiliss pour rduire le nombre d'accs mmoires. Aprs
l'optimisation prcdente (le droulage de boucle pour augmenter le paralllisme d'instructions),
nous avons observ qu'il restait des registres disponibles que nous pouvons utiliser pour rduire
le nombre d'accs mmoires. Le blocage pour les registres peut se faire par un simple droulage
de boucle externe [CaGu97]. La gure 2.8 montre le mme programme que celui de la gure 2.6
pour lequel la boucle externe
La rfrence
b(k; i) peut tre place dans un registre, supprimant ainsi un accs mmoire. De
2.3.
29
dtaille
do ii=1,Ni,Ti
do kk=1,Nk,Tk
do jj=1,Nj,Tj
do i=ii, MIN(ii+Ti-1,Ni)
do j=jj, MIN(jj+Tj-1,Nj), 2
Rc0=c(j,i)
Rc1=c(j+1,i)
do k=kk, MIN(kk+Tk-1,Nk)
Rb0=b(k,i)
Rc0=Rc0+Rb0*a(j,k)
Rc1=Rc1+Rb0*a(j+1,k)
c(j,i)=R
la mme manire, nous pouvons drouler la boucle i. Nous avons recherch, de manire exhaustive,
la meilleure faon de drouler les boucles et nous avons trouv un droulage de 3-4-8, c'est--dire
3 fois pour la boucle
i,
k.
Rappelons que
le droulage de la boucle interne ne favorise pas la rutilisation des registres mais qu'il favorise
plutt le paralllisme d'instructions. Nous avons observ une diminution du nombre des lectures
mmoires de 69% et le rapport du nombre de calculs sur le nombre d'oprations mmoires a
augment de 300%. Par consquent, l'utilisation des units fonctionnelles est beaucoup plus
importante. Le gain passe de 3,71 9,90 soit une contribution au gain nal de 49%.
En considrant les registres comme un niveau de la hirarchie mmoire supplmentaire, il
est possible d'amliorer la bande-passante mmoire du programme. Il n'est pas facile de bien
exploiter les registres physiques d'un processeur superscalaire excution dans le dsordre car
ses registres sont cachs par le mcanisme de renommage dynamique [SmSo95]. En revanche,
certaines architectures comme l'architecture EPIC de l'itanium [Epic] exposent de nombreux
registres logiques au programmeur et au compilateur.
(Etape 6).
L'importance du gain obtenu lors de la prcdente tape suggre de prter plus d'attention et de
privilgier le blocage de registres. Dans ce paragraphe, nous rvisons les optimisations jusqu'ici
appliques an de favoriser le blocage de registres. Nous allons voir comment l'interaction entre
plusieurs composants de l'architecture peut inuencer les optimisations individuellement et la
squence des optimisations.
Dans le paragraphe prcdent, nous avions amlior la rutilisation des registres pour les
rfrences
a(j; k )
et
b(k; i)
c(j; i).
Le droulage de
c(j; i).
c(j; i)
k (T k )
qui
relativement petite (T k = 33), nous pouvons donc augmenter la rutilisation de registre sur la
rfrence
c(j; i)
en augmentant
et
B.
T k.
T k,
Nous avons fait plusieurs tests qui nous ont montr qu'il n'tait pas
T i) de la matrice B et (T j T k) de la
A tiennent dans le cache. D'autre part, nous devons conserver la rutilisation de registres
30
A et B obtenu par
T i 3 et T j 4.
B (T k 3)
et de la matrice
(4
Tk
en utilisant des
le cache de premier niveau. Ces blocs tant trs troits, nous avons obtenu une valeur pour
Tk
suprieure
de la boucle
puisqu'il a
et
j.
do kk=1,Nk,Tk
do i=1,Ni,3
do j=1,Nj,4
Rc0=c(j,i)
Rc1=c(j+1,i)
...
do k=kk, MIN(kk+Tk-1,Nk)
Rb0=b(k,i)
Rb1=b(k,i+1)
Rb2=b(k,i+2)
Ra0=a(j,k)
Ra1=a(j+1,k)
Ra2=a(j+2,k)
Ra3=a(j+3,k)
Rc0=Rc0+Rb0*Ra0
Rc1=Rc1+Rb0*Ra1
Rc2=Rc2+Rb0*Ra2
...
c(j,i)=Rc0
c(j+1,i)=Rc1
...
En observant la performance de ce programme, nous pouvons constater une chute de performance de 48% due une augmentation du nombre de dfauts du cache de traduction d'adresses
(TLB) qui ont t multiplis par 780. La valeur de
le TLB lors des itrations de la boucle interne
k.
Tk
a(j; k )
purgent
et
T k,
A se fait en
parcourant
A suivant
B,
A est
copies dans la premire colonne du tableau de copie. Le schma de la copie est reprsent avec
le schma d'accs aux matrices dans la gure 2.10, le programme correspondant est reprsent
dans la gure 2.11.
La copie nous a permis de rduire le nombre de dfauts du cache de traduction d'adresses de
98%. La copie permet galement de rduire les dfauts de cache dus des conits [TeGrJa93].
Enn, nous avons eectu plusieurs tests de droulage (nous avons simultanment fait varier
le droulage externe sur les boucles
i, j
k ).
Dans la section
prcdente, le meilleur facteur de droulage tait de 3-4-8. Suite une nouvelle recherche ex-
2.3.
31
dtaille
boucle k (interne)
boucle j
boucle i
B
Copie de B
j
A
Copy de A
k
Fig. 2.10 Schma d'accs aux matrices avec copies
do kk=1,Nk,Tk
do i=1,Ni,4
Copie du bloc de la matrice B
C
...
do j=1,Nj,4
C
Copie du bloc de la matrice A
...
Rc0=c(j,i)
Rc1=c(j+1,i)
...
do k=kk, MIN(kk+Tk-1,Nk)
C
Code de la boucle interne travaillant sur les copies
...
c(j,i)=Rc0
c(j+1,i)=Rc1
...
et
haustive, nous avons observ que le meilleur facteur de droulage n'tait plus 3-4-8 mais 4-4-2
car la valeur de
Tk
Finalement, le gain obtenu par cette suite d'optimisations est seulement de 8,43 (tape 6)
contre 9,90 pour l'tape 5. Cette perte est due essentiellement une dgradation de l'utilisation
du cache pour les matrices
A et C
montrer une optimisation pour laquelle le programme de l'tape 6 est plus adapt que le programme de l'tape 5. D'autre part, cette mme optimisation permet galement de rduire le cot
de la copie (au nal, nous obtiendrons un meilleur gain avec l'tape 6). Une approche similaire
est utilise pour le produit de matrices dans la librairie mathmatiques optimise manuellement
pour le processeur Alpha [Cxml].
32
T k.
lignes de cache (chaque ligne contient 8 lments de 8 octets) ce qui laisse peu d'opportunits de
prchargement (moins de 4 car la distance de prchargement doit tre suprieur une itration
pour tre ecace).
Dans le programme de l'tape 6, nous utilisons une taille d'itration bien plus grande (T k =
N k)
qui permet au prchargement d'tre beaucoup plus ecace. Aprs avoir rduit la bande-
passante mmoire utilise avec le blocage pour les registres et le cache de traduction d'adresses
(TLB), la rduction de la latence mmoire avec le prchargement permet de cacher le cot de la
copie dans cette version du produit de matrices. Nous avons appliqu le prchargement plusieurs
endroits dans le programme : la fois dans les copies des blocs des matrices
A et B
pour masquer
la latence entre le second niveau de cache et la mmoire et aussi dans la boucle interne
le chargement de la copie de
pour
/ prchargement de a(j,k)
2.3.
33
dtaille
do kk=1,Nk,Tk
do i=1,Ni,4
Copie du bloc de la matrice B
C
Prchargement(b(k+4,i))
...
do j=1,Nj,4
C
Copie du bloc de la matrice A
Prchargement(a(j+4,k))
...
Rc0=c(j,i)
Rc1=c(j+1,i)
...
do k=kk, MIN(kk+Tk-1,Nk)
C
Code de la boucle interne travaillant sur les copies
Prchargement(a(j,k+4))
...
c(j,i)=Rc0
c(j+1,i)=Rc1
...
de boucles se focalisent gnralement sur le cache de premier niveau. Cependant, les pnalits
engendres par des dfauts de caches des niveaux infrieurs sont souvent beaucoup plus importantes que celles du premier niveau. Par exemple, pour le systme que nous utilisons, un accs
au cache de second niveau (Bcache) cote 12 cycles processeur alors qu'un accs mmoire cote
140 cycles processeur. D'autre part, de rcents travaux [SrLe98] ont montr que la latence de
plusieurs dfauts de cache de premier niveau peut tre masque par le rordonnancement dynamique des instructions dans les processeurs excution dans le dsordre. Cela se traduit par de
faibles gains de performances lors de l'optimisation pour le cache de premier niveau.
L'optimisation de blocage de boucles pour une hirarchie de mmoires caches complte est
particulirement dicile : il est ncessaire de trouver le bon compromis entre les dirents niveaux
de cache [NaJuLa94, CaFeHu95]. En eet le blocage pour un niveau particulier engendre souvent
des dgradations sur les autres niveaux de la hirarchie mmoire.
Dans la version du programme optimis de l'tape 6, nous utilisons une taille de bloc de 4
pour les matrices
et
matrice
i,
le bloc de
i = 1 utilise
A. A la n de
T k
A est trop grande pour que ceux-ci soit encore dans le cache de second
N k et N i = N j = N k = 1060 et la taille du cache de second niveau
de l'Alpha est de 8 Moctets. Nous avons bloqu les boucles i et j an de rduire la distance de
rutilisation des matrices A et B . Le choix des tailles de blocs est fait de telle sorte que le bloc
de la matrice A (T j T k ) et le bloc de la matrice B (T k T i) tiennent dans le second niveau
rutilisation des blocs de
niveau. En eet,
Tk
de cache. Le programme correspondant est reprsent sur la gure 2.13. Il est trs similaire au
programme ralisant le blocage sur 3 dimensions utilis pour le cache de premier niveau et le
cache de traduction d'adresses (TLB), cependant, les tailles de blocs (T i et
T j)
ciblent, ici, le
second niveau de cache. Gnralement, le choix des tailles des blocs est trs important lorsque
l'associativ du cache est faible, il permet de minimiser les conits dans le cache [CoKi95, RiTs99].
34
Mme si le cache de second niveau du processeur Alpha est correspondance directe, les conits
sont dj minimiss car le cache contiendra les copies des blocs et non pas les blocs eux-mmes
(les copies sont dclares dans des espaces contigus en mmoire).
do ii=1,Ni, Ti
do kk=1,Nk,Tk
Copie du bloc de la matrice B (Tk * Ti)
C
Prchargement(b(k+4,i))
...
do jj=1,Nj, Tj
C
Copie du bloc de la matrice A (Tj * Tk)
Prchargement(a(j+4,k))
...
do i=ii,MIN(ii+Ti-1,Ni), 4
do j=jj,MIN(jj+Tj-1,Nj), 4
Rc0=c(j,i)
Rc1=c(j+1,i)
...
do k=kk, MIN(kk+Tk-1,Nk), 2
Code de la boucle interne travaillant sur les copies
C
Prchargement(a(j,k+4))
...
c(j,i)=Rc0
c(j+1,i)=Rc1
et
Le blocage pour le second niveau de cache a permis de rduire les dfauts de cache de second
niveau de 11%. Dans le mme temps, les dfauts de cache du premier niveau ont augment de
9% 10%, mais le gain reste positif et il est de 12,75.
Cache de niveau 1 + TLB + queue d'critures + ILP + Registres + Prchargement + Cache de niveau 2 + Architecture
composants de l'architecture pour lesquels nous avons optimis jusqu'ici sont des composants
2.4.
35
Conclusions
queue d'instruction ottantes. Pour viter les suspensions de l'tage de renommage, nous devons
diminuer le ux d'instructions ottantes. La solution, que nous avons choisie, est d'insrer des
instructions fantmes (NOP). Ces instructions ne modient pas les calculs du programme car
elles ne s'excutent pas : elles ne traversent qu'une partie du pipeline, de l'tage de chargement
tire
Re
Me
m
c
Ex
e
g
Re
ue
Iss
Ma
p
Slo
t
Fe
tc
Floating
Point
STALL
Integer
Nous avons insr ces instructions fantmes au niveau assembleur comme pour les instructions
de prchargement et comme cela est indiqu dans la gure 2.15. Le nombre de suspensions du
pipeline dues aux dbordements de la queue d'instructions ottantes a diminu de 60%. Le gain
nal est de 13,56 par rapport au programme initial.
add
mul
ld
add
f18,f12,f18
f14,f26,f12
f8 , 0*SIZE(r3)
f17,f11,f17
add
nop
mul
ld
f18,f12,f18
mul
ld
...
...
f14,f27,f11
f19, 0*SIZE(r5)
add
nop
mul
ld
f17,f11,f17
...
f14,f26,f12
f8 , 0*SIZE(r3)
f14,f27,f11
f19, 0*SIZE(r5)
...
Fig. 2.15 Insertion des instructions fantmes
2.4 Conclusions
Dans ce chapitre, nous avons montr la complexit du comportement de programmes aussi
simples que le produit de matrices. Cette complexit est lie la complexit de l'architecture du
processeur et aux nombreuses interactions entre les dirents composants. Nous avons galement
montr qu'une analyse dynamique trs prcise peut aider comprendre les phnomnes complexes
qui se produisent lors d'une excution. L'analyse dynamique peut ainsi guider un processus
d'optimisation. Cette tude montre galement que les processus d'optimisation ne doivent pas
36
uniquement se focaliser sur les transformations de programmes les plus populaires comme le
blocage pour les caches, dont la contribution au gain nal est seulement de 12% ici, mais ils
doivent prendre en compte tous les composants de l'architecture.
37
Chapitre 3
38
de performance ne soit observe. D'autre part, les causes exactes de la mme dgradation de
performance peuvent tre partages entre de multiples vnements.
Plutt que de rechercher les causes exactes l'instant o une dgradation de performance
apparat, nous avons choisi de relever tous les vnements pouvant tre l'origine d'une dgra-
dation de performance au moment mme o ils apparaissent. Nous avons appel ces dirents
vnements des anomalies de performance et nous les combinons an de dterminer, parmi plusieurs causes, la cause dominante (la plus responsable de la dgradation de performance ). Lorsque
nous relevons une anomalie lors de l'excution d'une instruction, nous analysons uniquement les
instructions parentes dans le graphe de ot de donnes, c'est--dire les instructions fournissant
les oprandes. Par exemple, dans la gure 3.1 si une anomalie est rvle pour l'instruction
nous limitons notre analyse aux instructions
S1 ldt $f1,0(a1)
S4
S2
S3
mult $f1,$f2,$f3
S5
addt $f4,$f3,$f4
S6
et
S5.
S6,
ldt $f2,0(a2)
S4
ldt $f7,0(a3)
addt $f4,$f7,$f4
limite de lanalyse
3.1.
39
complexe
non
Existetil des instructions dans la
queue de lancement ddies aux units
fonctionnelles non utilises ?
non
oui
non
Utilisation
dsquilibre
des units
fonctionnelles
flottantes
(FU_fp)
Oprations mmoires
Utilisation
dsquilibre
des units
fonctionnelles
entires
(FU_int)
Estce un problme
de chargement
des instructions ?
Problme de latence ou
de bande passante
Oprations arithmtiques
Manque de paralllisme
memoire
int
Problme
de flot
de contrle
(BR Miss)
Problme de TLB
dinstructions
(ITB Miss)
Problme de conflits
des accs au cache
(Ld/st order trap
+load retry
+MAF conflict trap)
Problme de
dpendances sur
des oprations
entires
(DEPoO_int)
Problme de
capacit
(LQ full+SQ full
+MAF full)
Problme de cache
dinstruction
(ICM Miss)
fp
Problme de
dpendances sur
des oprations
flottantes
(DEPoO_fp)
non
oui
Problme de cache
ou de TLB ?
Problme de cache
int
La branche souligne par les ches en gras donne un exemple de raisonnement identiant un
problme de latence mmoire. A la racine de l'arbre, nous constatons que les units fonctionnelles
ne sont pas utilises chaque cycle. Il peut y avoir deux explications cela : la premire est qu'au
40
cycle o l'unit fonctionnelle n'est pas utilise, il n'y a aucune instruction ddie cette unit
dans la queue de lancement. La seconde explication est qu'au cycle o l'unit fonctionnelle n'est
pas utilise, il y a bien une instruction ddie cette unit dans la queue de lancement mais au
moins l'un de ses deux oprandes n'est pas prt. Nous avons donc une anomalie de performance
qui compte le nombre de cycle o une unit fonctionnelle n'est pas utilise et o il n'y a pas
d'instruction ddie dans la queue de lancement, et une autre anomalie de performance qui,
chaque fois qu'une unit fonctionnelle n'est pas utilise, compte le nombre d'oprandes non prts
appartenant aux instructions ddies cette unit, dans la queue de lancement. Nous verrons plus
loin dans la section 3.2 comment comparer des anomalies de performance ayant des probabilits
d'occurrence et des impacts sur la performance dirents. Mais supposons ici que l'anomalie de
performance dominante soit la seconde (oprandes non prts), dans ce cas la cause dominante
peut tre soit un manque de paralllisme, soit un problme mmoire. Pour distinguer ces deux
cas, l'anomalie de performance est rane en deux sous-anomalies, c'est--dire que chaque fois
qu'une unit fonctionnelle n'est pas utilise et qu'une instruction ddie se trouve dans la queue
de lancement, nous observons la nature des instructions devant fournir les oprandes non prts.
Si ces instructions sont majoritairement des oprations arithmtiques alors la cause dominante
sera un manque de paralllisme. Si, au contraire, ces instructions sont en majorit des oprations
de lecture mmoire alors la cause dominante sera un problme mmoire. Supposons, dans notre
exemple que nous ayons aaire un problme mmoire, nous devons alors dterminer si la cause
dominante est un problme de bande passante ou bien un problme de latence. Pour cela, nous
combinons l'anomalie prcdente avec une nouvelle anomalie : la latence mmoire. Si la latence
mmoire est leve alors le problme est identi comme tant un problme de latence sinon
il est identi comme tant un problme de bande passante. L'identication du problme de
performance a pour objectif de trouver la transformation de programmes la plus adapte.
Pour collecter les anomalies de performance, nous observons le comportement des instructions sur l'architecture chaque cycle. Considrons l'exemple de la gure 3.1 et supposons que
l'excution de celui-ci illustre l'exemple du problme de performance dcrit ci-dessus. Pour un
moire, nous incrmentons donc le compteur d'anomalies de type dpendances sur une opration
3.2.
41
les purges de pipeline dues des comportements spciques l'architecture des composants
(TRAPS).
Statistiques
DEP
DEP_fp
DEPoO_fp
DEPoM_fp
DEP_int
DEPoO_int
DEPoM_int
FU
FU_fp
FU_int
MEM_LAT
MEM_LAT_fp
MEM_LAT_int
Traps
ITraps
BR Miss
IC Miss
ITB Miss
DTraps
DTB Miss
Cache
conflict
LSQ/MAF
full
ma
7.38
a
5.08
2.09
0.54
12.84
8.13
0.005
0.041
Descriptions
Il est important de noter que les anomalies de dpendance sont comptabilises uniquement
si des units fonctionnelles ne sont pas utilises et si les oprandes sont en cours de calcul. Cela
permet de comptabiliser un problme de dpendance uniquement au moment o il se produit.
En eet, si on compte tous les oprandes non prts, y compris ceux devant tre fournis par des
instructions se trouvant dans la queue de lancement, alors l'anomalie est pollue. Une dpendance
entre deux instructions dans la queue de lancement ne doit pas tre comptabilise car il se peut
que, pendant les cycles d'excution de l'instruction devant fournir l'oprande, toutes les units
fonctionnelles soient utilises.
Pour dterminer la cause dominante d'une dgradation de performance, nous devons pouvoir
comparer les direntes anomalies entre elles. Nous avons donc normalis les anomalies. La
42
premire normalisation est simple et permet de comparer une mme anomalie entre des parties
direntes de programmes. Les mtriques absolues des anomalies sont divises par le nombre de
cycles sauf pour les anomalies de latence mmoire qui sont divises par le nombre de lectures
mmoires. Nous noterons
a
a.
La seconde normalisation
permet de comparer deux anomalies direntes pour une mme partie de programmes. Nous
voulons galement savoir si une anomalie est leve ou pas. Pour cela, nous avons collect les
anomalies pour l'ensemble des programmes de la suite SpecFP2000 et nous avons dni une
mtrique normalise
anorm
de la faon suivante :
anorm
o
ma
et
a
a
ma
a
1
programmes de la suite SpecFP2000 . Par consquent, pour une anomalie
de la mtrique normalise
anorm sur l'ensemble des programmes est gale 0 et son cart type est
gal 1. D'une manire plus intuitive, cela signie que nous utilisons l'ensemble des programmes
de la suite comme point de rfrence des anomalies.
Nous utilisons la normalisation uniquement au dbut de l'arbre pour comparer des anomalies
qui n'ont aucune relation entre elles et qui sont dicilement comparables en valeur absolue. Par
exemple, nous comparons des anomalies de type dpendance (DEP) avec des anomalies de type
units fonctionnelles (FU) ou bien encore avec des anomalies de type latence mmoire (MEM). Dans
la suite de l'arbre, nous utilisons directement les valeurs absolues des anomalies. Par exemple, les
anomalies de dpendances sur la mmoire ou de dpendances sur les oprations arithmtiques
peuvent tre compares en valeur absolue. La moyenne et l'cart-type des mtriques
a
des
3.3.1
Construction empirique
Pour construire l'arbre, nous avons optimis manuellement un ensemble de programmes pour
une architecture spcique. Nous avons utilis 12 programmes de calculs ottants parmi les programmes de la suite SpecFP2000. L'architecture cible est le processeur Alpha-21264 superscalaire
d'ordre 4 excution dans le dsordre. Nous avons utilis le simulateur cycle cycle du processeur Alpha pour collecter un grand nombre d'informations sur le comportement des programmes.
Nous avons optimis manuellement un premier programme (applu) l'aide de ces informations.
1 Les
Bases
mtriques sont collectes par la simulation des programmes compils avec les options des SpecFP2000
3.4.
Processus d'optimisation
43
Pour ce premier programme, le travail d'optimisation n'tait pas rellement structur : l'objectif
tait d'obtenir une squence d'optimisations orant les meilleures performances possibles. Ensuite, nous avons inversement examin cette squence d'optimisations pour en extraire l'analyse
des informations du simulateur permettant d'obtenir cette squence. Cette analyse a ensuite t
formalise sous la forme d'un arbre de dcision. L'optimisation de chaque nouveau programme
nous a permis de raner et d'tendre l'arbre : pour chaque nouvelle analyse, nous avons construit
une nouvelle branche. Le but de la formalisation de l'analyse est de pouvoir rutiliser les optimisations associes aux analyses (feuilles des branches de l'arbre). Pour que la rutilisation soit
possible, il est ncessaire de trouver un compromis dans le niveau de dtail de l'analyse. En eet,
si l'analyse n'est pas susamment prcise alors les branches de l'arbre n'identieront pas les
problmes de manire susamment prcise pour donner les bonnes solutions (optimisations). En
revanche, si l'analyse est trop dtaille alors chaque feuille de l'arbre correspondra un problme
bien particulier dont la solution propose est spcique chaque programme optimis. Dans ce
cas, la rutilisation devient impossible. Pour que l'association entre un problme de performance
et une optimisation soit la plus indpendante possible de la structure des programmes, nous formalisons uniquement l'analyse dynamique permettant d'identier un problme de performance
sur un composant de l'architecture. Contrairement ce qui est fait dans les compilateurs, nous
ne formalisons pas l'analyse statique que nous eectuons sur les programmes pour raliser les
transformations.
Nous avons poursuivi l'optimisation des autres programmes en systmatisant la dmarche et
le processus que nous dcrivons plus loin dans la section 3.4. La formalisation de l'analyse base
sur les informations dynamiques dtailles lors de l'optimisation des programmes est reprsente
dans l'arbre de la gure 3.2. Les branches en pointills reprsentent des problmes que nous
avons identis mais auxquels nous n'avons pas t confronts. Ce sont donc des problmes pour
lesquels nous n'avons pas fait d'optimisations, par exemple, les problmes de cache d'instructions.
3.4.1
Description du processus
Le processus d'optimisation itratif que nous avons utilis est relativement simple. Chaque
itration du processus se dcompose de la faon suivante :
1. collecter les Anomalies de performance,
2. utiliser l'arbre de dcision an d'identier le problme de performance dominant,
44
du processeur Alpha en insrant des sondes permettant de compter tous les vnements lists dans
la table 3.1 ainsi que le nombre de cycles et le nombre d'oprations mmoires (ncessaire pour
la normalisation des anomalies). Avant de dmarrer le processus d'optimisation pour chaque
programme, nous avons eectu un prol en temps. Ces prols nous ont permis d'identier
l'ensemble des procdures dont le temps cumul correspond environ 90% du temps total de
chaque excution. Le temps de simulation d'un programme complet de la suite SpecFP2000
pouvant atteindre plusieurs mois, nous avons simul uniquement les procdures slectionnes
suivant les prols et nous avons limit chaque simulation 4 milliards d'instructions excutes. Le
processus d'optimisation est fortement squentiel : les simulations pour la collecte des anomalies
ne peuvent pas tre eectues en parallle.
lisation de l'arbre de dcision est totalement systmatique : les rponses aux questions poses
dans l'arbre de dcision sont les vrications d'quations ou d'inquations dont les variables sont
les anomalies de performance. Par exemple, la rponse la premire question :
les units fonctionnelles sont-elles utilises chaque cycle ?
est non si l'inquation suivante est vrie :
DEP + FU > 0
La gure 3.3 reprsente l'arbre de dcision prcdemment dcrit avec les quations et les
inquations sur les arcs permettant d'identier le problme de performance de manire systmatique.
il est ncessaire de localiser ce problme, c'est--dire trouver la rgion responsable. Il est donc
ncessaire que la collecte des anomalies de performance conserve l'association entre une anomalie
et une instruction. Lors de la simulation, nous associons le plus prcisment possible les anomalies
aux instructions assembleurs en cours d'excution :
les anomalies de dpendance (DEP) sont associes aux instructions se trouvant dans la queue
de lancement pour lesquelles les oprandes ne sont pas prtes.
les anomalies d'utilisation des units fonctionnelles (FU) ne peuvent pas tre associes
une instruction puisqu'elle rvle un manque d'instruction ddie une unit fonctionnelle.
Cette anomalie a donc t associe au bloc de base des instructions en cours d'excution,
3.4.
45
Processus d'optimisation
1 : DTB miss > Cache conflict & DTB miss > LSQ/MAF full
2 : Cache conflict > DTB miss & Cache conflict > LSQ/MAF full
3 : LSQ/MAF full > Cache conflict & LSQ/MAF full > DTB miss
DEP+FU=0
DEP+FU>0
Existetil des instructions dans la
queue de lancement ddies aux units
fonctionnelles non utilises ?
DEP<FU
DEP>FU
FU_x<<<FU_y
FU_x~FU_y
Utilisation
dsquilibre
des units
fonctionnelles
flottantes
(FU_fp)
Utilisation
dsquilibre
des units
fonctionnelles
entires
(FU_int)
Estce un problme
de chargement
des instructions ?
Problme de latence ou
de bande passante
Problme de TLB
dinstructions
(ITB Miss)
Manque de paralllisme
Problme
de flot
de contrle
(BR Miss)
Problme de conflits
des accs au cache
(Ld/st order trap
+load retry
+MAF conflict trap)
Problme de
dpendances sur
des oprations
entires
(DEPoO_int)
Problme de
capacit
(LQ full+SQ full
+MAF full)
Problme de cache
dinstruction
(ICM Miss)
Problme de
dpendances sur
des oprations
flottantes
(DEPoO_fp)
norme(MEM_LAT) < 0
norme(MEM_LAT) > 0
Problme de cache
ou de TLB ?
Problme de cache
46
l'utilisateur. Mais c'est galement celle qui laisse le plus de libert. Il doit choisir une optimisation
adapte la partie de programme identie lors de la localisation. L'utilisateur doit vrier la
lgalit et doit valider ses optimisations.
Lors de la construction de l'arbre de dcision, les utilisateurs peuvent suggrer des optimisations adaptes et les rajouter aux feuilles de l'arbre.
Itrations d'adaptation
gnrales du processus. Elles dirent uniquement au niveau de la phase d'identication du problme de performance. Lors de ces itrations, le processus ne se focalise pas sur le problme
de performance dominant mais se focalise uniquement sur des augmentations de problmes en
observant les augmentations d'anomalies de performance. Les itrations d'adaptation permettent
d'ajuster le paramtrage d'une optimisation ou bien de composer des transformations de programmes an d'amliorer nement le comportement local du programme sur l'ensemble des
composants de l'architecture.
Considrons, par exemple, le programme applu dont la premire itration a ncessit une
adaptation. Les anomalies de performance et l'arbre de dcision nous ont permis d'identier
un problme de dpendances sur des oprations arithmtiques ottantes localis dans la procdure
blts,
v(m,i,j,k)-omega
reprsente sur
la gure 3.4. Cette soustraction dpend de 4 multiplications et de 2 additions. Nous avons bru-
do k = 2, nz-1
do j = 2, ny-1
do i = 2, nx-1
do m = 1, 5
do l = 1, 5
v(m,i,j,k) = v(m,i,j,k) - omega *
( ldz(m,l,i,j,k) * v(l,i,j,k-1)
+ ldy(m,l,i,j,k) * v(l,i,j-1,k)
+ ldx(m,l,i,j,k) * v(l,i-1,j,k)
blts
talement optimis pour rduire au maximum le problme de dpendances : nous avons scind le
nid de boucle (m,l) en deux en scindant l'instruction pour sparer les multiplications du calcul.
De plus, nous avons eectu un dcalage d'itration (shifting ) du second nid cr par la ssion
de boucles. La partie de programme rsultante est montre sur la gure 3.5. Aprs cette optimisation, nous avons procd une itration d'adaptation : nous avons collect de nouvelles
anomalies et nous avons observ la rduction des anomalies de dpendances sur des oprations
arithmtiques ottantes. En revanche, nous avons constat une augmentation des anomalies de
dpendances sur des oprations arithmtiques entires localises sur les instructions de rangements en mmoire des tableaux temporaires dans le second nid de boucle. Nous avons donc choisi
de rduire les instructions de rangements mmoires en modiant lgrement la ssion de boucle :
nous avons regroup les additions et les multiplications dans le mme nid de boucle pour rduire
le nombre de tableaux temporaires. Le programme correspondant est reprsent sur la gure 3.6
La table 3.2 montre l'volution des anomalies de dpendances entires (DEP_int) et ottantes
3.4.
47
Processus d'optimisation
do k = 2, nz-1
do j = 2, ny-1
...
do i = 2, nx-1
do m = 1, 5
do l = 1, 5
v( m, i, j, k ) = v( m, i, j, k )
- omega * ( tmpldz(m,l)
+ tmpldy(m,l)
+ tmpldx(m,l) )
do m = 1, 5
do l = 1,5
tmpldx(m,l) = ldx( m, l, i+1, j, k )
* v( l, i-1+1, j, k )
tmpldy(m,l) = ldy( m, l, i+1, j, k )
* v( l, i+1, j-1, k )
tmpldz(m,l) = ldz( m, l, i+1, j, k )
* v( l, i+1, j, k-1 )
...
blts)
do k = 2, nz-1
do j = 2, ny-1
do i = 2, nx-1
do m = 1, 5
do l = 1, 5
v( m, i, j, k ) = v( m, i, j, k )
- omega * tmpldxyz(m,l)
do m = 1, 5
do l = 1,5
tmpldx = ldx( m, l, i+1, j, k )
* v( l, i-1+1, j, k )
tmpldy = ldy( m, l, i+1, j, k )
* v( l, i+1, j-1, k )
tmpldz = ldz( m, l, i+1, j, k )
* v( l, i+1, j, k-1 )
tmpldxyz(m,l) = tmpldx + tmpldy + tmpldz
blts)
Anomalies
original
itration 1
adaptation 1
DEP_fp
5.50
3.78
4.03
DEP_int
2.49
3.65
3.31
Les itrations d'adaptation peuvent agir rcursivement les unes sur les autres, le processus
doit donc xer une limite au nombre d'adaptations par itration. Nous nous sommes limits
deux ou trois adaptations par itration.
48
Gnralisation
Exemple applu
drons une nouvelle fois l'exemple du programme applu. Lors de la premire itration, nous
avions identi un problme de dpendances sur des oprations arithmtiques localis sur le nid
de boucle de la procdure
blts.
blme de performance donne des instructions ayant une structure trs similaire appartenant la
procdure
buts
(gure 3.7).
do k = 2, nz-1
do j = 2, ny-1
do i = 2, nx-1
do m = 1, 5
do l = 1, 5
v(m,i,j,k) = v(m,i,j,k) - omega *
( ldz(m,l,i,j,k) * v(l,i,j,k-1)
+ ldy(m,l,i,j,k) * v(l,i,j-1,k)
+ ldx(m,l,i,j,k) * v(l,i-1,j,k)
procdure
do k = nz-1, 2
do j = 2, ny-1, 2
do i = 2, nx-1, 2
do m = 1, 5
tv(m) = 0.0d+00
do l = 1, 5
tv(m) = t(m) - omega *
( udz(m,l,i,j,k) * v(l,i,j,k+1)
+ udy(m,l,i,j,k) * v(l,i,j+1,k)
+ udx(m,l,i,j,k) * v(l,i+1,j,k)
blts
procdure
blts
sur
buts
buts
3.4.
49
Processus d'optimisation
Contributions de la gnralisation
9%
equake
wupwise
41%
applu
38%
mgrid
6%
galgel
8%
Moyenne
20%
3.4.2
Comme nous l'avons expliqu prcdemment dans la section 3.4, le processus n'adresse qu'un
seul problme de performance par itration (le problme dominant). Adresser plusieurs problmes
simultanment permettrait certainement d'acclrer le processus. Cependant, il serait beaucoup
plus dicile d'adapter nement les optimisations comme nous venons de le voir dans la soussection prcdente. D'autre part, dans certains cas, il arrive qu'un problme soit cach par un
autre et ce n'est qu'une fois le problme dominant rduit que le second problme apparat. Le
processus doit adresser les problmes un un pour garantir la progression du processus.
Exemple applu
itration et son adaptation ont t dcrites prcdemment. Nous avons donc scind le nid de
boucle (m,l) en deux comme le montre la gure 3.6. A l'itration suivante, le problme de
dpendance sur des oprations arithmtiques n'est plus le problme dominant. Le nouveau problme dominant est un problme de latence mmoire localis sur les rfrences aux tableaux
ldy
et
ldz.
ldx,
lors de la prcdente itration car les anomalies de dpendance sur des oprations mmoires et
la latence mmoire taient dj leves (voir le dtail de l'optimisation du programme applu
annexe A.3). Cet exemple illustre le fait qu'il existe des cas pour lesquels il serait possible de
traiter simultanment plusieurs problmes de performance.
Exemple equake
Cet autre exemple illustre les cas o certains problmes sont latents et
masqus par des problmes plus importants. La gure 3.8 montre une partie de la procdure
smvp
programme. Nous avons identi un problme de latence mmoire sur les accs aux tableaux
M23, C23
et
V23.
M,
en double prcision. Nous avons donc optimis le programme en transformant ces tableaux en
tableaux ottants doubles prcisions (voir gure 3.9). Aprs cette optimisation, nous avons observ une augmentation de prs de 50% des anomalies spciques l'architecture (Traps). Cette
augmentation est plus prcisment situe sur des problmes de conits des accs mmoires. Nous
50
/* Mass matrix */
M = (double **) malloc(ARCHnodes * sizeof(double *))
if (M == (double **) NULL) {
fprintf(stderr, "malloc failed for M")
fflush(stderr)
exit(0)
for (i = 0; i < ARCHnodes; i++) {
M[i] = (double *) malloc(3 * sizeof(double))
if (M[i] == (double *) NULL) {
fprintf(stderr, "malloc failed for M[%d]",i)
fflush(stderr)
exit(0)
for (i = 0; i < ARCHnodes; i++)
for (j = 0; j < 3; j++)
disp[disptplus][i*3+j] += 2.0 * M[i][j] * disp[dispt][i*3+j] (M[i][j] - Exc.dt / 2.0 * C[i][j]) * disp[disptminus][i*3+j] Exc.dt * Exc.dt * (M23[i][j] * phi2(time) / 2.0 +
C23[i][j] * phi1(time) / 2.0 +
V23[i][j] * phi0(time) / 2.0);
smvp
avons localis ces problmes de conits sur les accs aux fonctions
mme nid de boucle reprsent sur la gure 3.9. La variable
time
phi0, phi1
et
phi2
dans le
boucle, nous avons ralis une optimisation scalaire en plaant les appels de fonctions l'extrieur
du nid de boucle. Le problme de conits tait bien prsent avant l'optimisation pour la latence
mmoire mais les anomalies de latence mmoire avaient pour eet de masquer ce problme. Cet
exemple montre que certaines anomalies peuvent tre dissimules par d'autres. Il convient donc
de traiter les anomalies une une an de dmasquer toutes les anomalies et de garantir ainsi la
progression du processus d'optimisation.
smvp
3.4.
51
Processus d'optimisation
3.4.3
3.4.4
Le principal avantage d'un tel processus itratif par rapport un compilateur statique est la
exibilit. Il permet de construire de longues squences de transformations dont l'ordre est dni
par la domination des problmes de performance, contrairement aux compilateurs statiques o
l'ordre des transformations est prdni et constant. Par exemple, la gure 3.10 montre une
squence de 7 transformations obtenue pour le programme galgel. L'autre avantage provient
de l'application manuelle des transformations qui permet de dpasser les limites imposes aux
compilateurs statiques par la reprsentation intermdiaire gnralement base sur les structures
d'arbres syntaxiques.
Data
TLB
Data
TLB
Loop
interchange
1.12
Data
TLB
Loop
merging
0.97
Shifting
Chain of dependent
FP operations
Chain of dependent
FP operations
1.12
Loop merging
& Shifting
1.12
Chain of dependent
INT operations
Unrolling
(disable)
FP FU
resource
Register
Blocking
1.30 (1.32 gen.)
52
avec les
compilateurs HP Fortran (V5.4) et C (V6.4). Nous avons galement compar les performances
des versions optimises des programmes avec les performances Peak des SpecFP2000 obtenue
avec des options de compilation particulires pour chaque programme utilisant parfois le prprocesseur KAP Fortran (V4.3) et utilisant parfois les optimisations diriges par des informations
dynamiques. La table 3.4 montre les gains obtenus par compilation en Peak et par le processus
itratif par rapport la compilation en Base. Elle montre galement le gain relatif. Du point de
Compil en
Processus
Gain
Peak
Itratif
Relatif
wupwise
1.20
2.90
2.42
equake
2.01
2.50
1.24
applu
1.47
2.18
1.48
swim
1.00
1.51
1.51
mgrid
1.59
1.45
0.91
facerec
1.04
1.42
1.36
galgel
1.04
1.39
1.34
apsi
1.07
1.23
1.15
mesa
1.12
1.17
1.04
fmad
1.32
1.09
0.82
art
1.22
1.07
0.87
ammp
1.18
1.06
0.88
Tab. 3.4 Gain obtenu par rapport aux performances Base des SpecFP2000
vue des transformations de programmes, le processus gnre des squences structures de transformations qui sont appliques direntes sections de programmes. Pour chaque programme,
nous avons modi 1 3 sections de code sur lesquelles plusieurs transformations sont successivement appliques. En moyenne, nous avons modi 30 lignes de source par programme. La
principale limite aux nombres de modications des programmes est l'application manuelle des
3.5.
53
Rsultats exprimentaux
optimisations.
3.5.1
Optimisation du programme
wupwise
1ire
itration
et
zcopy.
Ces
anomalies de dpendances sur des oprations entires ont bien t rduites. En revanche, toutes
les autres anomalies ont augment. L'optimisation tant globale et pouvant avoir un impact important sur l'ensemble du programme, nous ne pouvons pas eectuer d'itrations d'adaptation.
Nous avons donc choisi de commencer une nouvelle itration.
2nde
itration
zgemm_small_nn
et
zaxpy.
La procdure
zcopy
zcopy, zgemm,
calcul, il est normal que les units fonctionnelles ottantes ne soient pas utilises. Cette procdure est appele uniquement par la procdure
gammul.
La procdure
gammul
appelle plusieurs
dans la gure 3.11. Les paramtres d'appel aux procdures tant relativement petits, nous avons
IF (MU.EQ.1) THEN
CALL ZCOPY(12, X, 1, RESULT,
CALL ZAXPY( 3, I, X(10), 1,
CALL ZAXPY( 3, I, X( 7), 1,
CALL ZAXPY( 3, -I, X( 4), 1,
CALL ZAXPY( 3, -I, X( 1), 1,
1)
RESULT( 1),
RESULT( 4),
RESULT( 7),
RESULT(10),
zcopy
zcopy
et
et
zaxpy
zaxpy
1)
1)
1)
1)
dans la procdure
dans la procdure
gammul
gammul
(nous avons
inliner les procdures). Par ailleurs, nous avons compltement droul les boucles gnres par
la copie, ce qui a pour eet de supprimer totalement la copie ralise par
zcopy.
La partie de
programme rsultante est reprsente sur la gure 3.12. Aprs cette optimisation, le temps d'excution a t rduit 191 secondes. L'expansion de codes, elle seule, ne sut pas supprimer la
copie ralise par la procdure
units fonctionnelles ottantes. En revanche, cette optimisation est indispensable pour raliser le
droulage complet des boucles qui rduit l'anomalie. Il faut, tout de mme, attribuer une partie
du gain l'expansion de code qui rduit considrablement le nombre d'instructions excutes.
2nde
itration,
1ire
adaptation
malies de dpendance sur les oprations arithmtiques entires (DEPoO_int). Nous avons localis
54
IF (MU.EQ.1)
RESULT( 1)
RESULT( 2)
RESULT( 3)
RESULT( 4)
RESULT( 5)
RESULT( 6)
RESULT( 7)
RESULT( 8)
RESULT( 9)
RESULT(10)
RESULT(11)
RESULT(12)
THEN
= X( 1)
= X( 2)
= X( 3)
= X( 4)
= X( 5)
= X( 6)
= X( 7)
= X( 8)
= X( 9)
= X(10)
= X(11)
= X(12)
gammul
+
+
+
+
+
+
+
+
+
+
+
+
(I * X(10))
(I * X(11))
(I * X(12))
(I * X( 7))
(I * X( 8))
(I * X( 9))
((-I) * X( 4))
((-I) * X( 5))
((-I) * X( 6))
((-I) * X( 1))
((-I) * X( 2))
((-I) * X( 3))
DO 100 L=1,N4
LP=MOD(L,N4)+1
DO 100 K=1,N3
KP=MOD(K,N3)+1
DO 100 J=1,N2
JP=MOD(J,N2)+1
DO 100 I=(MOD(J+K+L+1,2)+1),N1,2
IP=MOD(I,N1)+1
CALL GAMMUL(1,0,X(1,(IP+1)/2,J,K,L),AUX1)
CALL SU3MUL(U(1,1,1,I,J,K,L),'N',AUX1,AUX3)
CALL GAMMUL(2,0,X(1,(I+1)/2,JP,K,L),AUX1)
CALL SU3MUL(U(1,1,2,I,J,K,L),'N',AUX1,AUX2)
CALL ZAXPY(12,ONE,AUX2,1,AUX3,1)
CALL GAMMUL(3,0,X(1,(I+1)/2,J,KP,L),AUX1)
CALL SU3MUL(U(1,1,3,I,J,K,L),'N',AUX1,AUX2)
CALL ZAXPY(12,ONE,AUX2,1,AUX3,1)
CALL GAMMUL(4,0,X(1,(I+1)/2,J,K,LP),AUX1)
CALL SU3MUL(U(1,1,4,I,J,K,L),'N',AUX1,AUX2)
CALL ZAXPY(12,ONE,AUX2,1,AUX3,1)
CALL ZCOPY(12,AUX3,1,RESULT(1,(I+1)/2,J,K,L),1)
su3mul
optimise, les problmes de dpendances sont dus au sucre syntaxique des appels de procdures dont font partie de nombreux calculs d'adresses. Nous avons donc choisi d'eectuer une
zcopy
dans la procdure
3.5.
55
Rsultats exprimentaux
aprs l'expansion de code sur laquelle sont reprsents les codes expanss des premiers appels
a t rduit 146
secondes.
C
CALL GAMMUL(1,0,X(1,(IP+1)/2,J,K,L),AUXP1)
AUXP1( 1) = X( 1,(IP+1)/2,J,K,L) + (IMA * X(10,(IP+1)/2,J,K,L))
AUXP1( 2) = X( 2,(IP+1)/2,J,K,L) + (IMA * X(11,(IP+1)/2,J,K,L))
AUXP1( 3) = X( 3,(IP+1)/2,J,K,L) + (IMA * X(12,(IP+1)/2,J,K,L))
AUXP1( 4) = X( 4,(IP+1)/2,J,K,L) + (IMA * X( 7,(IP+1)/2,J,K,L))
...
C
CALL SU3MUL(U(1,1,1,I,J,K,L),'N',AUXP1,AUXP3)
AUXP3( 1) = U(1,1,1,I,J,K,L) * AUXP1( 1)
%
+ U(1,2,1,I,J,K,L) * AUXP1( 2)
%
+ U(1,3,1,I,J,K,L) * AUXP1( 3)
AUXP3( 2) = U(2,1,1,I,J,K,L) * AUXP1( 1)
%
+ U(2,2,1,I,J,K,L) * AUXP1( 2)
%
+ U(2,3,1,I,J,K,L) * AUXP1( 3)
AUXP3( 3) = U(3,1,1,I,J,K,L) * AUXP1( 1)
%
+ U(3,2,1,I,J,K,L) * AUXP1( 2)
%
+ U(3,3,1,I,J,K,L) * AUXP1( 3)
AUXP3( 4) = U(1,1,1,I,J,K,L) * AUXP1( 4)
%
+ U(1,2,1,I,J,K,L) * AUXP1( 5)
%
+ U(1,3,1,I,J,K,L) * AUXP1( 6)
...
C
ZCOPY(12,AUX3,1,RESULT(1,(I+1)/2,J,K,L),1)
RESULT( 1,(I+1)/2,J,K,L) = AUXP3(1)
RESULT( 2,(I+1)/2,J,K,L) = AUXP3(2)
RESULT( 3,(I+1)/2,J,K,L) = AUXP3(3)
RESULT( 4,(I+1)/2,J,K,L) = AUXP3(4)
...
Fig. 3.14 Procdure
2nde
itration,
2nde
adaptation
su3mul
MEM_LAT
l'architecture (Traps). Nous nous sommes focaliss sur les anomalies spciques l'architecture
qui ont plus que tripl. Ces anomalies sont plus prcisment rparties entre les anomalies de
conit d'accs au cache et des anomalies de capacit (dbordement de la queue d'instructions de
lecture). Nous avons localis ces anomalies, rvlant deux types de problmes, sur des instructions assembleurs de dbordements (spill code ) dans la procdure
muldeo.
L'expansion de code
agressive, que nous avons ralis, gnre un corps de boucle relativement important pour lequel
le compilateur n'arrive plus optimiser l'allocation des registres et l'ordonnancement des instructions. Par consquent, nous avons optimis le corps de la boucle en remplaant les tableaux
temporaires
AUXP1, AUXP3, AUXM1 et AUXM3 par des variables temporaires scalaires. Nous avons
galement rordonnanc les instructions an de rduire la dure de vie des registres (nous avons
remont les instructions consommatrices des variables temporaires). Le nouveau corps de boucle
est rsum dans la gure 3.15. L'optimisation scalaire et le rordonnancement ont rduit le temps
d'excution 135 secondes. Ces optimisations ont galement rduit l'anomalie de latence mmoire qui avait t augmente par la prcdente adaptation. Comme nous nous y attendions,
le rordonnancement, qui a pour objectif de rduire la dure de vie des registres, a augment
l'anomalie de dpendance ottante (le gain montre que ce compromis est ncessaire). Les autres
56
C
CALL GAMMUL(1,0,X(1,(IP+1)/2,J,K,L),AUXP1)
AUXP1_1 = X( 1,(IP+1)/2,J,K,L) + (IMA * X(10,(IP+1)/2,J,K,L))
AUXP1_2 = X( 2,(IP+1)/2,J,K,L) + (IMA * X(11,(IP+1)/2,J,K,L))
...
AUXP1_12 = X(12,(IP+1)/2,J,K,L) + ((-IMA) * X( 3,(IP+1)/2,J,K,L))
C
CALL SU3MUL(U(1,1,1,I,J,K,L),'N',AUXP1,AUXP3)
AUXP3_1 = U(1,1,1,I,J,K,L) * AUXP1_1
%
+ U(1,2,1,I,J,K,L) * AUXP1_2
%
+ U(1,3,1,I,J,K,L) * AUXP1_3
RESULT( 1,(I+1)/2,J,K,L) = AUXP3_1
AUXP3_4 = U(1,1,1,I,J,K,L) * AUXP1_4
%
+ U(1,2,1,I,J,K,L) * AUXP1_5
%
+ U(1,3,1,I,J,K,L) * AUXP1_6
RESULT( 4,(I+1)/2,J,K,L) = AUXP3_4
AUXP3_7 = U(1,1,1,I,J,K,L) * AUXP1_7
%
+ U(1,2,1,I,J,K,L) * AUXP1_8
%
+ U(1,3,1,I,J,K,L) * AUXP1_9
RESULT( 7,(I+1)/2,J,K,L) = AUXP3_7
AUXP3_10 = U(1,1,1,I,J,K,L) * AUXP1_10
%
+ U(1,2,1,I,J,K,L) * AUXP1_11
%
+ U(1,3,1,I,J,K,L) * AUXP1_12
RESULT(10,(I+1)/2,J,K,L) = AUXP3_10
AUXP3_2 = U(2,1,1,I,J,K,L) * AUXP1_1
%
+ U(2,2,1,I,J,K,L) * AUXP1_2
%
+ U(2,3,1,I,J,K,L) * AUXP1_3
RESULT( 2,(I+1)/2,J,K,L) = AUXP3_2
AUXP3_5 = U(2,1,1,I,J,K,L) * AUXP1_4
%
+ U(2,2,1,I,J,K,L) * AUXP1_5
%
+ U(2,3,1,I,J,K,L) * AUXP1_6
RESULT( 5,(I+1)/2,J,K,L) = AUXP3_5
...
AUXP3_12 = U(3,1,1,I,J,K,L) * AUXP1_10
%
+ U(3,2,1,I,J,K,L) * AUXP1_11
%
+ U(3,3,1,I,J,K,L) * AUXP1_12
RESULT(12,(I+1)/2,J,K,L) = AUXP3_12
...
Fig. 3.15 Procdure
su3mul
anomalies n'ayant pas t augmentes, nous avons arrt les itrations d'adaptations pour cette
itration.
Gnralisation
l'utilisation des librairies est dj une optimisation gnrale. Il n'y a pas d'opportunit de g-
zcopy n'est
gammul. En revanche, lors de la premire adaptation de la seconde
itration, nous avons vu que les appels aux procdures su3mul et gammul taient rpartis quitablement entre les procdures muldeo et muldoe. Or, ces deux procdures sont trs similaires,
nous avons donc gnralis la premire et la seconde adaptation la procdure muldoe. Le temps
3.5.
57
Rsultats exprimentaux
3.5.2
p
p
p
Pr
ob
Pr
Optimisations
lm
ed
ob
lm e ca
c
Pr
ob e de he F
l
P
c
D me ache
d
pe
e b IN
n
D dan and T
ep
pe ces
nd
a
s
u
an
r o ssan
Ut
c
t
ilis
p
es
ra e
a
s
Co tion ur d tion
es
n
s
d
TL its d squ opr otta
a
il
'a
n
B
de ccs ibr tion tes
s
e
do
Ga
nn au c des enti
in
ac
UF re
he
mo es
o s
ye
#
tta
n
d'a
nt
es
pp
lic
at
ion
s
p
p p p
p
p
p
p
p
p
p
p
p
p p
p
p
p p p
p
p p
p p
p p p
p
p p
2
1.34
1.24
1.21
1.14
1.14
1.11
1.10
1.10
1.10
1.06
1.06
1.05
1.02
Pour plusieurs itrations et pour plusieurs programmes, nous n'avons pas appliqu une optimisation mais deux ou trois transformations de programmes simultanment. Nous avons donc
rparti le gain quitablement entre les deux ou trois optimisations ralises.
Les optimisations sont polyvalentes : hormis le dcalage d'itrations qui a t utilis uniquement pour rduire des problmes de dpendance (entire ou ottante), les autres optimisations
ont t utilises pour rduire des problmes de performance varis. Les objectifs d'une mme
optimisation peuvent tre trs dirents contrairement aux heuristiques des compilateurs statiques guidant les optimisations, qui sont gnralement trs orients vers un objectif souvent en
relation avec le ot de donnes et la rutilisation. Par exemple, l'algorithme de Kennedy [Ke00]
58
pour la fusion de boucles est orient uniquement vers la rutilisation. Les optimisations ralises
ici montrent que la fusion de boucles peut tre utilise pour rduire des problmes de conits ou
des problmes d'utilisation d'units fonctionnelles.
3.5.3
Squences d'optimisations
La table 3.6 prsente un rsum des squences d'optimisations ralises lors de l'optimisation
des 12 programmes de la suite SpecFP2000. Pour chaque programme, une ligne de la table
correspond une itration. Chaque optimisation est reprsente par une lettre indiquant si elle
une phase de gnralisation ( ). Ces lettres sont suivies d'informations se trouvant entre des
crochets : on trouve le nom de la transformation en haut et le problme de performance que
celle-ci a rduit en bas. Les nombres indiquent la progression du gain.
Comme nous l'avons prcdemment montr dans la section 3.4.4, les gains que nous avons
obtenus avec le processus itratif sont dus la longueur et la diversit des squences d'optimisations. La plupart des optimisations, que nous avons utilises, existent dans les compilateurs optimisants rcents. Cependant, les reprsentations intermdiaires sous forme d'arbres
syntaxiques, les contraintes lies aux analyses de dpendances et les ordres imposs aux phases
d'optimisation limitent leur champ d'application. Certains programmes prsentent des dicults
supplmentaires pour les compilateurs : les optimisations suivent des directions opposes, par
exemple pour le programme apsi, nous avons t amens appliquer une ssion de boucles puis
nous avons fusionn chaque nid de boucle avec deux autres nids de boucles. Pour le programme
galgel, nous avons galement rencontr une opposition avec une optimisation de privatisation
3.6 Conclusions
Nous proposons un processus itratif d'optimisation bas sur une analyse dynamique trs
dtaille. Bien que ce processus soit manuel, il n'en est pas moins systmatique. Nous avons
montr l'application et l'ecacit de ce processus sur un ensemble de programmes de la suite
SpecFP2000.
L'ecacit de ce processus doit tre attribue d'une part l'analyse dynamique trs dtaille qui permet d'identier prcisment les problmes de performance et d'autre part la
nature itrative du processus qui permet de construire, pour chaque programme, des squences
de transformations.
L'arbre de dcision systmatise l'analyse dynamique et formalise l'exprience empirique de
l'optimisation manuelle d'une manire intelligible. L'exprience empirique peut donc tre aisment interprte, diuse et remploye.
Nous avons identi quatre principales catgories d'anomalies pour l'architecture du processeur Alpha-21264 :
les anomalies de dpendances (DEP),
3.6.
59
Conclusions
Codes
wupwise
equake
applu
swim
mgrid
facerec
galgel
apsi
mesa
fmad
art
ammp
Squences d'optimisations
Gains
O DEPoO_int
1.21
1.59
1.72
OExpansion/Droulage
IA Expansion/Droulage
IA Promo.Scal./Rord.
IG 2.90
FU_fp
FU_fp
Bande passante
Fusion 1.95
Promo.scal. 2.50
1.70
ORarrange.
MEM_LAT_fp IG 1.92 IA Cache conict IA Cache conict
Promo.scal. 1.04
1.02
ODcalage
IG 1.06
DEPoO_FP IA DEPoO_fp
Rord. 1.20
1.08
OFusion
MEM_LAT_fp IA Bande passante IG 1.48
Droulage (comp.) 1.65
1.51
O Fission
IG 2.18
DEPoO_fp IA FU_fp
Padding/Tiling. 1.20
MERGING 1.51
IA Loop
IA 1.51
MEM_LAT_fp
Bandwidth
0.75
1.27
OFission
IA Fission
FU_fp
Bande passante IG 1.32
Reg. 1.38
OBlocage
IG 1.41
Bande passante
1.00
On/a.
FU_int
Reg. 1.30
OBlocage
DEPoO_fp
1.02
1.12
0.97
1.12
OFusion/Promo.scal.
IG Permutation
IG Fusion/Promo.scal.
IADcalage
Data TLB
Data TLB
Data TLB
DEPoO_int
1.12
(Disactiv) 1.16
IA Fusion/Dcalage
IA Droulage
IG 1.24
DEPoO_fp
DEPoO_int
Reg. 1.30
OBlocage
IG 1.32
FU_fp
Permutation/Promo.scal. 1.11
1.07
1.08
1.22
ORarrange.
IA Fission
IG Permutation/Promo.scal.
Data TLB
Cache conict IA Cache conict
Data TLB
1.22
OFission
Bande passante
1.23
1.23
1.23
OFusion/Expansion
IA Dcalage
IA Dcalage
IG 1.23
FU_fp
DEPoO_fp
DEPoO_fp
1.06
OExpansion
DEPoO_int
Rarrange. 1.13
1.13
ODcalage
DEPoO_int IA Cache conict
1.19
ODcalage
DEPoO_int
Dcalage 1.00
Fission 1.00
Fusion 1.03
1.00
ODcalage
DEPoO_int IG DEPoO_int IA Cache conict IA DEPoO_fp
1.09
OExpansion
Bande passante. I 1.09
1.02
OPermutation/Promo.scal.
MEM_LAT_int
1.07
OFission
MEM_LAT_int I 1.07
1.01
ODcalage
DEPoO_int
1.02
ODcalage
DEPoO_int
1.06
OFusion
FU_fp
1.10
Librairies 1.10
2.90
2.50
1.06
1.48
2.18
1.51
1.32
1.41
1.00
1.30
1.24
1.32
1.22
1.22
1.23
1.06
1.13
1.19
1.03
1.09
1.02
1.07
1.01
1.02
1.06
les purges de pipeline dues des comportements spciques l'architecture des composants
(TRAPS).
Pour chaque programme, nous avons accumul ces quatre catgories d'anomalies sur l'ensemble des parties de code traites. Nous avons ensuite normalis ces anomalies an de pouvoir
les confronter et d'identier l'anomalie dominante. La normalisation ne fait perdre aucune information. En contrepartie, l'accumulation des anomalies perd l'information de distribution des
60
anomalies sur le programme. Bien que nous ayons identi et rsolu de nombreux problmes de
performance, certains problmes locaux ont pu tre masqus par l'accumulation.
L'identication des problmes de performance peut tre ane par un examen de la distribution des anomalies sur le programme. Cette modication demande la rorganisation du processus
d'optimisation. En eet, une recherche sur la distribution allie l'identication d'un problme de
performance et sa localisation.
61
Conclusions et perspectives
Conclusions
La complexit des processeurs augmentant, il est de plus en plus dicile d'intgrer des modles
prcis d'architectures dans les compilateurs. En consquence, l'ecacit des compilateurs dcrot.
La tendance actuelle vise enrichir les compilateurs statiques d'informations dynamiques sur le
comportement de l'architecture la manire des techniques d'optimisation bases sur les proles
d'excution ou des techniques de re-compilation dynamique. Pour le moment, seules quelques
informations lmentaires sur le comportement de l'architecture sont utilises.
Dans le second chapitre, nous avons montr de quelle manire les interactions entre les diffrents composants d'une architecture rendent complexe le comportement d'un programme. Cependant, nous avons galement montr qu'il est possible de capturer cette complexit et d'en
dduire les transformations apporter au programme pour amliorer son comportement.
Dans le troisime chapitre, nous avons tudi une mthode plus systmatique pour adresser
le problme de la complexit ; an de la capturer, nous avons propos un processus itratif d'optimisation manuelle bas sur une analyse dynamique dtaille. Nous avons exprimentalement
montr qu'une telle approche amliore la performance des programmes avec un gain moyen de
1,27 par rapport aux optimisations ralises avec les combinaisons optimales des options du compilateur associes un pr-processeur optimisant et des optimisations diriges par des analyses
dynamiques classiques.
Cette approche est potentiellement une stratgie pour guider de futurs environnements d'optimisation itratifs, mais elle prsente galement des bnces immdiats. Premirement, elle
propose un processus systmatique d'optimisation manuelle qui peut tre utilis par des ingnieurs. Deuximement, l'arbre de dcision formalise l'expertise empirique de l'optimisation manuelle qui peut tre aisment passe des ingnieurs ou des chercheurs. Finalement, l'arbre de
dcision catgorise automatiquement les transformations de programmes suivant les problmes
de performance.
Perspectives
Nous investiguons actuellement plusieurs extensions de ce travail. Premirement, nous essayons d'extraire des compteurs de performance les informations permettant de guider le processus d'optimisation. Deuximement, nous travaillons sur l'implmentation d'un environnement de
transformations de programmes bas sur une reprsentation intermdiaire qui facilite les compositions de longues squences de transformations. Troisimement, nous travaillons sur l'automa-
62
Conclusions et perspectives
63
1.2
. . . . . . . . . . . . . . . . . . . . . .
1.3
Promotion de scalaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
1.4
Droulage de boucles
12
1.5
Permutation de boucles
1.6
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
1.7
Dcalage d'itrations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
1.8
14
1.9
14
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
2.1
25
2.2
25
2.3
26
2.4
27
2.5
Conit mmoire
27
2.6
. . . . . . . . . . . .
28
2.7
28
2.8
29
2.9
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
30
31
et
. . . . . . .
31
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
et
34
. . . . . . . . . . . . . . . . .
35
35
64
3.1
38
3.2
Arbre de dcision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
3.3
45
3.4
3.5
3.6
3.7
3.8
Dclaration et procdure
3.9
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
smvp
blts
. . . . . . . . . . . . . . . .
blts)
. . . . . . . . . . . . . .
47
. . . . . . . . . . . . . . . .
47
. . . . . . . . . . . . . . . . .
48
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
50
blts
sur
blts)
buts
zcopy
et
46
zaxpy
dans la procdure
gammul
smvp
. . . . . .
50
. . . . . . . . . .
51
. . . . . . . . . .
53
3.12 Procdure
gammul
. . . . . . . .
54
3.13 Procdure
su3mul
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
3.14 Procdure
su3mul
. . . . . . . . . . . . . . . . . . . . . .
55
3.15 Procdure
su3mul
. . . . . . . . . . . . . . . . . . . . . .
56
A.1
A.2
Procdure
A.3
Appels la procdure
A.4
Procdure
A.5
zcopy
. . . . . . . . . . . . . . . . .
72
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
72
zcopy
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
73
gammul
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
73
Procdure
gammul
optimise
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
74
A.6
Procdure
su3mul
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
75
A.7
Appels la procdure
A.8
Procdure
A.9
su3mul
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
75
muldeo
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
76
Procdure
muldeo
optimise
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
77
A.10 Procdure
muldeo
optimise
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
79
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
80
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
82
smvp
su3mul
smvp
. . . . . . . . . . . . . . . . . . . . . . . .
83
. . . . . . . . . . . . . . . . . . . . . . . . . . .
83
disp
. . . . . . . . . . . . . . . . . . . . . . . . .
disp
A.18 Procdure
smvp
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
84
85
85
86
65
A.19 Procdure
main
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
main
A.23 Procdure
. . . . . . . . . . . . . . . . . . . . . .
87
88
88
. . . . . . . . . . . . . . . . . .
88
main
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
90
A.24 Procdure
main
aprs fusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
90
A.25 Procdure
main
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
91
main
A.28 Procdure
main
. . . . . . . . . . . . . . . . . . . . . . . .
92
. . . . . . . . . . . . .
92
blts
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
94
A.29 Procdure
blts
aprs fusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
95
A.30 Procdure
blts
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
96
A.31 Procdure
blts
A.32 Procdure
buts
A.33 Procdure
buts
A.34 Procdure
buts
A.35 Procdure
jacu_buts
. . . . . . . . .
101
A.36 Procdure
jacu_buts
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
102
A.37 Procdure
jacu-buts
. . .
103
A.38 Procdure
blts
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
104
A.39 Procdure
jacld-blts
A.40 Procdure
jacld-blts
A.41 Procdure
jacld-blts
A.42 Procdure
jacld-blts
. . . . . . . . . . . . .
96
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
97
. . . . . . . . . . . .
98
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
100
jacu
et
jacld
buts
et
blts
. . . . . . . .
105
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
107
. . . . . . . .
108
. . . . . . . . . . . . . . . . . . .
109
66
67
1.2
2.1
. . . . . . . . . . . .
24
3.1
41
3.2
47
3.3
Contribution de la gnralisation
49
3.4
3.5
3.6
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
6 lments
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . .
52
57
. . . . . . . . . . . . . . . . . . . . . . . .
59
A.1
71
A.2
. . . . . . . . . . . . . . . . . . . . . . .
71
A.3
. . . . . . . . . . . . . . . . . . . . . . . . . .
72
A.4
72
A.5
72
A.6
. . . . . . . . . . . . . . . . . . . . . . . . .
73
A.7
74
A.8
. . . . . . . . . . . . . . . . . . . . . . .
74
A.9
. . . . . . . . . . . . . . . . . . . . . . . . .
75
78
. . . . . . . . . . . . . . . . .
78
. . . . . . . . . . . . . . . . . . . .
78
DEPoO_int
FU_add.
FU_fadd.
Conit de cache
et de
LQ_FULL.
. . . . . . . . . .
78
80
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
81
81
68
MEM_LAT_fp
MEM_LAT_fp
. . . . . . . . . . . . . . . . . . . . . . . .
dans la procdure
smvp
81
81
. . . . . . . . . . .
82
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
85
MEM_LAT_fp
MEM_LAT_fp
. . . . . . . . . . . . . . . . . . . . . . . .
dans la procdure
smvp
87
. . . . . . . . . . .
87
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
89
89
89
ORDER
(traps)
ORDER
dans la procdure
. . . . . . . . . . . . . . . . . . . . . . . .
main
89
. . . . . . . . . . . . . . .
89
91
ORDER
ORDER
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
dans la procdure
main
91
. . . . . . . . . . . . . . .
91
93
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
93
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
94
94
DEPoO_fp
. . . . . . . . . . . . . . . . . . . . . . . . . . .
94
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
95
95
96
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
DEPoO_fp
. . . . . . . . . . . . . . . . . . . . . . . . . . .
97
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
97
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
99
99
DEPoO_fp
. . . . . . . . . . . . . . . . . . . . . . . . . . .
99
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
101
102
103
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
MEM_LAT_int
. . . . . . . . . . . . . . . . . . . . . . . .
104
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
105
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
106
106
69
DEPoO_fp
. . . . . . . . . . . . . . . . . . . . . . . . . . .
106
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
106
106
107
107
FU_fp
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
108
70
71
Annexe A
absolue).
en valeur absolue (
chacune montrant les anomalies en valeur absolue avant et aprs la transformation prcdente.
!7 210
Optimisation : 232 7! 210 (sec.)
A.1.1
[Analyse]
Itration 1 :
232
(sec.)
DEPoO_int).
Anomalies
/cycle
norme
Anomalies
absolue
[Localisation]
et
zgemm.
72
Procedures
lsame
zaxpy
zgemm
zcopy
DEPoO_int
157 M
137 M
100 M
35 M
DEPoO_int
[Transformation]
Par dnition les programmes de tests de la suite SpecFP2000 ne doivent pas utiliser les
librairies mathmatiques optimises an d'valuer uniquement la performance d'une machine et
de son compilateur. Ici, le problme de dpendances est localis sur quatre procdure appartenant
aux librairies mathmatiques ; nous avons donc choisi d'utiliser celles-ci.
Lors de la validation, nous avons observ une rduction des anomalies de dpendances mais
nous avons galement observ une augmentation de toutes les autres anomalies bien que le temps
d'excution ait diminu.
!7 80
Optimisation : 210 7! 191 (sec.)
A.1.2
Itration 2 :
[Analyse]
210
(sec.)
FU_fp).
Anomalies
/cycle
norme
Anomalies
/cycle
norme
[Localisation]
et
zaxpy.
do i = 1,n
zy(i) = zx(i)
zcopy
La table A.6 montre qu'il faut analyser en priorit les anomalies localises sur la procdure
zcopy.
La gure A.2 montre que cette procdure ne fait aucun calcul. Cette procdure est prin-
A.1.
73
Procedures
zcopy
zgemm
zgemm_small_nn
zaxpy
zgemm_beta
zgemm_smll_cn
gammul
Absolut FU_add
28.8 M
13.0 M
11.8 M
7.0 M
3.4 M
2.9 M
1.3 M
FU_add.
----------------------------------------------called/total
parents
index %time
self descendents called+self
name
index
called/total
children
----------------------------------------------0.00
0.00
2214016156
matmul_ [19]
0.00
0.00
154214016156
wupwise_ [2]
0.64
0.00 9728000214016156
muldeo_ [8]
0.64
0.00 9728000214016156
muldoe_ [7]
12.78
0.00 194560000214016156
gammul_ [6]
[10]
6.7
14.06
0.00 214016156
zcopy_ [10]
----------------------------------------------Fig. A.3 Appels la procdure
zcopy
IF (MODE.EQ.0) THEN
IF (MU.EQ.1) THEN
CALL ZCOPY(12, X, 1, RESULT, 1)
CALL ZAXPY( 3, I, X(10), 1, RESULT( 1), 1)
CALL ZAXPY( 3, I, X( 7), 1, RESULT( 4), 1)
CALL ZAXPY( 3, -I, X( 4), 1, RESULT( 7), 1)
CALL ZAXPY( 3, -I, X( 1), 1, RESULT(10), 1)
ELSE IF (MU.EQ.2) THEN
CALL ZCOPY(12, X, 1, RESULT, 1)
CALL ZAXPY( 3, ONE, X(10), 1, RESULT( 1), 1)
CALL ZAXPY( 3, -ONE, X( 7), 1, RESULT( 4), 1)
CALL ZAXPY( 3, -ONE, X( 4), 1, RESULT( 7), 1)
CALL ZAXPY( 3, ONE, X( 1), 1, RESULT(10), 1)
ELSE IF (MU.EQ.3) THEN
CALL ZCOPY(12, X, 1, RESULT, 1)
CALL ZAXPY( 3, I, X( 7), 1, RESULT( 1), 1)
CALL ZAXPY( 3, -I, X(10), 1, RESULT( 4), 1)
CALL ZAXPY( 3, -I, X( 1), 1, RESULT( 7), 1)
CALL ZAXPY( 3, I, X( 4), 1, RESULT(10), 1)
ELSE IF (MU.EQ.4) THEN
CALL ZCOPY( 6, X,
1, RESULT,
1)
CALL ZCOPY( 6, ZERO, 0, RESULT(7), 1)
CALL ZSCAL( 6, TWO, RESULT, 1)
END IF
ELSE IF (MODE.EQ.1) THEN
...
Fig. A.4 Procdure
gammul
74
gammul
gammul
est reprsente
[Transformation]
La procdure
gammul appelle les procdures zcopy et zaxpy. Or, nous avions galement relev
des problmes d'utilisation des units fonctionnelles dans cette procdure. Nous avons donc choisi
d'optimiser avec de l'expansion de code et du droulage complet appliqu aux procdures
et
zaxpy.
IF (MODE.EQ.0)
IF (MU.EQ.1)
RESULT( 1)
RESULT( 2)
RESULT( 3)
RESULT( 4)
RESULT( 5)
RESULT( 6)
RESULT( 7)
RESULT( 8)
RESULT( 9)
RESULT(10)
RESULT(11)
RESULT(12)
...
gammul
THEN
THEN
= X( 1)
= X( 2)
= X( 3)
= X( 4)
= X( 5)
= X( 6)
= X( 7)
= X( 8)
= X( 9)
= X(10)
= X(11)
= X(12)
+
+
+
+
+
+
+
+
+
+
+
+
zcopy
(I * X(10))
(I * X(11))
(I * X(12))
(I * X( 7))
(I * X( 8))
(I * X( 9))
((-I) * X( 4))
((-I) * X( 5))
((-I) * X( 6))
((-I) * X( 1))
((-I) * X( 2))
((-I) * X( 3))
gammul
optimise
Anomalies
absolue avant
absolue aprs
DEP_fp DEP_int
FU MEM TRAPS
927 M 598 M 626 M 918 M 898 K
737 M 666 M 574 M 942 M 874 K
Anomalies
absolue avant
absolue aprs
[Localisation] Problme
emm_small_nn.
zgemm_small_cn, zgemm
et
zgemm_small_nn
et
zg-
cdures de la librairies optimise, nous ne pouvons pas modier le code. Ces procdures sont
A.1.
75
Procedures
zgemm_small_cn
gammul
zgemm
zgemm_small_nn
zaxpy
muldoe
zgemm_beta
Absolut DEPoO_int
193 M
102 M
99 M
84 M
32 M
25 M
2M
FU_fadd.
SUBROUTINE SU3MUL(U,TRANSU,X,RESULT)
...
CALL ZGEMM(TRANSU, 'NO TRANSPOSE',3,4,3,
.
ONE,U,3,X,3,ZERO,RESULT,3)
RETURN
END
Fig. A.6 Procdure
zgemm
su3mul
su3mul
muldeo
su3mul
(gure A.8).
----------------------------------------------1.52
0.00 58368000/116736000
muldeo_ [8]
1.52
0.00 58368000/116736000
muldoe_ [7]
[15]
1.5
3.04
0.00 116736000
su3mul_ [15]
----------------------------------------------Fig. A.7 Appels la procdure
su3mul
76
DO 100 L=1,N4
LP=MOD(L,N4)+1
DO 100 K=1,N3
KP=MOD(K,N3)+1
DO 100 J=1,N2
JP=MOD(J,N2)+1
DO 100 I=(MOD(J+K+L+1,2)+1),N1,2
IP=MOD(I,N1)+1
CALL GAMMUL(1,0,X(1,(IP+1)/2,J,K,L),AUX1)
CALL SU3MUL(U(1,1,1,I,J,K,L),'N',AUX1,AUX3)
CALL GAMMUL(2,0,X(1,(I+1)/2,JP,K,L),AUX1)
CALL SU3MUL(U(1,1,2,I,J,K,L),'N',AUX1,AUX2)
CALL ZAXPY(12,ONE,AUX2,1,AUX3,1)
CALL GAMMUL(3,0,X(1,(I+1)/2,J,KP,L),AUX1)
CALL SU3MUL(U(1,1,3,I,J,K,L),'N',AUX1,AUX2)
CALL ZAXPY(12,ONE,AUX2,1,AUX3,1)
CALL GAMMUL(4,0,X(1,(I+1)/2,J,K,LP),AUX1)
CALL SU3MUL(U(1,1,4,I,J,K,L),'N',AUX1,AUX2)
CALL ZAXPY(12,ONE,AUX2,1,AUX3,1)
100
CALL ZCOPY(12,AUX3,1,RESULT(1,(I+1)/2,J,K,L),1)
CONTINUE
Fig. A.8 Procdure
muldeo
A.1.
77
[Transformation]
zgemm,
la procdure
gammul
a des pro-
blmes de dpendances sur des oprations arithmtiques entires (voir table A.9).
...
DO 100 I=(MOD(J+K+L+1,2)+1),N1,2
IP=MOD(I,N1)+1
IM=I-1
IF(IM.EQ.0) IM=N1
C
CALL GAMMUL(1,0,X(1,(IP+1)/2,J,K,L),AUXP1)
AUXP1( 1) = X( 1,(IP+1)/2,J,K,L) + (IMA * X(10,(IP+1)/2,J,K,L))
AUXP1( 2) = X( 2,(IP+1)/2,J,K,L) + (IMA * X(11,(IP+1)/2,J,K,L))
AUXP1( 3) = X( 3,(IP+1)/2,J,K,L) + (IMA * X(12,(IP+1)/2,J,K,L))
AUXP1( 4) = X( 4,(IP+1)/2,J,K,L) + (IMA * X( 7,(IP+1)/2,J,K,L))
...
AUXP1(12) = X(12,(IP+1)/2,J,K,L) + ((-IMA) * X( 3,(IP+1)/2,J,K,L))
C
CALL SU3MUL(U(1,1,1,I,J,K,L),'N',AUXP1,AUXP3)
AUXP3( 1) = U(1,1,1,I,J,K,L) * AUXP1( 1)
%
+ U(1,2,1,I,J,K,L) * AUXP1( 2)
%
+ U(1,3,1,I,J,K,L) * AUXP1( 3)
AUXP3( 2) = U(2,1,1,I,J,K,L) * AUXP1( 1)
%
+ U(2,2,1,I,J,K,L) * AUXP1( 2)
%
+ U(2,3,1,I,J,K,L) * AUXP1( 3)
AUXP3( 3) = U(3,1,1,I,J,K,L) * AUXP1( 1)
%
+ U(3,2,1,I,J,K,L) * AUXP1( 2)
%
+ U(3,3,1,I,J,K,L) * AUXP1( 3)
AUXP3( 4) = U(1,1,1,I,J,K,L) * AUXP1( 4)
%
+ U(1,2,1,I,J,K,L) * AUXP1( 5)
%
+ U(1,3,1,I,J,K,L) * AUXP1( 6)
...
AUXP3(12) = U(3,1,1,I,J,K,L) * AUXP1(10)
%
+ U(3,2,1,I,J,K,L) * AUXP1(11)
%
+ U(3,3,1,I,J,K,L) * AUXP1(12)
C
CALL GAMMUL(2,0,X(1,(I+1)/2,JP,K,L),AUX1)
...
muldeo
optimise
Nous avons choisi d'utiliser l'expansion de code et le droulage de boucle. Les procdures
zgemm
et
su3mul
zgemm
gammul
prcdemment
78
Cache conict)
LSQ/MAF full).
Anomalies
absolue avant
absolue-aprs
et de dbor-
DEP_fp DEP_int
FU MEM TRAPS
737 M 666 M 574 M 942 M 874 K
899 M 869 M 747 M 2079 M 2781 K
Anomalies
Absolue
Anomalies
Absolue
MEM_TRAPS
CFT ORDER MAF_CFT MAF_FULL SQ_FULL LQ_FULL
2733 K 1058 K 199 K
195 K
0K
323 K
942 K
Tab. A.12 Anomalies mmoires spciques de wupwise
[Localisation]
Procedures
zcopy
muldeo
wupwise
gammul
zgemm_small_nn
[Transformation]
muldeo.
Conit de cache
et de
LQ_FULL.
(Instruction scheduling ).
A.1.
...
DO 100 I=(MOD(J+K+L+1,2)+1),N1,2
IP=MOD(I,N1)+1
IM=I-1
IF(IM.EQ.0) IM=N1
C
CALL GAMMUL(1,0,X(1,(IP+1)/2,J,K,L),AUXP1)
AUXP1_1 = X( 1,(IP+1)/2,J,K,L) + (IMA * X(10,(IP+1)/2,J,K,L))
AUXP1_2 = X( 2,(IP+1)/2,J,K,L) + (IMA * X(11,(IP+1)/2,J,K,L))
AUXP1_3 = X( 3,(IP+1)/2,J,K,L) + (IMA * X(12,(IP+1)/2,J,K,L))
AUXP1_4 = X( 4,(IP+1)/2,J,K,L) + (IMA * X( 7,(IP+1)/2,J,K,L))
...
AUXP1_12 = X(12,(IP+1)/2,J,K,L) + ((-IMA) * X( 3,(IP+1)/2,J,K,L))
C
CALL SU3MUL(U(1,1,1,I,J,K,L),'N',AUXP1,AUXP3)
AUXP3_1 = U(1,1,1,I,J,K,L) * AUXP1_1
%
+ U(1,2,1,I,J,K,L) * AUXP1_2
%
+ U(1,3,1,I,J,K,L) * AUXP1_3
RESULT( 1,(I+1)/2,J,K,L) = AUXP3_1
AUXP3_4 = U(1,1,1,I,J,K,L) * AUXP1_4
%
+ U(1,2,1,I,J,K,L) * AUXP1_5
%
+ U(1,3,1,I,J,K,L) * AUXP1_6
RESULT( 4,(I+1)/2,J,K,L) = AUXP3_4
AUXP3_7 = U(1,1,1,I,J,K,L) * AUXP1_7
%
+ U(1,2,1,I,J,K,L) * AUXP1_8
%
+ U(1,3,1,I,J,K,L) * AUXP1_9
RESULT( 7,(I+1)/2,J,K,L) = AUXP3_7
AUXP3_10 = U(1,1,1,I,J,K,L) * AUXP1_10
%
+ U(1,2,1,I,J,K,L) * AUXP1_11
%
+ U(1,3,1,I,J,K,L) * AUXP1_12
RESULT(10,(I+1)/2,J,K,L) = AUXP3_10
AUXP3_2 = U(2,1,1,I,J,K,L) * AUXP1_1
%
+ U(2,2,1,I,J,K,L) * AUXP1_2
%
+ U(2,3,1,I,J,K,L) * AUXP1_3
RESULT( 2,(I+1)/2,J,K,L) = AUXP3_2
AUXP3_5 = U(2,1,1,I,J,K,L) * AUXP1_4
%
+ U(2,2,1,I,J,K,L) * AUXP1_5
%
+ U(2,3,1,I,J,K,L) * AUXP1_6
RESULT( 5,(I+1)/2,J,K,L) = AUXP3_5
...
AUXP3_12 = U(3,1,1,I,J,K,L) * AUXP1_10
%
+ U(3,2,1,I,J,K,L) * AUXP1_11
%
+ U(3,3,1,I,J,K,L) * AUXP1_12
RESULT(12,(I+1)/2,J,K,L) = AUXP3_12
...
muldeo
optimise
79
80
----------------------------------------------1.52
0.00 58368000/116736000
muldeo_ [8]
1.52
0.00 58368000/116736000
muldoe_ [7]
[15]
1.5
3.04
0.00 116736000
su3mul_ [15]
----------------------------------------------Fig. A.11 Appels la procdure
[Localisation]
su3mul
[Transformation]
muldoe.
Anomalies
Absolue-avant
Absolue-aprs
DEP_fp DEP_int
FU MEM TRAPS
1063 M 619 M 722 M 1566 M 2460 K
1111 M 509 M 715 M 1745 M 2327 K
Nous avons arrt l'optimisation aprs avoir rduit le temps d'excution de wupwise de 232
80 secondes, soit aprs avoir obtenu un gain de 2,90.
A.2.
81
!7 116
Optimisation : 232 7! 171 (sec.)
A.2.1
[Analyse]
Itration 1 :
290
(sec.)
MEM_LAT_fp).
Les anomalies mettent en vidence un problme de dpendances sur des oprations mmoires ottantes (tables A.15 et A.16). La normalisation de l'anomalie de latence mmoire leve
(table A.15) permet d'identier un problme de latence et non un problme de bande passante
(voir l'arbre de dcisions gure 3.2).
Anomalies
/cycle
norme
1.12
Anomalies
absolue
Anomalies
absolue
[Localisation]
smvp.
t10)
car le tableau
Procedure
smvp
main
phi1
phi0
phi2
A utilisent
des registres
w.
MEM_LAT_fp
2690 M
781 M
32 M
26 M
22 M
MEM_LAT_fp
82
Lignes sources
1212
1208
1207
1213
1214
1209
1199
1200
1201
1219
Tab. A.19 Localit des anomalies
MEM_LAT_fp
680 M
554 M
430 M
316 M
302 M
245 M
112 M
111 M
109 M
5M
MEM_LAT_fp
dans la procdure
smvp
smvp
A.2.
83
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
1207]
1207]
1208]
1209]
1208]
1212]
1207]
1208]
1207]
1209]
1207]
1207]
1207]
1212]
1212]
1212]
1212]
1213]
1214]
1214]
1212]
1213]
1207]
1207]
0x120011040:
0x120011044:
0x120011048:
0x12001104c:
0x120011050:
0x120011054:
0x120011058:
0x12001105c:
0x120011060:
0x120011064:
0x120011068:
0x12001106c:
0x120011070:
0x120011074:
0x120011078:
0x12001107c:
0x120011080:
0x120011084:
0x120011088:
0x12001108c:
0x120011090:
0x120011094:
0x120011098:
0x12001109c:
8f440000
8d440008
8f780000
8fc70000
8e380008
8c7b0000
8de40010
8e580010
43340644
8c870008
a4840000
8cc40008
8ce40010
5b40145c
5b6b145d
2ffe0000
5bd0144d
59401453
5a4b1442
2ffe0000
5b9d141c
5a2b145d
5946144a
2ffe0000
ldt
ldt
ldt
ldt
ldt
ldt
ldt
ldt
s8addq
ldt
ldq
ldt
ldt
mult
mult
ldq_u
mult
mult
mult
ldq_u
addt
mult
mult
ldq_u
$f26, 0(t3)
$f10, 8(t3)
$f27, 0(t10)
$f30, 0(t6)
$f17, 8(t10)
$f3, 0(t12)
$f15, 16(t3)
$f18, 16(t10)
t11, a4, t3
$f4, 8(t6)
t3, 0(t3)
$f6, 8(t3)
$f7, 16(t3)
$f26,$f0,$f28
$f27,$f11,$f29
zero, 0(sp)
$f30,$f16,$f13
$f10,$f0,$f19
$f18,$f11,$f2
zero, 0(sp)
$f28,$f29,$f28
$f17,$f11,$f29
$f10,$f6,$f10
zero, 0(sp)
smvp
84
disp
A.2.
85
[Transformation]
smvp.
la
Ainsi, les lignes de cache contiennent des donnes utiles (et non des pointeurs).
Anomalies
absolue
absolue
disp
DEP_fp DEP_int
FU MEM TRAPS
6378 M 2038 M 1781 M 4174 M 2334 K
2465 M 1376 M 942 M 1985 M 1086 K
86
}
w[i*3+0] += sum0;
w[i*3+1] += sum1;
w[i*3+2] += sum2;
smvp
A.2.
87
[Localisation]
main.
MEM_LAT_fp
866 M
654 M
34 M
30 M
25 M
Procedure
smvp
main
phi1
phi0
phi2
Lignes sources
477
499
506
479
498
Tab. A.22 Localit des anomalies
MEM_LAT_fp
MEM_LAT_fp
246 M
142 M
54 M
45 M
42 M
MEM_LAT_fp
dans la procdure
smvp
[Transformation]
main
(Data-layout optimization ).
Nous avons modi l'allocation mmoire des tableaux
montre le code modi de l'allocation du tableau
M.
88
/* Mass matrix */
M = (double **) malloc(ARCHnodes * sizeof(double *));
if (M == (double **) NULL) {
fprintf(stderr, "malloc failed for M");
fflush(stderr);
exit(0);
}
for (i = 0; i < ARCHnodes; i++) {
M[i] = (double *) malloc(3 * sizeof(double));
if (M[i] == (double *) NULL) {
fprintf(stderr, "malloc failed for M[%d]",i);
fflush(stderr);
exit(0);
}
}
Fig. A.20 Allocation mmoire du tableau
main
A.2.
89
Anomalies
absolue
absolue
DEP_fp DEP_int
FU MEM TRAPS
2465 M 1376 M 942 M 1985 M 1086 K
2222 M 1235 M 932 M 1769 M 1536 K
Anomalies
absolue
absolue
Anomalies
absolue
absolue
[Localisation]
main
mis.
Les oprations de lecture et d'criture d'un lment du tableau
dans l'ordre par le processus. Le corps du nid de boucle
i,j
disp
ces oprations se retrouvent simultanment en cours d'excution dans le processeur qui gnre
ORDER Traps).
Procedure
main
phi2
phi1
phi0
smvp
MEM_TRAPS ORDER
1340 K 1020 K
35 K
34 K
22 K
20 K
14 K
14 K
59 K
0K
Lignes sources
source line
519
512
511
506
514
ORDER
(traps)
ORDER
MEM_TRAPS ORDER_TRAPS
415 K
415 K
218 K
209 K
129 K
128 K
143 K
110 K
59 K
59 K
ORDER
dans la procdure
main
90
[Transformation]
main
main
aprs fusion
[Localisation]
prcdement optimis.
A.2.
91
Anomalies
absolue
absolue
Des oprations de lecture sur une mme adresse s'excutent simultanment et gnrent des
ORDER Traps).
et
phi2.
ORDER
997 K
127 K
18 K
16 K
0K
Procedure
main
phi2
phi1
phi0
smvp
source line
505
479
502
475
phi0, phi1
ORDER
ORDER_TRAPS
953 K
20 K
16 K
3K
ORDER
dans la procdure
main
505:
disp[disptplus][i*3+j] += 2.0 * M[i*3+j] * disp[dispt][i*3+j] (M[i*3+j] - Exc.dt / 2.0 * C[i*3+j]) * disp[disptminus][i*3+j] Exc.dt * Exc.dt * (M23[i*3+j] * phi2(time) / 2.0 +
C23[i*3+j] * phi1(time) / 2.0 +
V23[i*3+j] * phi0(time) / 2.0);
disp[disptplus][i*3+j] = disp[disptplus][i*3+j] /
(M[i*3+j] + Exc.dt / 2.0 * C[i*3+j]);
vel[i*3+j] = 0.5 / Exc.dt * (disp[disptplus][i*3+j] disp[disptminus][i*3+j]);
}
Fig. A.25 Procdure
main
avons fac-
92
[quake.c:
[quake.c:
[quake.c:
...
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
...
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
[quake.c:
491] 0x12000d910:
491] 0x12000d914:
503] 0x12000d918:
a71d83d0
8c290000
5ca50410
ldq
ldt
cpys
t10, -31792(gp)
$f1, 0(s0)
$f5,$f5,$f16
504]
504]
505]
505]
503]
505]
501]
513]
520]
487]
487]
520]
503]
0x12000d9c0:
0x12000d9c4:
0x12000d9c8:
0x12000d9cc:
0x12000d9d0:
0x12000d9d4:
0x12000d9d8:
0x12000d9dc:
0x12000d9e0:
0x12000d9e4:
0x12000d9e8:
0x12000d9ec:
0x12000d9f0:
58601443
9c7e0460
8c6dfff8
d34003a0
8c3e0460
58601440
8d5e0458
a43d83d0
a47d83d0
a0be0440
a4fe0448
a61e0450
59211401
mult
stt
ldt
bsr
ldt
mult
ldt
ldq
ldq
ldl
ldq
ldq
addt
$f3,$f0,$f3
$f3, 1120(sp)
$f3, -8(s4)
ra, 0x12000e850(zero)
$f1, 1120(sp)
$f3,$f0,$f0
$f10, 1112(sp)
t0, -31792(gp)
t2, -31792(gp)
t4, 1088(sp)
t6, 1096(sp)
a0, 1104(sp)
$f9,$f1,$f1
520]
521]
520]
520]
520]
520]
487]
0x12000da58:
0x12000da5c:
0x12000da60:
0x12000da64:
0x12000da68:
0x12000da6c:
0x12000da70:
8d830000
8daafff8
584c146c
580d1420
59801440
9c10fff8
f4bfffa7
ldt
ldt
divt
subt
mult
stt
bne
$f12, 0(t2)
$f13, -8(s1)
$f2,$f12,$f12
$f0,$f13,$f0
$f12,$f0,$f0
$f0, -8(a0)
t4, 0x12000d910
main
main
main.
a diminu dans
A.2.
Anomalies
absolue
absolue
Anomalies
absolue
absolue
DEP_fp DEP_int
FU MEM TRAPS
2302 M 1270 M 901 M 1752 M 1437 K
2240 M 1007 M 871 M 1966 M 576 K
aprs avoir rduit le temps d'excution de 290 116 secondes, soit aprs un gain de 2,50.
93
94
!7 294
Optimisation : 312 7! 305 (sec.)
A.3.1
Itration 1 :
[Analyse]
312
(sec.)
Anomalies
/cycle
norme
DEPoO_fp).
Anomalies
/cycle
[Localisation]
Procedures
blts
buts
rhs
jacld
blts.
DEPoO_fp
0.47
0.23
0.12
0.06
do k = 2, nz-1
do j = 2, ny-1
do i = 2, nx-1
do m = 1, 5
do l = 1, 5
v( m, i, j, k )
563:
- omega * (
564:
+
565:
+
= v( m, i, j, k
ldz( m, l, i, j,
ldy( m, l, i, j,
ldx( m, l, i, j,
DEPoO_fp
)
k ) * v( l, i, j, k-1 )
k ) * v( l, i, j-1, k )
k ) * v( l, i-1, j, k ) )
blts
Le problme est localis sur les lignes 563, 564 et 565. En eet, l'opration de multiplication
par
omega
doit attendre les excutions de 2 additions qui, elles-mmes, doivent attendre les
excutions de 3 multiplications.
[Transformation]
Transfo. : Privatization ).
Nous avons privatis les calculs intermdiaires pour pouvoir scinder le nid de boucle (m,l).
A.3.
95
do k = 2, nz-1
do j = 2, ny-1
do m = 1, 5
do l = 1, 5
tmpldx(m,l) = ldx( m, l, 2, j, k )
* v( l, 2-1, j, k )
tmpldy(m,l) = ldy( m, l, 2, j, k )
* v( l, 2, j-1, k )
tmpldz(m,l) = ldz( m, l, 2, j, k )
* v( l, 2, j, k-1 )
do i = 2, nx-1
do m = 1, 5
do l = 1, 5
v( m, i, j, k ) = v( m, i, j, k
- omega * ( tmpldz(m,l)
+ tmpldy(m,l)
+ tmpldx(m,l) )
...
do m = 1, 5
do l = 1,5
tmpldx(m,l) = ldx( m, l, i+1, j,
* v( l, i-1+1, j, k )
tmpldy(m,l) = ldy( m, l, i+1, j,
* v( l, i+1, j-1, k )
tmpldz(m,l) = ldz( m, l, i+1, j,
* v( l, i+1, j, k-1 )
k )
k )
k )
blts
aprs fusion
Anomalies
/cylce
/cycle
Anomalies
/cycle
/cycle
[Localisation]
blts.
Le problme est localis sur les lignes 646, 648 et 650. Les oprations d'critures ottantes
sont dans la queue de lancement des instructions entires. Avec l'optimisation prcdente, nous
avons remplac les dpendances entre des oprations arithmtiques par des dpendances entre
des oprations arithmtiques et des oprations d'critures.
96
do k = 2, nz-1
do j = 2, ny-1
do i = 2, nx-1
do m = 1, 5
do l = 1, 5
v( m, i, j, k ) = v( m, i, j, k
- omega * ( tmpldz(m,l)
+ tmpldy(m,l)
+ tmpldx(m,l) )
...
do m = 1, 5
do l = 1,5
646:
tmpldx(m,l) = ldx( m, l, i+1, j,
* v( l, i-1+1, j, k )
648:
tmpldy(m,l) = ldy( m, l, i+1, j,
* v( l, i+1, j-1, k )
650:
tmpldz(m,l) = ldz( m, l, i+1, j,
* v( l, i+1, j, k-1 )
k )
k )
k )
[Transformation]
blts
Nous avons modi la ssion de boucle pour rechercher un compromis entre des deux problmes (
DEPoO_fp
et
DEPoO_int).
do k = 2, nz-1
do j = 2, ny-1
do i = 2, nx-1
do m = 1, 5
do l = 1, 5
v( m, i, j, k ) = v( m, i, j, k )
- omega * tmpldxyz(m,l)
...
do m = 1, 5
do l = 1,5
tmpldx = ldx( m, l, i+1, j, k )
* v( l, i-1+1, j, k )
tmpldy = ldy( m, l, i+1, j, k )
* v( l, i+1, j-1, k )
tmpldz = ldz( m, l, i+1, j, k )
* v( l, i+1, j, k-1 )
tmpldxyz(m,l) = tmpldx + tmpldy + tmpldz
Anomalies
/cycle
/cycle
blts
A.3.
97
[Localisation]
Procedures
blts
buts
rhs
jacld
buts.
DEPoO_fp
0.47
0.23
0.12
0.06
DEPoO_fp
do k = nz-1, 2, -1
do j = ny-1, 2, -1
do i = nx-1, 2, -1
do m = 1, 5
tv( m ) = 0.0d+00
do l = 1, 5
tv( m ) = tv( m ) +
omega * ( udz( m, l, i, j, k ) * v( l, i, j, k+1 )
+ udy( m, l, i, j, k ) * v( l, i, j+1, k )
+ udx( m, l, i, j, k ) * v( l, i+1, j, k ) )
c***diagonal block inversion
...
c***back substitution
...
[Transformation]
buts
Anomalies
/cycle
/cycle
98
do k = nz-1, 2, -1
do j = ny-1, 2, -1
do m = 1, 5
do l = 1, 5
tmpldx = udx( m, l, nx-1, j, k )
* v( l, nx-1+1, j, k )
tmpldy = udy( m, l, nx-1, j, k )
* v( l, nx-1, j+1, k )
tmpldz = udz( m, l, nx-1, j, k )
* v( l, nx-1, j, k+1 )
tldxyz(m,l) = tmpldx + tmpldy + tmpldz
do i = nx-1, 2, -1
do m = 1, 5
tv( m ) = 0.0d+00
do l = 1, 5
tv( m ) = tv( m ) +
omega * ( tldxyz(m,l) )
c***diagonal block inversion
...
c***back substitution
...
do m = 1, 5
do l = 1,5
tmpldx = udx( m, l, i-1, j, k )
* v( l, i+1-1, j, k )
tmpldy = udy( m, l, i-1, j, k )
* v( l, i-1, j+1, k )
tmpldz = udz( m, l, i-1, j, k )
* v( l, i-1, j, k+1 )
tldxyz(m,l) = tmpldx
+ tmpldy
+ tmpldz
buts
A.3.
99
!7 211
Optimisation : 294 7! 289 (sec.)
A.3.2
Itration 2 :
[Analyse]
294
(sec.)
MEM_LAT_fp).
Anomalies
/cycle
norme
Anomalies
/cycle
[Localisation]
buts
et
blts.
Le problme de latence mmoire est localis sur les oprations de lectures des tableaux
udy
et
udz.
Procedure
buts
blts
rhs
jacu
Procedures
buts
blts
rhs
jacld
DEP_fp
DEPoM_fp
0.38
0.41
0.33
0.35
0.10
0.09
0.08
0.06
MEM_LAT MEM_LAT_fp
0.40
0.41
0.32
0.31
0.10
0.10
0.08
0.08
[Annulation]
udx,
DEPoO_fp
100
do k = nz-1, 2, -1
do j = ny-1, 2, -1
do m = 1, 5
do l = 1, 5
tmpldx = udx( m, l, nx-1, j, k )
* v( l, nx-1+1, j, k )
tmpldy = udy( m, l, nx-1, j, k )
* v( l, nx-1, j+1, k )
tmpldz = udz( m, l, nx-1, j, k )
* v( l, nx-1, j, k+1 )
tldxyz(m,l) = tmpldx + tmpldy + tmpldz
do i = nx-1, 2, -1
do m = 1, 5
tv( m ) = 0.0d+00
do l = 1, 5
tv( m ) = tv( m ) +
omega * ( tldxyz(m,l) )
c***diagonal block inversion
...
c***back substitution
...
do m = 1, 5
do l = 1,5
(801) tmpldx = udx( m, l, i-1, j, k )
* v( l, i+1-1, j, k )
(803) tmpldy = udy( m, l, i-1, j, k )
* v( l, i-1, j+1, k )
(805) tmpldz = udz( m, l, i-1, j, k )
* v( l, i-1, j, k+1 )
tldxyz(m,l) = tmpldx
+ tmpldy
+ tmpldz
buts
A.3.
101
[Transformation]
Les tableaux n'ont aucun potentiel de rutilisation dans le nid de boucles. Nous avons cherch
la partie de programme qui produit ces tableaux pour essayer de rapprocher les producteurs des
consommateurs. Nous avons donc fusionn les procdures
boucles (k,j,i).
jacu_buts
jacu
et
buts
* rsd( l, i, j, k+1 )
* rsd( l, i, j+1, k )
* rsd( l, i+1, j, k ) )
k ) - tv( m )
jacu
et
buts
[Localisation]
jacu-buts.
Problme localis sur la ligne 2425 : les oprations d'critures dpendent des oprations de
102
Anomalies
jacu
buts
jacu_buts
augmentation
code ).
* rsd( l, i, j, k+1 )
* rsd( l, i, j+1, k )
* rsd( l, i+1, j, k ) )
k ) - tv( m )
[Transformation]
jacu_buts
tv,
a,b
et
c.
A.3.
103
...
block sub-diagonal
= =
=
=
=
1 )
a11
a12
a13
a14
a15
dt * tx1 * dx1
dt * tx2
0.0d+00
0.0d+00
0.0d+00
= tv( 1 ) + 1.0d+00 * (
* rsd(1, i+1, j, k ) +
* rsd(2, i+1, j, k ) +
* rsd(3, i+1, j, k ) +
* rsd(4, i+1, j, k ) +
* rsd(5, i+1, j, k ) )
a21
a22
a23
a24
a25
tv(
= dt
= dt
= dt
= dt
= dt
2 ) =
a21 *
a22 *
a23 *
a24 *
a25 *
b11
b12
b13
b14
b15
tv(
= - dt * ty1 * dy1
=
0.0d+00
= dt * ty2
=
0.0d+00
=
0.0d+00
1 ) = tv( 1 ) + 1.0d+00 * (
b11 * rsd(1, i, j+1, k ) +
b12 * rsd(2, i, j+1, k ) +
b13 * rsd(3, i, j+1, k ) +
b14 * rsd(4, i, j+1, k ) +
b15 * rsd(5, i, j+1, k ) )
...
Fig. A.37 Procdure
* tx2 * ...
* tx2 * ...
* tx2 * ...
* tx2 * ...
* tx2 * c2
tv( 2 ) + 1.0d+00 * (
rsd(1, i+1, j, k ) +
rsd(2, i+1, j, k ) +
rsd(3, i+1, j, k ) +
rsd(4, i+1, j, k ) +
rsd(5, i+1, j, k ) )
jacu-buts
Anomalies
/cycle
/cycle
[Localisation]
blts.
104
Procedures
jacu-buts
blts
rhs
jacld
MEM MEM_int
0.35
0.36
0.36
0.62
0.15
0.02
0.09
0.00
do m = 1, 5
do l = 1,5
565
tmpldx(m,l)
* v( l,
567
tmpldy(m,l)
* v( l,
569
tmpldz(m,l)
* v( l,
= ldx( m,
2-1, j, k
= ldy( m,
2, j-1, k
= ldz( m,
2, j, k-1
MEM_LAT_int
l, 2, j, k )
)
l, 2, j, k )
)
l, 2, j, k )
)
blts
A.3.
105
[Transformation]
Loop fusion ). Plus, promotion de scalaires et rordonnancement d'instructions (Enable transformations : full unrolling, computation reordering ).
k-1
k-1
k-1
k-1
k-1
)
)
)
)
)
+
+
+
+
)
)
)
)
)
)
c***forward elimination
do m = 1, 5
do l = 1, 5
tmat( m, l ) = d( m, l, i, j, k )
end do
end do
Fig. A.39 Procdure
jacld-blts
Anomalies
/cycle
/cycle
jacld
et
blts
106
!7 143
Optimisation : 211 7! 207 (sec.)
A.3.3
[Analyse]
Itration 3 :
211
(sec.)
Anomalies
/cycle
norme
DEPoO_fp).
Anomalies
/cycle
[Localisation]
Procedures
jacld
jacu
rhs
l2norm
jacld-blts
jacu-buts.
DEPoO_fp
0.45
0.40
0.11
0.02
[Transformation]
et
DEPoO_fp
[Analyse]
FU_fp).
Anomalies
/cycle
/cycle
Anomalies
/cycle
/cycle
[Localisation]
jacld-blts.
Ce problme a t gnr par l'optimisation prcdente qui a cr des nids de boucles ayant
un unique type d'opration.
A.3.
107
c***forward elimination
do m = 1, 5
do l = 1, 5
tmat( m, l ) = d( m, l, i, j, k )
end do
end do
do ip = 1, 4
tmp1 = 1.0d+00 / tmat( ip, ip )
do m = ip+1, 5
tmp = tmp1 * tmat( m, ip )
do l = ip+1, 5
tmat( m, l ) = tmat( m, l )
2233:
- tmp * tmat( ip, l )
end do
rsd( m, i, j, k ) = rsd( m, i, j, k )
2238:
- rsd( ip, i, j, k ) * tmp
end do
end do
c***back substitution
do m = 5, 1, -1
do l = m+1, 5
rsd( m, i, j, k ) = rsd( m, i, j, k )
2251:
- tmat( m, l ) * rsd( l, i, j, k )
end do
rsd( m, i, j, k ) = rsd( m, i, j, k )
/ tmat( m, m )
end do
Fig. A.40 Procdure
604R-Anomalies
ssor
rhs
l2norm
jacu
jacld
FU_fadd FU_fmul
7.8M
1.0M
3.9M
25.9M
0.1M
0.9M
37.5M
50.8M
28.5M
34.3M
jacld-blts
605-Anomalies
ssor
rhs
l2norm
jacu
jacld
FU_fadd FU_fmul
6.4M
1.2M
3.8M
26.9M
0.1M
0.9M
37.4M
50.7M
40.6M
55.4M
Tab. A.54 Augmentation des anomalies d'utilisation des units fonctionnelles ottantes
[Transformation]
Droulage complet.
Anomalies
/cycle
/cycle
108
c***forward elimination
do m = 1, 5
do l = 1, 5
tmat( m, l ) = d( m, l, i, j, k )
end do
end do
do ip = 1, 4
tmp1 = 1.0d+00 / tmat( ip, ip )
do m = ip+1, 5
tmp = tmp1 * tmat( m, ip )
do l = ip+1, 5
tmat( m, l ) = tmat( m, l )
2233:
- tmp * tmat( ip, l )
end do
rsd( m, i, j, k ) = rsd( m, i, j, k )
2238:
- rsd( ip, i, j, k ) * tmp
end do
end do
c***back substitution
do m = 5, 1, -1
do l = m+1, 5
2249:
ttrsd(m,l) = tmat( m, l ) * rsd( l, i, j, k )
end do
end do
do m = 5, 1, -1
do l = m+1, 5
rsd( m, i, j, k ) = rsd( m, i, j, k )
2258:
- ttrsd(m,l)
end do
rsd( m, i, j, k ) = rsd( m, i, j, k )
2264:
/ tmat( m, m )
end do
end do
Fig. A.41 Procdure
[Localisation]
jacld-blts
Procdures
jacu-buts
rhs
jacld-blts
ssor
l2norm
FU_fadd FU_fmul
0.56
0.06
0.28
0.10
0.00
0.51
0.27
0.19
0.01
0.01
[Transformation]
jacu-buts.
FU_fp
Le programme de la procdure
jacu-buts
jacld-blts
A.3.
C FULL UNROLLING
C ### ip = 1 ###
C ### m = 2 ###
C ### l = 2 ###
C ### l = 3 ###
tmat( 2, 3 ) = tmat( 2, 3 )
- tmp * tmat( 1, 3 )
C ### l = 4 ###
C ### l = 5 ###
C ### m = 3 ###
C ### m = 5 ###
C ### ip = 2 ###
tmat( 2, 4 ) = tmat( 2, 4 )
- tmp * tmat( 1, 4 )
tmat( 2, 5 ) = tmat( 2, 5 )
- tmp * tmat( 1, 5 )
rsd( 2, i, j, k ) = rsd( 2, i, j, k )
- rsd( 1, i, j, k ) * tmp
tmp = tmp1 * tmat( 3, 1 )
...
...
...
c***back substitution
C FULL UNROLLING
C ### m = 5 ###
rsd( 5, i, j, k ) = rsd( 5, i, j, k )
/ tmat( 5, 5 )
C ### m = 4 ###
...
Fig. A.42 Procdure
jacld-blts
109
110
Bibliographie
111
Bibliographie
[AbToAn00]
Jaume Abella and Sid Ahmed Ali Touati and Alan Anderson and
Carlos Ciuraneta and Josep M. Codina and Min Dai and Christine Eisenbeis and Grigori Fursin and Anotio Gonzlez and Josep Llosa and Michael O'Boyle and Andry Randrianatovina and
Jesus Snchez and Olivier Temam and Xavier Vera and Gragory
Watts.
th
and control of the 16 IMACS World Congress, 2000.
[AhSeUl86]
Compi-
Addison-Wesley, Reading,
pilation sequences
Architectures
Putting Polyhedral Loop Transformation to Work
Randy Allen and Ken Kennedy.
[BaCoGi03]
. In 10th
Dy-
. In Proceedings of
Compi-
. ACM Computing
Co-
112
[Ca96]
BIBLIOGRAPHIE
Steve Carr.
tectures and Compilation Techniques (PACT '96), page 238. IEEE Computer
Society, 1996.
[CaFeHu95]
In Pro-
rated sets
[ChPaHaLe01]
SIGPLAN 1995 conference on Programming language design and implementation, pages 279290. ACM Press, 1995.
[CoLo99]
. In Proceedings of
J. Dean and J.E. Hicks and C.A. Waldspurger and W.E. Weihl
and G.Z. Chrysos.
In In Proceedings of the
th
30 International Symposium on Microarchitecture, NC, December 1997.
[Epic]
. Microproces-
Harsh Sharangpani.
[GhMaMa99]
Cache miss equations : a compiler framework for analyzing and tuning memory behavior
Ecient instruction
scheduling for a pipelined architecture
Somnath
Ghosh
and
Margaret
Martonosi
and
Sharad
Malik.
1999.
[GiMu86]
113
BIBLIOGRAPHIE
[IPF2]
Intel Itanium2 Processor Reference Manual for Software Development and Optimization
.
http
://developer.intel.com/design/itan-
ium2/manuals.
[Kap]
KAP C/OpenMP for Tru64 UNIX and KAP DEC Fortran for Digital UNIX
Fast greedy weighted fusion
. http ://www.hp.com/techsevers/software/kap.html.
[Ke00]
Ken Kennedy.
2003.
[KiKnOB00]
[KKGO00]
Prasad Kulkarni and Stephen Hines and Jason Hiser and David
Prasad
Kulkarni
and
Wankang
Zhao
and
Hwashin
Moon
and
Finding eective
Kyunghwan Cho and David Whalley and Jack Davidson and Mark
conference on Language, compiler, and tool for embedded systems, pages 1223.
ACM Press, 2003.
[LaRoWo91]
. In
A quantitative analysis
114
[MiCaFe97]
BIBLIOGRAPHIE
teractions
Karin Hogstedt.
1997.
[MoBo01]
[NaJuLa94]
. http ://oprole.sourceforge.net.
. http ://ipf-orc.sourceforge.net.
. http ://www.hpl.hp.com/research/linux/perfmon.
Shlomit S. Pinter.
Tiling Algorithms
A Comparison of Compiler
superscalar processors
James
E. Smith and
Gurindar
bers.jcom.home.ne.jp/kgoto.
S.
Proceedings
Sohi.
The microarchiture of
of IEEE, 1995.
http
://mem-
115
BIBLIOGRAPHIE
[SrLe98]
To copy or not to
copy : a compile-time technique for assessing when data copying
should be used to eliminate cache conicts
O. Temam and E. D. Granston and W. Jalby.
ration
ADAPT : Automated
De-Coupled Adaptive Program Transformation
Michael J. Voss and Rudolf Eigenmann.
. In Proceedings of the
[VoEi01]
http
://www.intel.com/soft-
ware/products/vtune.
[Wa02]
Gregory Watts.
. PH.D. Thesis,
2002.
[We97]
Volker Weispfenning.
gorithm
ming language design and implementation, pages 3044. ACM Press, 1991.
116
[ZhCaWh02]
BIBLIOGRAPHIE
Wankang Zhao and Baosheng Cai and David Whalley and Mark
W. Bailey and Robert van Engelen and Xin Yuan and Jason D.
. In Procee-
dings of the joint conference on Languages, compilers and tools for embedded
systems, pages 155164. ACM Press, 2002.