GNT sans publicité, site mobile, fonctionnalitées exclusives...

[Débutant] Optimiser la compilation

Le
Ganymede
Salut à tous,

Si j'ai bien compris, les applications fournies sur les CD de Mandrake sont
destinées à tous les processeurs de la famille i586 - ce qui est tout à
fait normal pour assurer une large compatibilité.
Mais j'ai entendu dire qu'il était possible d'optimiser la compilation d'un
programme pour des processeurs plus évolués que le 586.

Cela m'intéresserait, car d'une part j'utilise un athlon-XP, et d'autre part
la commande `uname -a' me retourne la valeur "i686". J'en déduis que si je
compile un programme à l'aide de la commande make, le programme de
compilation produira un binaire optimisé pour i686, mais pas pour un
athlon-XP.

Donc, ma question est : comment faire en sorte que la compilation prenne en
compte les particularités du processeur ? Faut-il ajouter une option après
la commande make ? (J'ai regardé dans `man make', mais je n'ai pas trouvé.)
Faut-il changer quelque chose dans le makefile ?

Merci,

Julien
Lire les 9 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Richard Delorme
Le #759957

Salut à tous,

Si j'ai bien compris, les applications fournies sur les CD de Mandrake
sont destinées à tous les processeurs de la famille i586 - ce qui est tout
à fait normal pour assurer une large compatibilité.
Mais j'ai entendu dire qu'il était possible d'optimiser la compilation
d'un programme pour des processeurs plus évolués que le 586.

Cela m'intéresserait, car d'une part j'utilise un athlon-XP, et d'autre
part la commande `uname -a' me retourne la valeur "i686". J'en déduis que
si je compile un programme à l'aide de la commande make, le programme de
compilation produira un binaire optimisé pour i686, mais pas pour un
athlon-XP.


Moi j'ai :
Linux gentoo 2.4.22 #6 dim sep 21 13:17:02 CEST 2003 i686 AMD Athlon(tm) XP
2000+ AuthenticAMD GNU/Linux

Cela renseigne uniquement selon la façon dont le noyau a été compilé.

Donc, ma question est : comment faire en sorte que la compilation prenne
en compte les particularités du processeur ? Faut-il ajouter une option
après la commande make ? (J'ai regardé dans `man make', mais je n'ai pas
trouvé.) Faut-il changer quelque chose dans le makefile ?


En fait, il faut que le compilateur reçoivent les bonnes options.

Ceci devrait t'intéresser :
http://reviewed.homelinux.org/en/howtocflags.html

En gros, il faut définir les variables environnementales suivantes, dans un
script de login :
export CHOST="i686-pc-linux-gnu"
export CFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer"
export CXXFLAGS="${CFLAGS}"

Néanmoins, ceci n'est pas une solution universelle, et il faut parfois
éditer le makefile, ou indiquer les options sur la ligne de commande à
make, par exemple avec :
make 'CFLAGS = -march=athlon-xp -O3 -pipe -fomit-frame-pointer'

A voir donc selon le cas.

A noter aussi que les meilleures options varient selon le programme à
compiler, il n'est donc pas certain qu'un réglage globale soit *la*
solution.

--
Richard

J. Mayer
Le #759952
On Sun, 26 Oct 2003 15:18:42 +0100, Richard Delorme wrote:


Donc, ma question est : comment faire en sorte que la compilation prenne
en compte les particularités du processeur ? Faut-il ajouter une option
après la commande make ? (J'ai regardé dans `man make', mais je n'ai pas
trouvé.) Faut-il changer quelque chose dans le makefile ?


En fait, il faut que le compilateur reçoivent les bonnes options.

Ceci devrait t'intéresser :
http://reviewed.homelinux.org/en/howtocflags.html

En gros, il faut définir les variables environnementales suivantes, dans un
script de login :
export CHOST="i686-pc-linux-gnu"
export CFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer"
export CXXFLAGS="${CFLAGS}"

Néanmoins, ceci n'est pas une solution universelle, et il faut parfois
éditer le makefile, ou indiquer les options sur la ligne de commande à
make, par exemple avec :
make 'CFLAGS = -march=athlon-xp -O3 -pipe -fomit-frame-pointer'

A voir donc selon le cas.

A noter aussi que les meilleures options varient selon le programme à
compiler, il n'est donc pas certain qu'un réglage globale soit *la*
solution.


Attention, tou de même:
pour compîler des applications et être capable de les debugger,
il faut -O2 à la place de -O3 et ne _pas_ mettre -fomit-frame-pointer
D'une façon générale, il est plus prudent de laisser -O2,
car le -O3 peut générer des problèmes vicieux avec certains programmes
pour lesquels il ne faut surtout pas que le compilateur réordonne
les instructions executées.


Richard Delorme
Le #759948

On Sun, 26 Oct 2003 15:18:42 +0100, Richard Delorme wrote:


Donc, ma question est : comment faire en sorte que la compilation prenne
en compte les particularités du processeur ? Faut-il ajouter une option
après la commande make ? (J'ai regardé dans `man make', mais je n'ai pas
trouvé.) Faut-il changer quelque chose dans le makefile ?


En fait, il faut que le compilateur reçoivent les bonnes options.

Ceci devrait t'intéresser :
http://reviewed.homelinux.org/en/howtocflags.html

En gros, il faut définir les variables environnementales suivantes, dans
un script de login :
export CHOST="i686-pc-linux-gnu"
export CFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer"
export CXXFLAGS="${CFLAGS}"

Néanmoins, ceci n'est pas une solution universelle, et il faut parfois
éditer le makefile, ou indiquer les options sur la ligne de commande à
make, par exemple avec :
make 'CFLAGS = -march=athlon-xp -O3 -pipe -fomit-frame-pointer'

A voir donc selon le cas.

A noter aussi que les meilleures options varient selon le programme à
compiler, il n'est donc pas certain qu'un réglage globale soit *la*
solution.


Attention, tou de même:
pour compîler des applications et être capable de les debugger,
il faut -O2 à la place de -O3 et ne _pas_ mettre -fomit-frame-pointer


oui, et ajouter -g bien sûr.
cela dit -fomit-frame-pointer est une option d'optimisation assez efficace,
et il est bête de ne pas l'utiliser.

D'une façon générale, il est plus prudent de laisser -O2,
car le -O3 peut générer des problèmes vicieux avec certains programmes
pour lesquels il ne faut surtout pas que le compilateur réordonne
les instructions executées.


L'option -O2 réordonne déjà les instructions. -O3, en plus de ce que fait
-O2, met en ligne automatiquement certaines fonctions. Il est vrai que des
bugs dus à l'utilisation de -O3 (ou de -finline-functions) sont
régulièrement trouvés, mais il existe aussi des bugs ailleurs dans gcc.
Utiliser -O2 ne garantit donc pas l'absence de problème. Et si personne
n'utilise gcc avec l'option -O3, cela va être dur de débogguer cette option
de gcc :-)
L'utilisation de -O3 peut aussi ralentir le code, par rapport à -O2. Mais,
bon, j'avais déjà dit que les meilleures options dépendent du programme.

--
Richard



Ganymede
Le #759363
Richard Delorme wrote:


On Sun, 26 Oct 2003 15:18:42 +0100, Richard Delorme wrote:


Donc, ma question est : comment faire en sorte que la compilation
prenne en compte les particularités du processeur ? Faut-il ajouter une
option après la commande make ? (J'ai regardé dans `man make', mais je
n'ai pas trouvé.) Faut-il changer quelque chose dans le makefile ?


En fait, il faut que le compilateur reçoivent les bonnes options.

Ceci devrait t'intéresser :
http://reviewed.homelinux.org/en/howtocflags.html

En gros, il faut définir les variables environnementales suivantes, dans
un script de login :
export CHOST="i686-pc-linux-gnu"
export CFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer"
export CXXFLAGS="${CFLAGS}"

Néanmoins, ceci n'est pas une solution universelle, et il faut parfois
éditer le makefile, ou indiquer les options sur la ligne de commande à
make, par exemple avec :
make 'CFLAGS = -march=athlon-xp -O3 -pipe -fomit-frame-pointer'

A voir donc selon le cas.

A noter aussi que les meilleures options varient selon le programme à
compiler, il n'est donc pas certain qu'un réglage globale soit *la*
solution.


Attention, tou de même:
pour compîler des applications et être capable de les debugger,
il faut -O2 à la place de -O3 et ne _pas_ mettre -fomit-frame-pointer


oui, et ajouter -g bien sûr.
cela dit -fomit-frame-pointer est une option d'optimisation assez
efficace, et il est bête de ne pas l'utiliser.

D'une façon générale, il est plus prudent de laisser -O2,
car le -O3 peut générer des problèmes vicieux avec certains programmes
pour lesquels il ne faut surtout pas que le compilateur réordonne
les instructions executées.


L'option -O2 réordonne déjà les instructions. -O3, en plus de ce que fait
-O2, met en ligne automatiquement certaines fonctions. Il est vrai que des
bugs dus à l'utilisation de -O3 (ou de -finline-functions) sont
régulièrement trouvés, mais il existe aussi des bugs ailleurs dans gcc.
Utiliser -O2 ne garantit donc pas l'absence de problème. Et si personne
n'utilise gcc avec l'option -O3, cela va être dur de débogguer cette
option de gcc :-)
L'utilisation de -O3 peut aussi ralentir le code, par rapport à -O2. Mais,
bon, j'avais déjà dit que les meilleures options dépendent du programme.



Merci pour votre réponse.
Cependant, je n'ai pas encore tout compris. En particulier : qu'est-ce qu'un
"script de login" ? Est-ce un simple script ou y a-t-il une procédure
spéciale pour l'activer ?




Richard Delorme
Le #763767

Merci pour votre réponse.
Cependant, je n'ai pas encore tout compris. En particulier : qu'est-ce
qu'un "script de login" ? Est-ce un simple script ou y a-t-il une
procédure spéciale pour l'activer ?


Tu peux mettre ça dans un simple script, où même le taper directement dans
bash (ou un autre shell). Néanmoins, si tu écris ces lignes dans .bashrc
(ou le fichier semblable de ton shell), ce serait fait une fois pour toute
à chaque lancement de bash.

--
Richard

Publicité
Suivre les réponses
Poster une réponse
Anonyme