Rev 1075 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1075 | jmengual | 1 | AUTEUR : Jim Gifford <lfs-hints at jg555.com> |
2 | A l'origine par Gerard Beekmans < gerard at linuxfromscratch.org > |
||
3 | A l'origine par Thomas -Balu-Walter < tw at itreff.de > |
||
4 | A l'origine par Eric Olinger <eric at supertux.com> optimization2.txt |
||
5 | |||
6 | DATE : 30-10-2003 |
||
7 | |||
8 | DATE DE TRADUCTION : 29-05-2009 |
||
9 | |||
1079 | jmengual | 10 | LICENCE : GNU Free Documentation License Version 1.2 |
1075 | jmengual | 11 | |
12 | SYNOPSIS : Optimisation du compilateur |
||
13 | |||
14 | DESCRIPTION : Cette astuce joue le rôle d'un guide sur la marche à suivre ou |
||
15 | sur ce qu'il ne faut pas faire à propos des optimisations du compilateur. |
||
16 | |||
17 | PREREQUIS : Aucun |
||
18 | |||
19 | ASTUCE : |
||
20 | |||
21 | L'origine de ce texte est la version 2.4.3 du livre LFS - Chapitre 6. Je l'ai |
||
22 | modifié un peu pour créer cette astuce. |
||
23 | |||
24 | La plupart des programmes et des bibliothèques sont compilés par défaut avec le |
||
25 | niveau d'optimisation 2 (les options gcc sont -g et -O2) et pour un processeur |
||
26 | particulier. Sur un système Intel, les logiciels sont compilés par défaut pour |
||
27 | les processeurs i386. Si vous ne souhaitez pas exécuter de logiciels sur une |
||
28 | autre machine que la vôtre, vous pourriez vouloir changer les options du |
||
29 | compilateur par défaut pour qu'ils soient compilés avec un niveau d'optimisation |
||
30 | plus élevé et que le code généré soit spécifique à votre architecture. |
||
31 | |||
32 | Il y a plusieurs façons de modifier les options du compilateur par défaut. Une |
||
33 | de ces façons est d'éditer tous les fichiers Makefile que vous pouvez trouver |
||
34 | dans un paquet, d'y chercher les variables CFLAGS et CXXFLAGS (un paquet bien |
||
35 | conçu utilisera la variable CFLAGS pour définir les options du compilateur gcc |
||
36 | et CXXFLAGS pour les options du compilateur g++) et de changer leur valeur. Des |
||
37 | paquets comme binutils, gcc, glibc et d'autres contiennent de nombreux fichiers |
||
38 | Makefile dans de nombreux sous-répertoires, cela pourrait prendre beaucoup de |
||
39 | temps. Au lieu de ça, il y a une façon plus simple de faire les choses : créer |
||
40 | les variables d'environnement CFLAGS et CXXFLAGS. La plupart des scripts configure |
||
41 | lisent les variables CFLAGS et CXXFLAGS et les utilisent dans les |
||
42 | fichiers Makefile. Certains paquets ne suivent pas cette convention et |
||
43 | nécessitent d'être édités à la main. |
||
44 | |||
45 | Pour initialiser ces variables, vous pouvez exécuter les commandes suivantes |
||
46 | dans bash (ou les ajouter à votre .bashrc si vous voulez qu'elles soient |
||
47 | présentes tout le temps) : |
||
48 | |||
49 | export CFLAGS="-O3 -march=<architecture>" && |
||
50 | CXXFLAGS=$CFLAGS |
||
51 | |||
52 | C'est un ensemble minimal d'optimisation qui marche sur la plupart des systèmes. |
||
53 | L'option march compilera les binaires avec des instructions spécifiques pour le |
||
54 | processeur que vous avez précisé. Ceci signifie que vous ne pourrez pas copier ce |
||
55 | binaire sur un processeur d'une gamme inférieure et l'exécuter. Ceci pourra soit |
||
56 | être peu fiable ou alors ne marchera pas du tout (ça donnera des erreurs comme |
||
57 | "Illegal Instruction, core dumped"). Vous devriez lire la page Info de GCC pour |
||
58 | trouver d'autres drapeaux d'optimisation. Dans la variable d'environnement |
||
59 | ci-dessus, vous devez remplacer <architecture> par un identifiant de processeur |
||
60 | approprié comme i586, i686, powerpc ou autres. Je suggère de jetter un coup |
||
61 | d'oeil au document gcc-manual disponible sur |
||
62 | http://gcc.gnu.org/onlinedocs/gcc_toc.html, section "Hardware Models and |
||
63 | Configurations". |
||
64 | |||
65 | /* |
||
66 | * Note de l'éditeur |
||
67 | * "Reboant" a laissé une note sur le fait que l'utilisation de -Os |
||
68 | * (Optimisation pour la taille) montre des résultats incroyablement bons. Si |
||
69 | * vous voulez des binaires de petite taille plutôt qu'un temps d'exécution |
||
70 | * rapide, vous pouvez vouloir jeter un coup d'oeil à cela. |
||
71 | */ |
||
72 | |||
73 | Gardez en tête que si vous trouvez un paquet qui ne se compile pas ou qui |
||
74 | renvoie des erreurs comme "erreur de segmentation, core dumped", cela a certainement |
||
75 | à voir avec les optimisations du compilateur. Essayez d'abaiser le niveau |
||
76 | d'optimisation en remplaçant -O3 par -O2. Si cela ne marche pas, essayez -O ou |
||
77 | laissez tout tel quel. Essayez aussi de changer l'option -march. Les |
||
78 | compilateurs sont très sensibles à certains matériels. Une mémoire défectueuse |
||
79 | peut causer des problèmes de compilation quand des niveaux d'optimisation |
||
80 | élevés, comme -O3, sont utilisés. Le fait que je n'aie pas de problèmes en |
||
81 | compilant tous mes paquets avec -O3 ne signifie pas que vous n'aurez pas de |
||
82 | problèmes. Un autre problème peut être la version de Binutils installée sur |
||
83 | votre système qui cause souvent des problèmes de compilation dans Glibc (ceci |
||
84 | peut être observé surtout avec RedHat car RedHat utilise souvent des logiciels |
||
85 | en version béta qui ne sont pas toujours très stables). |
||
86 | |||
87 | "RedHat aime flirter avec le risque mais on vous laisse prendre le risque" |
||
88 | ("RedHat likes living on the bleeding edge, but leaves the bleeding up to you") |
||
89 | (Citation d'une personne sur la liste de diffusion lfs-discuss). |
||
90 | |||
91 | DEFINITIONS DES DRAPEAUX : |
||
92 | |||
93 | Pour plus d'informations sur les drapeaux d'optimisation du compilateur, |
||
94 | regardez les pages sur la commande gcc présente dans les docs en ligne de GCC |
||
95 | 3.3.1 : |
||
96 | |||
97 | http://gcc.gnu.org/onlinedocs/gcc-3.3.1/gcc/Optimize-Options.html#Optimize%20Options |
||
98 | http://gcc.gnu.org/onlinedocs/gcc-3.3.1/gcc/i386-and-x86-64-Options.html#i386%20and%20x86-64%20Options |
||
99 | |||
100 | -s |
||
101 | Une option de l'éditeur de liens qui supprime du binaire |
||
102 | toutes les tables de symboles et les informations de repositionnement. |
||
103 | |||
104 | -O3 |
||
105 | Ce drapeau initialise le niveau d'optimisation pour le binaire. |
||
106 | 3 Le niveau le plus haut, du code machine spécifique est |
||
107 | engendré. Ajoute auto-magiquement les drapeaux |
||
108 | -finline-functions et -frename-registers. |
||
109 | 2 La plupart des Makefile spécifient ceci par défaut, procèdent |
||
110 | à toutes les optimisations supportées qui n'impliquent pas de |
||
111 | compromis temps-mémoire. Ajoute le drapeau -fforce-mem |
||
112 | auto-magiquement. |
||
113 | 1 Un minimum d'optimisations sont effectuées. C'est ainsi par défaut |
||
114 | si rien n'est spécifié. |
||
115 | |||
116 | s Comme O2 mais fait des optimisations supplémentaires pour |
||
117 | la taille. |
||
118 | |||
119 | -fomit-frame-pointer |
||
120 | Dit au compilateur de ne pas sauvegarder le pointeur de frame dans un |
||
121 | registre pour les fonctions qui n'en ont pas besoin. Ceci supprime les |
||
122 | instructions de sauvegarde, d'initialisation et de restauration des |
||
123 | pointeurs de frame et libère un registre supplémentaire pour de |
||
124 | nombreuses fonctions. Cela rend le débogage impossible sur certaines |
||
125 | machines. |
||
126 | |||
127 | -march=pentium3 |
||
128 | Définit le jeu d'instructions à utiliser lors de la compilation. -mpcu |
||
129 | est implicitement identique à -march quand seul -march est spécifié. |
||
130 | i386 Processeur Intel 386 |
||
131 | i486 Processeur Intel/AMD 486 |
||
132 | pentium Processeur Intel Pentium |
||
133 | pentiumpro Processeur Intel Pentium Pro |
||
134 | pentium2 Processeur Intel PentiumII/Celeron |
||
135 | pentium3 Processeur Intel PentiumIII/Celeron |
||
136 | pentium4 Processeur Intel Pentium 4/Celeron |
||
137 | k6 Processeur AMD K6 |
||
138 | k6-2 Processeur AMD K6-2 |
||
139 | K6-3 Processeur AMD K6-3 |
||
140 | athlon Processeur AMD Athlon/Duron |
||
141 | athlon-tbird Processeur AMD Athlon Thunderbird |
||
142 | athlon-4 Processeur AMD Athlon Version 4 |
||
143 | athlon-xp Processeur AMD Athlon XP |
||
144 | athlon-mp Processeur AMD Athlon MP |
||
145 | winchip-c6 Processeur Winchip C6 |
||
146 | winchip2 Processeur Winchip 2 |
||
147 | c3 Processeur VIA C3 Cyrix |
||
148 | |||
149 | -mmmx |
||
150 | -msse |
||
151 | -msse2 |
||
152 | -m3dnow |
||
153 | Ces options activent ou désactivent l'utilisation des fonctions intégrées |
||
154 | qui permettent un accès direct aux extensions MMX, SSE, 3Dnow du jeu |
||
155 | d'instructions. |
||
156 | |||
157 | LIENS SUR L'OPTIMISATION : |
||
158 | |||
159 | Drapeaux fiables à utiliser avec Gentoo 1.4 |
||
160 | http://www.freehackers.org/gentoo/gccflags/flag_gcc3.html |
||
161 | |||
162 | Sécuriser & Optimiser Linux : la solution ultime 2.0 |
||
163 | http://www.openna.com/products/books/sol/solus.php |
||
164 | |||
165 | EXPERIENCE PERSONNELLE : |
||
166 | |||
167 | J'ai utilisé tous les niveaux d'optimisation possibles, mais à ma déception, les |
||
168 | résultats varient suivant les paquets. Utiliser -O(un chiffre) avec GCC 3.3.1 |
||
169 | peut donner des résultats imprévisibles. |
||
170 | |||
171 | Vous pouvez voir certains de ces résultats imprévisibles dans les bogues suivants |
||
172 | envoyés à GCC : |
||
173 | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12590 |
||
174 | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=10655 |
||
175 | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=8440 |
||
176 | |||
177 | VERSION: 1.2 |
||
178 | |||
179 | HISTORIQUE DES CHANGEMENTS : |
||
180 | 1.2 Corrections de fautes de frappe |
||
181 | 1.1 Corrections de fautes de frappe et d'erreurs de copier-coller |
||
182 | 1.0 Adoption par Jim Gifford |
||
183 | |||
184 | Vous pouvez consulter les nouvelles versions de ce document sur http://cvs.jg555.com/viewcvs.cgi/lfs-hints |
||
185 | |||
186 | HISTORIQUE DE LA TRADUCTION : |
||
187 | 29-05-2009 - Traduction de la version 1.2 |