Académique Documents
Professionnel Documents
Culture Documents
Cours #8
Optimisation de code
Bruno De Kelper
Site internet :
http://www.ele.etsmtl.ca/academique/ele784/
Cours # 8
Plan daujourdhui
Rf. : Computer Systems A Programmers Perspective, R.E. Bryant, D.R. OHallaron, Prentice Hall, chap. 5.
Cours # 8
Cours # 8
Dpendantes de la machine
Cours # 8
Cours # 8
A
5
2ime cas :
5
Xp Yp
AddXY_1
11
AddXY_2
Xp
Phnomne
dalias de mmoire
"memory aliasing"
AddXY_1
11
20
Yp
AddXY_2
15
Donc, lorsque ces deux fonctions reoivent des pointeurs vers la mme
variable, elles ne produisent pas le mme rsultat.
Cours # 8
int f (int A) {
n++;
return (A+n);
}
AddF_1
30
AddF_2
24
Cours # 8
800
CPE = 4.0
600
0+
80.
400
200
Cours # 8
*n
4 .0
5+
83.
0
0
40
80
*n
3.5
CPE = 3.5
120
160
typedef struct {
int len;
data_t *data;
} vec_rec, *vec_ptr
et
#define INIT 0 ou #define INIT 1
#define OPER *
#define OPER +
}
Mesure du CPE :
Entier
Point flottant
la performance denviron 25 %.
*
*
+
+
Les multiplications en point-flottant
Pas doptimisation 42.06 41.86 41.44 160.0
consomment beaucoup plus de
Option O2
31.25 33.25 33.25 143.0
Optimisation
Cours # 8
Cours # 8
Point flottant
*
*
+
+
31.25 33.25 33.25 143.0
22.61 21.25 21.15 135.0
*dest = INIT;
Operation1()
for (i = 0; i < length; i++) {
Operation2()
data_t val;
get_element (v, i, &val);
- Cette optimisation amliore la
*dest = *dest OPER val;
performance denviron 33 %.
}
}
- Ce type doptimisation sappelle "dplacement de code" (code motion).
- Le compilateur tente dutiliser le "dplacement de code" , mais cause
deffet secondaire potentiel, il vite de changer les appels de fonction.
Cours # 8
o
void strlen (const char *S) {
int len = 0;
200
160
120
while (*S != /0) {
S++;
80
len++;
Doit trouver la
}
fin de la chaine 40
return len; pour dterminer
0
}
0
sa longueur.
Cours # 8
Cours # 8
- La fonction Minus1
a un comportement
quadratique (
viter absolument).
Mesure du CPE :
in
l
cu
us
e1
Minuscule2
0.5
1.0
1.5
2.0
- La fonction Minus2
a un comportement
linaire.
2.5 3.0
x105
10
*dest = INIT;
for (i = 0; i < length; i++)
*dest = *dest OPER data[i];
Cours # 8
Mesure du CPE :
Entier
Point flottant
*
*
+
+
Operation2() 22.61 21.25 21.15 135.0
Operation3() 6.00 9.00
8.00 117.0
Fonction
11
*dest = INIT;
for (i = 0; i < length; i++)
*dest = *dest OPER data[i];
Cours # 8
Cours # 8
Mesure du CPE :
Entier
Point flottant
*
*
+
+
Operation2() 22.61 21.25 21.15 135.0
Operation3() 6.00 9.00
8.00 117.0
Fonction
12
Fonction
Operation3()
Operation4()
Entier
*
+
6.00
9.00
2.00
4.00
Point flottant
*
+
8.00 117.0
3.00 5.00
13
Cours # 8
14
Fetch
control
Retirement
unit
Register
file
Instruction
decode
Instruction
cache
Instructions
Operations
Register
updates
Prediction
OK?
Integer/
branch
General
integer
FP
add
FP
mult/div
Operation results
Load
Addr.
Functional
units
Store
Addr.
Data
Data
Data
cache
Execution
Execution
Cours # 8
15
Cours # 8
Cours # 8
Opration
Latence mission
Addition entire
1
1
Multiplication entire
4
1
Division entire
36
36
Addition point-flottant
3
1
Multiplication point-flottant
5
2
Division point-flottant
38
38
Lecture (en cache)
3
1
criture (en cache)
3
1
ELE784 - Ordinateurs et programmation systme
Les oprations de
division ne sont pas
misent en pipeline
car elles ne sont
pas juges assez
frquentes.
16
1 Lecture de data[i]
2 Multiplication de x et Reg
Dtail
dexcution 3 Incrment i
4 Compare i length
5 Branche 1 si plus petit
Notation
abrge
simultane
Reg
Reg = Data[i]
x = x * Reg
i=i+1
cond = i - length
GOTO 1 (cond = <)
Cours # 8
Load
++
i
i
comp
cond
excution
goto
Dure du
traitement
17
2
3
++
i
comp
cond
goto
Load
Reg
Reg
En supposant des
ressources illimites
++
i
comp
cond
Load
goto
Reg
Traitement
spculatif
10
x
11
Cours # 8
++
i
comp
cond
goto
8
9
18
Cours # 8
2
3
++
i
comp
cond
goto
Load
Reg
Reg
++
i
comp
cond
Load
goto
Reg
Traitement
spculatif
9
10
11
Cours # 8
++
i
comp
cond
goto
19
Cours # 8
Cours # 8
20
10
Cours # 8
21
1
Load
2
3
Load
Reg
7
8
+
i
i
comp
cond
goto
Reg
+
5
6
Load
Load
Reg
+
Load
Reg
Load
Reg
+
Reg
+
9
Mesure de
CPE
CPE
Cours # 8
Cours # 8
1
2.00
Degr de droulement
2
3
4
8
1.50
1.33 1.50 1.25
16
1.06
On remarque que le
gain nest pas linaire.
22
11
Degr de droulement
2
3
4
8
1.50
1.33 1.50 1.25
3.57
3.39 3.84 3.91
1.56
1.40 1.56 1.31
Nombre
dlments
1
CPE (idal)
2.00
31 lments
4.02
1024 lments 2.06
16
1.06
3.66
1.12
23
Entier
*
+
Operation4() 2.00 4.00
Operation4p() 3.00 4.00
Operation5() 1.33 4.00
Operation5p() 1.33 4.00
Fonction
Point flottant
*
+
3.00 5.00
3.00 5.00
3.00 5.00
3.00 5.00
Cours # 8
24
12
25
++
i
i
comp
cond
goto
Reg0
Reg1
Cours # 8
Cours # 8
26
13
Fonction
Operation4()
Operation6()
Entier
*
+
1.50 4.00
1.50 2.00
27
X0, X1
Cours # 8
Cours # 8
2 registres
Reg0, Reg1
En point-flottant
X0, X1
Reste
6 registres
2 registres
Reg0, Reg1,
28
14
Mthode
Pas optimis
Option de compilation O2
vec_len() avant la boucle
Accs direct aux donnes
Accumulation dans variable locale
Droule la boucle (degr 4)
Operation5()
Droule la boucle (degr 16)
Droule (degr 2) et paralllisme (degr 2)
Operation6() Droule (degr 4) et paralllisme (degr 2)
Droule (degr 8) et paralllisme (degr 4)
Operation1()
Operation1()
Operation2()
Operation3()
Operation4()
Cours # 8
Entier
*
+
40.14
47.14
25.08
36.05
19.19
32.18
6.26
12.52
1.76
9.01
1.51
9.01
1.25
9.01
1.19
4.69
1.15
4.12
1.11
4.24
Point flottant
*
+
52.07 53.71
37.37 32.02
28.73 32.73
13.26 13.01
8.01
8.01
6.32
6.32
6.33
6.22
4.44
4.45
2.34
2.01
2.36
2.08
29
Cours # 8
30
15
31
Cours # 8
32
16
Cours # 8
33
Cours # 8
3
4
5
++
i
Load
++
i
++
Reg
test
cond
jne
Reg
test
cond
jne
7
8
9
Chaque lecture
dpend de la
prcdente
Load
CPE = 3.0
10
Load
Reg
test
cond
jne
34
17
Cours # 8
35
Load Unit
Adresse
Store Unit
Adresse
Adresse Donne
Donne
Donne
Adresse
Donne
Cache-memory
- Si la lecture ne faisait pas cette vrification, elle pourrait lire une donne en
mmoire-cache qui na pas encore t mise jour par une criture qui a t
dclenche avant la lecture.
- Sil y a effectivement une criture en cours sur la case de mmoire-cache vise
par la lecture, celle-ci doit attendre la fin de cette criture.
- Lopration dcriture ne subit pas ce genre de contrainte de la part de la lecture.
Cours # 8
Cours # 8
36
18
*dest *src
1
2
Store Store
data addr
6
7
cnt
Store
addr
src
++
4
5
-cond
Load
jnc
val
src
++
val
Store
data
CPE = 2.0
Cours # 8
cnt
-cond
Load
jnc
val
37
Cas 2 :
cnt
val
1
2
3
-cond
jnc
Store Store
data addr
cnt
cnt
-cond
jnc
=
Store
addr
Load
4
5
6
7
8
src
++
val
Dans ce cas-ci, la
lecture doit attendre
la fin de lcriture
Load
val
Store
data
9
10
Cours # 8
Cours # 8
11
CPE = 6.0
ELE784 - Ordinateurs et programmation systme
src
val
++
38
19
39
= % de code optimis
k
= facteur doptimisation obtenu
Alors
S = Told/Tnew =
1
(1-) + /k
(Loi dAmdahl)
Cette loi montre quun gain de performance lev sur une petite partie de
code ne rsulte pas en un gain quivalent sur lensemble du code.
Cours # 8
Cours # 8
40
20