[Linux-bruxelles] De l'optimisation du code par un compilateur

Jérôme Warnier jwarnier at beeznest.net
Mer 15 Fév 15:21:53 CET 2006


Dans la suite des questions d'optimisation des distributions, je voulais
un peu expliquer ce que recompiler avec des options d'optimisation pour
un processeur ou un autre peut signifier.
Avertissement: je ne prétends pas être complet, ou ne pas me tromper de
temps en temps.

En règle générale, les processeurs (d'une même architecture) diffèrent
(avec un impact possible sur les performances):
- en nombre de registres[1]
- en unités de traitement spéciales (co-processeur mathématique, MMX,
KNI, 3DNow!, ...) et (donc) les instructions spécialisées disponibles
- en quantité de cache de premier et de second niveau, ainsi qu'en
vitesses (relatives) de celles-ci
- en nombres de cycles nécessaires pour traiter une instruction et en
fréquences et fréquences de bus (relatives), qui conditionnent aussi ce
premier
- en quantité de RAM addressable (attention, parfois lié au chipset, qui
peut lui-même parfois être intégré au coeur du processeur)

Le compilateur peut tirer parti de ces différences (c.-à-d. optimiser
pour que ça aille plus vite en fin de compte).
Par exemple, utiliser plus de registres ou plus de cache sur un
processeur que sur un autre, pour éviter de devoir vider pour remplir
avec autre chose et remettre ce qu'il a vidé en premier lieu juste
après.
Autre exemple: utiliser certaines instructions plutôt que d'autres pour
gérer un tableau ou une boucle, voire transformer une boucle dont le
nombre d'occurences est faible et est connu à la compilation en
l'écriture du même code plusieurs fois en suivant.
Autre exemple: utiliser MMX plutôt que le co-processeur mathématique
parce que passer de l'un à l'autre prend beaucoup de cycles (parce
qu'ils partagent les mêmes registres, qu'il faut donc tous sauver, et
tous restaurer juste après).

L'idéal étant évidemment que le programmeur ait prévu explicitement dans
le code les optimisations qui comptent vraiment, et que ces
optimisations soient de préférences choisies au moment de l'exécution,
et pas de la compilation. Dans ce dernier cas, des optimisations au
moment de la compilation n'apporteraient rien, ou pourraient même
parfois faire pire que mieux.


Pour plus d'infos, voire n'importe quel cours d'architecture des
ordinateurs.

[1] petits stockages de travail internes au processeur





Plus d'informations sur la liste de diffusion Linux-bruxelles