OVH Cloud OVH Cloud

FLAGS gcc pour optimiser

9 réponses
Avatar
Rakotomandimby
Bonjour, en charchant sur le net,
j'ai trouvé , pour optimiser les binaires produits par gcc et g++
( enventuellement ) ces pages .
http://home.comcast.net/~jcunningham63/linux/GCC_Optimization_apollo.html
http://computational-battery.org/Tools/gcc-man-arch.html
http://computational-battery.org/Tools/gcc-man-opt.html

Mon materiel est:
OS : Linux
Compilo: gcc 3.2.x
CPU : AMD Duron 800 Mhz
RAM : 512 Mo

Pourriez vous m'aider a choisir les flags qui vont bien SVP ?
Déja je vois a peu pres que "-O3 -march=athlon -mcpu=athlon" est un bon
début ... Mais encore ? ....

Quand je lis l'aide de "./configure" de la plupart des tarballs que je
telecharge, ils parlent de variables CCFLAGS ...
Je n'en ai pas sur mon systeme (mais en créer une, je sais faire).
Je suppose que les tarballs ont une valeur par default de ce "gcc flag" !
Est ce que créer une variable d'environnement suffit a "imposer" les FLAGS
pour gcc ? est ce qu'il est prioritaire sur une autre specification de FLAG
qu'on ferai en ligne de commande ou directement dans le Makefile ? est ce
que je dois a chaque compilation modifier le Makefile ?

Je vais commencer par justement re-compiler gcc lui-meme et la glibc avec,
puis le noyau ... c'est bien par la qu'il faut commencer ?

Merci de votre aide .. j'ai vraiment besoin de faire cette optimisation
parceque notre machine est en permanence a 60 - 70 % CPU et ça va en
s'empirant, et l'association prefere investir dans de la bande passante
plutot que dans une nouvelle machine tant qu'on atteint pas les 90 % en
permanence ... donc j'ai besoin de bouger le petit doigt au moins ...:-)
Merci d'avance .
--
http://mrakotom.free.fr

9 réponses

Avatar
J. Mayer
On Tue, 25 Nov 2003 20:52:16 +0100, Rakotomandimby wrote:

Bonjour, en charchant sur le net,
j'ai trouvé , pour optimiser les binaires produits par gcc et g++
( enventuellement ) ces pages .
http://home.comcast.net/~jcunningham63/linux/GCC_Optimization_apollo.html
http://computational-battery.org/Tools/gcc-man-arch.html
http://computational-battery.org/Tools/gcc-man-opt.html

Mon materiel est:
OS : Linux
Compilo: gcc 3.2.x
CPU : AMD Duron 800 Mhz
RAM : 512 Mo

Pourriez vous m'aider a choisir les flags qui vont bien SVP ?
Déja je vois a peu pres que "-O3 -march=athlon -mcpu=athlon" est un bon
début ... Mais encore ? ....


Plus safe:
prends gcc 3.3 (le 3.2 a des bugs connus et vicieux...)
utilise -O2 -mcpu=athlon (-march est deprecated)
tu peux utiliser -fomit-frame-pointer si tu ne cherche pas à débugger.



Quand je lis l'aide de "./configure" de la plupart des tarballs que je
telecharge, ils parlent de variables CCFLAGS ...


En général,
export CFLAGS="<mes flags>"
export CPPFLAGS="<mes flags>"
avant le ./configure
fait ce qu'il faut.
Tu peux mettre celà dans ton .bashrc ...

Je vais commencer par justement re-compiler gcc lui-meme et la glibc avec,
puis le noyau ... c'est bien par la qu'il faut commencer ?


Il faut plutot faire:
- binutils
- gcc
- glibc
- re-binutils (pour utiliser la nouvelle libc)
- re-gcc (idem)

Avatar
thomas.baruchel
Pourriez vous m'aider a choisir les flags qui vont bien SVP ?
Déja je vois a peu pres que "-O3 -march=athlon -mcpu=athlon" est un bon
début ... Mais encore ? ....


Je ne comprends pas bien qui écrit le code destiné à être compilé.
S'agit-il de programmes écrits par vous ou votre entourage, ou bien
de programmes téléchargés. Dans le second cas, laissons faire le
script 'configure', donc je suppose qu'il s'agit du premier cas.

Sans doute est-ce une bonne idée de penser à faire ces réglages,
mais je doute fort que cela puisse faire diminuer de façon décisive
l'utilisation du processeur. Rappelons que les améliorations décisives
proviennent des algorithmes utilisés plus que de ce genre de réglages.

Quand je lis l'aide de "./configure" de la plupart des tarballs que je
telecharge, ils parlent de variables CCFLAGS ...
Je n'en ai pas sur mon systeme (mais en créer une, je sais faire).


Je ne comprends pas bien ce que vous voulez dire; ces variables sont
utilisés lors de la compilation et passés comme paramètres au compilateur,
en général par le programme 'make' qui en lit les valeurs dans le
fichier 'Makefile' qui accopagne le programme. Renseignez-vous sur
'make' et Makefile.

Je vais commencer par justement re-compiler gcc lui-meme et la glibc avec,
puis le noyau ... c'est bien par la qu'il faut commencer ?
Une compilation du noyau ne fait jamais de mal, et je vous encourage à

le faire. Sous FreeBSD, j'en suis à un noyau de 3 Mo, ce qui est un peu
moins que Windows... Cela dit, au risque de me répéter, il n'y a pas
de miracle à attendre de tout cela. Si vos programmes consomment trop
de ressources, c'est leur conception même qu'il faut peut-être réviser.

N'hésitez pas à poser des questions de ce genre (par exemple dans
fr.comp.algomithmes), mais sachez que c'est par là qu'on peut
gagner de façon incroyable en économies de tous genres.

Merci de votre aide .. j'ai vraiment besoin de faire cette optimisation
parceque notre machine est en permanence a 60 - 70 % CPU et ça va en


Mais quel genre d'activité effectue-t-elle ?

--
« nous devons agir comme si la chose qui peut-être ne sera pas devait
être » (Kant, Métaphysique des moeurs, doctrine du droit, II conclusion)

Thomas Baruchel

Avatar
no
On Tue, 25 Nov 2003 20:52:16 +0100, Rakotomandimby wrote:

Bonjour, en charchant sur le net,
j'ai trouvé , pour optimiser les binaires produits par gcc et g++
( enventuellement ) ces pages .
http://home.comcast.net/~jcunningham63/linux/GCC_Optimization_apollo.html
http://computational-battery.org/Tools/gcc-man-arch.html
http://computational-battery.org/Tools/gcc-man-opt.html

Mon materiel est:
OS : Linux
Compilo: gcc 3.2.x
CPU : AMD Duron 800 Mhz
RAM : 512 Mo

Pourriez vous m'aider a choisir les flags qui vont bien SVP ?
Déja je vois a peu pres que "-O3 -march=athlon -mcpu=athlon" est un bon
début ... Mais encore ? ....

Quand je lis l'aide de "./configure" de la plupart des tarballs que je
telecharge, ils parlent de variables CCFLAGS ...
Je n'en ai pas sur mon systeme (mais en créer une, je sais faire).
Je suppose que les tarballs ont une valeur par default de ce "gcc flag" !
Est ce que créer une variable d'environnement suffit a "imposer" les FLAGS
pour gcc ? est ce qu'il est prioritaire sur une autre specification de FLAG
qu'on ferai en ligne de commande ou directement dans le Makefile ? est ce
que je dois a chaque compilation modifier le Makefile ?



Un `export CFLAGS="xxx"' dans le shell courant devrait suffire avant le
lancement du `./configure' et du `make'

Pour le kernel, il choisi tout seul l'optimisation adéquate en fonction
du processeur sélectionné dans la config (par le `make menuconfig' par
ex.) et il vaut mieux le laisser faire.

Je vais commencer par justement re-compiler gcc lui-meme et la glibc avec,
puis le noyau ... c'est bien par la qu'il faut commencer ?



Recompiler GCC ne fera pas que le glibc/noyau résultant d'une
recompilation ira « plus vite »...

Merci de votre aide .. j'ai vraiment besoin de faire cette optimisation
parceque notre machine est en permanence a 60 - 70 % CPU et ça va en
s'empirant, et l'association prefere investir dans de la bande passante
plutot que dans une nouvelle machine tant qu'on atteint pas les 90 % en
permanence ... donc j'ai besoin de bouger le petit doigt au moins ...:-)


Combien penses tu « gagner » en recompilant tout ça ?

Pour une utilisation « générale » (pas le cas d'algo de calcul
spécifiques, etc.) tu ne gagneras, dans le meilleur des cas, que quelques
pourcents...

Dis nous plutôt ce que fait cette machine ? serveur web ? mail ? fichiers ?
Combien de processus tournent ? la charge (load ) est de combien ? quels
sont les processus qui utilisent le plus de ressources ? utilisation CPU
en « user space » ? « kernel space » ? au niveau mémoire/swap ça se
passe comment ?

A ta place je regarderais d'abord tous ces paramètres, pour savoir
vraiment ce qu'il se passe sur la machine, avant de me lancer dans une
quelconque recompilation.

Avatar
Richard Delorme

Bonjour, en charchant sur le net,
j'ai trouvé , pour optimiser les binaires produits par gcc et g++
( enventuellement ) ces pages .
http://home.comcast.net/~jcunningham63/linux/GCC_Optimization_apollo.html
http://computational-battery.org/Tools/gcc-man-arch.html
http://computational-battery.org/Tools/gcc-man-opt.html


http://www.freehackers.org/gentoo/gccflags/flag_gcc3.html


Mon materiel est:
OS : Linux
Compilo: gcc 3.2.x
CPU : AMD Duron 800 Mhz
RAM : 512 Mo

Pourriez vous m'aider a choisir les flags qui vont bien SVP ?
Déja je vois a peu pres que "-O3 -march=athlon -mcpu=athlon" est un bon
début ... Mais encore ? ....


-mcpu=athlon est redondant avec march=athlon
-fomit-frame-pointer marche pas mal (10 à 30% de gain d'après mon
expérience), mais à le défaut d'empêcher le débogage.
-O3 peut parfois "pessimiser" par rapport à -O2. Pour certains programmes
-Os est même le truc le plus efficace, en accélérant le démarrage des
programmes.


Quand je lis l'aide de "./configure" de la plupart des tarballs que je
telecharge, ils parlent de variables CCFLAGS ...


je crois qu'il s'agit de CFLAGS et CXXFLAGS. Bien positionner le CHOST aussi
(à "i686-pc-linux-gnu").

Je n'en ai pas sur mon systeme (mais en créer une, je sais faire).
Je suppose que les tarballs ont une valeur par default de ce "gcc flag" !
Est ce que créer une variable d'environnement suffit a "imposer" les FLAGS
pour gcc ? est ce qu'il est prioritaire sur une autre specification de
FLAG qu'on ferai en ligne de commande ou directement dans le Makefile ?
est ce que je dois a chaque compilation modifier le Makefile ?


Il me semble que c'est le ./configure qui crée les Makefile adéquats à
partir des variables environnementales. gcc ne les utilise pas par défaut.
Néanmoins un réglage global n'est peut-être pas une bonne idée, car le
problème des optimisations, c'est que ça marche au cas par cas.

Je vais commencer par justement re-compiler gcc lui-meme et la glibc avec,
puis le noyau ... c'est bien par la qu'il faut commencer ?


re-compiler gcc n'est pas très utile. Si la lenteur de gcc t'exaspère, les
versions 3.3.x me semblent un peu plus rapide que les 3.2.x.
Les paramètres de compilation du noyau sont fait en choisissant de type de
processeur lors de la configuration, donc ce n'est pas la peine de te
casser la tête avec les flags de gcc pour lui. Si tu fais tourner beaucoup
de tâches en parallèle et beaucoup d'I/O, passer au noyau 2.6 peut s'avérer
bénéfique, dans la mesure où ces deux points sont plus performants que sur
les noyaux 2.4.
Sinon commencer par la glibc est en effet un bon début.
Si le démarrage des programmes compte pour une part non négligeable de la
consommation des ressources, essaie "prelink", qui accélère pas mal cette
phase.

Si tu penses tout recompiler, tu devrais installer une gentoo, qui facilite
énormément toutes ces choses.

--
Richard

Avatar
Rakotomandimby
no wrote:

Dis nous plutôt ce que fait cette machine ? serveur web ? mail ? fichiers
?


Elle fait serveur de stream audio, avec ré-encodage . c'est la tache qui
prend le plus de temps. parceque nous partons d'un fichier ogg d'une
qualité assez bonne , puis nous la ré-encodons pourl'adapater aux besoin de
nos auditeurs qui ont une bande passante limitée ou tout simplement pour
ceux qui preferent consacrer leur bande passante a autre chose .
De plus j'ai un serveur web desssus avec des accès saccadés . jentends par
la que le serveur n'est pas sollicité en permance mais quand je tente de
lui faire affichier une page web , le processus du serveur web devient
celui qui bouffe le plus de % CPU, de plus je sens quand meme que sur un
LAN , il repond pas trop vite ( ce n'est pas un serveur Apache mais un
Zope ... ) et il repond plus vite evidemment si je tue les process
d'encodage ...
Il heberge lui meme ses fichiers ogg , environ 20Go de fichiers de taille
moyenne de 4Mo

Combien de processus tournent ?
la charge (load ) est de combien ?
quels sont les processus qui utilisent le plus de ressources ? utilisation
CPU :

en « user space » ?


environ 50 %

« kernel space » ?


1%

au niveau mémoire/swap ça se
passe comment ?


J'ai pas mis de swap, parceque ... j'ai choisi de faire ça comme ça .. est
ce un mauvais choix ? En fait j'essaie de mettre un peu de securité aussi
dans les fichiers ... et pour ce faire , j'ai monté toutes les partitions
en "sync" , c'est a dire qui ne differe pas les ecritures sur le disque.
cela fait que l'activité du disque n'est pas minimum et si on rajoutai une
quelconque activité liée a la swap , j'ai pensé que cela pouvais plomber la
machine .

A ta place je regarderais d'abord tous ces paramètres, pour savoir
vraiment ce qu'il se passe sur la machine, avant de me lancer dans une
quelconque recompilation.
Merci , mais en plus de ces arguments j'aimerai aussi apprendre :-) ...

donc effectivement j'effectuerai ce diagnostic ( comme vous m'aviez
conseillé) mais la finalité sera de ce lancer aussi dans la recompilation.
--
http://mrakotom.free.fr

Avatar
Rakotomandimby
Thomas Baruchel wrote:

Je ne comprends pas bien qui écrit le code destiné à être compilé.
S'agit-il de programmes écrits par vous ou votre entourage, ou bien
de programmes téléchargés. Dans le second cas, laissons faire le
script 'configure', donc je suppose qu'il s'agit du premier cas.


Non :-) il s'agit du 2eme cas . Mais le premier ne saurai tarder .

Sans doute est-ce une bonne idée de penser à faire ces réglages,
mais je doute fort que cela puisse faire diminuer de façon décisive
l'utilisation du processeur. Rappelons que les améliorations décisives
proviennent des algorithmes utilisés plus que de ce genre de réglages.


Pour les programmes téléchargé, je ne peux pas , au vu de mes connaissances,
pretendre mieux faire ni ameliorer ce qui a été fait par la communauté
GPL ... mais comme je dis plus haut , le jour ou je me sentirai pret pour
cela je le ferai ... :-) . Donc je ne peux pas intervenir sur les algos
pour le moment.

Je ne comprends pas bien ce que vous voulez dire; ces variables sont
utilisés lors de la compilation et passés comme paramètres au compilateur,


oui .

Une compilation du noyau ne fait jamais de mal, et je vous encourage à
le faire. Sous FreeBSD, j'en suis à un noyau de 3 Mo, ce qui est un peu
moins que Windows...


Je n'ai jamais vu la tete du noyau Windows. Cela dit , sans les modules ,
mon noyau Linux fait 1,2 Mo ... il est enorme le votre ... non ?

Mais quel genre d'activité effectue-t-elle ?


Ré-encodage de fichier son a la volée .
on part de fichiers de bonne qualité , disons 44OOOHz / 128 kbs , et on
re-encode tout cela en plusieurs qualités (6 diferrents processes
simultanés qui me prennent environ 10% du CPU chacun) sans les sauver sur
le disque puisque nous n'en avons pas besoin, et destiné a du broadcast
internet .

--
http://mrakotom.free.fr

Avatar
Rakotomandimby
J. Mayer wrote:


Il faut plutot faire:
- binutils
- gcc
- glibc
- re-binutils (pour utiliser la nouvelle libc)
- re-gcc (idem)


j'avais pensé la meme chose mais j'avais peur de paraitre ridicule de
vouloir re-gcc avec le nouveau gcc ... mais puisque nous somme 2 a le
penser , je vais le faire ... Meric beaucoup
--
http://mrakotom.free.fr

Avatar
Thomas Labourdette

J'ai pas mis de swap, parceque ... j'ai choisi de faire ça comme ça .. est
ce un mauvais choix ? En fait j'essaie de mettre un peu de securité aussi
dans les fichiers ... et pour ce faire , j'ai monté toutes les partitions
en "sync" , c'est a dire qui ne differe pas les ecritures sur le disque.
cela fait que l'activité du disque n'est pas minimum et si on rajoutai une
quelconque activité liée a la swap , j'ai pensé que cela pouvais plomber la
machine .



Personnellement, je mettrais une partition swap pour les parties de
ton système qui ne sont pas ou peu utilisées mais qui te consomment
quand même de la RAM. Ceci permettra de libérer de la mémoire pour les
caches (au moins en lecture puisque en écriture tu es en sync).

Si tu peux faire le test, je suis intéressé par le résultat.
Merci.
@+
--
Thomas Labourdette
"Le sexe c'est comme un jeu de cartes : si tu n'as pas un bon
partenaire, tu as intérêt à avoir une bonne main !"

Avatar
no
On Wed, 26 Nov 2003 09:18:54 +0100, Rakotomandimby wrote:

no wrote:

Dis nous plutôt ce que fait cette machine ? serveur web ? mail ? fichiers
?


Elle fait serveur de stream audio, avec ré-encodage . c'est la tache qui
prend le plus de temps. parceque nous partons d'un fichier ogg d'une
qualité assez bonne , puis nous la ré-encodons pourl'adapater aux besoin de
nos auditeurs qui ont une bande passante limitée ou tout simplement pour
ceux qui preferent consacrer leur bande passante a autre chose .


Si tu ré-encode un stream, c'est normal que ton processeur
soit utilisé à son « maximum ».

Comme ce n'est que du calcul « pur et dur » tu devrais surtout utiliser
un encodeur avec des routines de codage optimisés « à la main », en
assembleur avec des instructions AMD 3DNow par ex.

Optimiser Gcc/Glibc ne sera pas utile dans ce cas. Une recompilation du
kernel en selectionnant Athlon plutôt que le kernel par défaut i386,
pourra aider pour les memcpy et copies de pages mémoire par exemple.

De plus j'ai un serveur web desssus avec des accès saccadés . jentends par
la que le serveur n'est pas sollicité en permance mais quand je tente de
lui faire affichier une page web , le processus du serveur web devient
celui qui bouffe le plus de % CPU, de plus je sens quand meme que sur un
LAN , il repond pas trop vite ( ce n'est pas un serveur Apache mais un
Zope ... ) et il repond plus vite evidemment si je tue les process
d'encodage ...


Pour le streaming tu as des imperatifs de temps à respecter, et je
trouve que c'est une trés mauvaise idée de mettre d'autres serveurs
sur cette machine, surtout si elle est limité en capacité de
calcul pour le re-encodage.

Si tu veux la priorité sur ton streaming/re-encodage, tu peux essayer de
lancer ton serveur httpd/Zope avec un `nice -n 15' par exemple.

Pour la bande passante (mais apparemment ce n'est pas ton problème) il
faudrait mettre la priorité sur les flux audio, afin que les transferts
avec le serveur http ne prennent pas la bande passante des flux.
Apparemment ton serveur web n'est pas trop sollicité, mais s'il doit
transferer 4Mo de fichier ça peut perturber la bp des flux. Voir
eventuellement du coté du « traffic shaping » et d'un script comme
`wondershaper'.

Zope c'est en python non ? peut être passer à Apache... avec un minimum
de modules et une config de MaxClients/StartServers/SpareServers/etc. sur
mesure...

Il heberge lui meme ses fichiers ogg , environ 20Go de fichiers de taille
moyenne de 4Mo

Combien de processus tournent ?
la charge (load ) est de combien ?
quels sont les processus qui utilisent le plus de ressources ? utilisation
CPU :

en « user space » ?


environ 50 %

« kernel space » ?


1%

au niveau mémoire/swap ça se
passe comment ?


J'ai pas mis de swap, parceque ... j'ai choisi de faire ça comme ça .. est
ce un mauvais choix ?


Si ton nombre de processus est bien maitrisé, que tu n'utilise/ne lance
que les services utiles, et surtout que l'occupation mémoire est
stable, ça devrait aller...

En fait j'essaie de mettre un peu de securité aussi
dans les fichiers ... et pour ce faire , j'ai monté toutes les partitions
en "sync" , c'est a dire qui ne differe pas les ecritures sur le disque.


« Sécurité » avec `mount -o sync' ? pour les « crashs » ? utilise
plutôt un fs journalisé... mais là tu as l'embarras du choix : ext3,
reiserfs, xfs, jfs, chacun ayant ses avantages et inconvenients... Je ne
me suis jamais pencher serieusement sur le sujet, mais tu trouveras des
benchmarks exhaustif sur internet et la ml du kernel.

cela fait que l'activité du disque n'est pas minimum et si on rajoutai
une quelconque activité liée a la swap , j'ai pensé que cela pouvais
plomber la machine .

A ta place je regarderais d'abord tous ces paramètres, pour savoir
vraiment ce qu'il se passe sur la machine, avant de me lancer dans une
quelconque recompilation.
Merci , mais en plus de ces arguments j'aimerai aussi apprendre :-) ...

donc effectivement j'effectuerai ce diagnostic ( comme vous m'aviez
conseillé) mais la finalité sera de ce lancer aussi dans la
recompilation.


Et bien qu'est ce que tu attends ? vas y ! :)