OVH Cloud OVH Cloud

Gentoo et warning

51 réponses
Avatar
Jerome Lambert
(C'est limite débats, mais je préfère d'abord une réponse *technique*)

Bonsoir,

Coutumier des distributions binaires, je me suis attelé ce week-end à
l'installation d'une Gentoo 2004.3.

Avec le manuel, tout s'est bien passé (pas loin de 50h de compilation
sur un P-3 450), mais j'ai été stupéfait par ... le nombre de warning
lors de la compilation.

Est-ce normal, et ont-ils une incidence sur le bon fonctionnement des
programmes? Je pense notamment aux avertissements concernant une
comparaison entre pointeur et entier sans cast de celui-ci, ce qui, si
mes souvenirs sont bons, n'est pas une manière "propre" de travailler,
ou encore aux messages avertissant de l'utilisation de variable non
initialisées.

J'ai un peu d'expérience en programmation, et je me souviens que c'était
le genre de messages qui faisait sauter mon prof au plafond, d'où mon
inquiétude.

Merci de vos éclaircissements,

Jérôme.

10 réponses

1 2 3 4 5
Avatar
Ronald
Le Mon, 22 Nov 2004 19:25:43 +0100, Jerome Lambert a écrit :

[cut]
* Comment remplir la variable CFLAGS pour mon architecture (je pensais
mettre -O2 -march=athlon-xp -pipe ) ?


En lisant le manuel de gcc, je dirais -O3 -march=athlon-xp -pipe
-funroll-loops -fomit-frame-pointer

et puis un petit coup de cat /proc/cpuinfo pour voir ce que l'on peut
activer (sse, 3dnow, etc.), mais les pros me corrigeront.



Pas pro, mais de mon point de vue -O3 ne semble pas apporter grand chose
mis a part une occupation disque (et mémoire?) plus importante, je
pencherais pour -Os -march=athlon-xp -pipe -fomit-frame-pointer (peut
être -fpmath=sse). Et LDFLAGS=-s , si possible.


Avatar
billiob

[cut]

* Comment remplir la variable CFLAGS pour mon architecture (je pensais
mettre -O2 -march=athlon-xp -pipe ) ?


En lisant le manuel de gcc, je dirais -O3 -march=athlon-xp -pipe
-funroll-loops -fomit-frame-pointer

et puis un petit coup de cat /proc/cpuinfo pour voir ce que l'on peut
activer (sse, 3dnow, etc.), mais les pros me corrigeront.




Pas pro, mais de mon point de vue -O3 ne semble pas apporter grand chose
mis a part une occupation disque (et mémoire?) plus importante, je
pencherais pour -Os -march=athlon-xp -pipe -fomit-frame-pointer (peut
être -fpmath=sse). Et LDFLAGS=-s , si possible.


voici ce que me donne cat /proc/cpuinfo:

processor : 0
vendor_id : AuthenticAMD
cpu family : 6
model : 6
model name : AMD Athlon(tm) XP 2000+
stepping : 2
cpu MHz : 1666.932
cache size : 256 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 1
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 mmx fxsr sse syscall mmxext 3d nowext 3dnow
bogomips : 3301.37
Je suppose qu'il faut comprendre -mfpmath=sse à la place de -fpmath=sse

Avec ces falgs, puis-je ajouter d'autre options ?
Pourriez-vous m'expliquer à quoi servent -funroll-loops et
-fomit-frame-pointer, ou -momit-leaf-frame-pointer car la doc de gcc
m'est peu claire ?
--
@+
billiob
Utilisateur de Linux n°342916
Enregistrez-vous sur http:counter.li.org !!
Remplaçez INVALID par swissinfo pour m'envoyer un mail.



Avatar
Jerome Lambert
billiob wrote:
(...)
Je suppose qu'il faut comprendre -mfpmath=sse à la place de -fpmath=sse
Avec ces falgs, puis-je ajouter d'autre options ?
Pourriez-vous m'expliquer à quoi servent -funroll-loops et


C'est l'option la plus discutée dans les optimisations... ;-)

-funroll-loops déroule les boucles dont on connait par avance le nombre
de fois que l'opération se répète.

Ainsi, la boucle suivante exécute les instructions 10 fois:
pour i de 1 à 10 faire
<instructions>
fin_pour

optimisée, elle devient une répétition bout à bout:

<instructions>
<instructions>
...
<instructions>

Cela évite quelques opérations, comme l'incrémentation du i, le test
pour savoir si on continue ou si on arrète, etc.

Le problème est que cela ne marche que pour des boucles dont on connait
par avance le nombre d'itérations (10 dans l'exemple), ce qui est assez
rare. De même, le code généré est plus volumineux, donc il arrive que le
gain de vitesse soit perdu par la lourdeur du code, donc bof. Il faut
tester et voire si cela vaut la peine.

(...)

Avatar
no_spam
On Mon, 22 Nov 2004 20:33:54 +0100, billiob wrote:


[cut]

* Comment remplir la variable CFLAGS pour mon architecture (je pensais
mettre -O2 -march=athlon-xp -pipe ) ?


En lisant le manuel de gcc, je dirais -O3 -march=athlon-xp -pipe
-funroll-loops -fomit-frame-pointer

et puis un petit coup de cat /proc/cpuinfo pour voir ce que l'on peut
activer (sse, 3dnow, etc.), mais les pros me corrigeront.




Pas pro, mais de mon point de vue -O3 ne semble pas apporter grand chose
mis a part une occupation disque (et mémoire?) plus importante, je
pencherais pour -Os -march=athlon-xp -pipe -fomit-frame-pointer (peut
être -fpmath=sse). Et LDFLAGS=-s , si possible.



-Os génère du code optimisé pour la taille, généralement lent
(beaucoup de sauts et d'appels de fonction, pas d'inlining, ...).
-O3 est souvent buggé (et oui !).
Un bon compromis est -O2 -fexpensive-optimisations
Le '-fomit-frame-pointer' est à utiliser avec circonspection car il
empêche le debug et est complètement inadapté pour les libs de
développement.


voici ce que me donne cat /proc/cpuinfo:

processor : 0
vendor_id : AuthenticAMD
cpu family : 6
model : 6
model name : AMD Athlon(tm) XP 2000+
stepping : 2
cpu MHz : 1666.932
cache size : 256 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 1
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 mmx fxsr sse syscall mmxext 3d nowext 3dnow
bogomips : 3301.37
Je suppose qu'il faut comprendre -mfpmath=sse à la place de -fpmath=sse

Avec ces falgs, puis-je ajouter d'autre options ?


Pas besoin, -march=athlon-xp indique déjà celà.

Pourriez-vous m'expliquer à quoi servent -funroll-loops et
-fomit-frame-pointer, ou -momit-leaf-frame-pointer car la doc de gcc
m'est peu claire ?


-funroll-loops: gcc essaye d'optimiser les boucles en les déroulant:
par ex, si tu fait une boucle pour mettre la mémoire à zéro octet par
octet, il se rendra compte qu'il peut faire ça de façon beaucoup plus
sioux (c'est un exemple simplifié puisque memset est de toute façon
précompilé dans la libgcc...).
-fomit-frame-pointer: habituellement, les programmes gardent un pointeur
contenant l'adresse de la pile à l'entrée d'une fonction, ce qu'on
appelle la frame. C'est un peu embêtant car le i86 a très peu de
registres. Donc, cette option permet d'utiliser ce registre pour autre
chose. En contrepartie, ça peut compliquer un peu les fins de fonctions
puisque la restauration de la pile peut devenir non triviale et ça peut
empêcher le bon fonctionnement d'un débuggueur, qui a généralement
besoin de connaitre la frame pour savoir comment on est arrivé là ou on
est et ou sont stockées les variables locales.
-momit-leaf-frame-pointer est la même chose que -fomit-frame-pointer mais
uniquement sur les fonctions terminales, c'est à dire celles qui
n'appellent pas d'autre fonction.




Avatar
TiChou
Dans le message <news:41a228b9$0$3363$,
*billiob* tapota sur f.c.o.l.configuration :

Auriez-vous une petite doc pour savoir quoi mettre dans la variable cflags
?


Une référence en la matière :

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

Merci d'avoir pris de votre temps pour m'avoir lu.


De rien et bienvenue dans ce monde merveilleux qu'est la Gentoo. :-)

--
TiChou

Avatar
Jerome Lambert
TiChou wrote:
Dans le message <news:41a228b9$0$3363$,
*billiob* tapota sur f.c.o.l.configuration :

Auriez-vous une petite doc pour savoir quoi mettre dans la variable
cflags ?



Une référence en la matière :

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


Et hop, dans les bookmarks!!

Mais boouuuuh, il n'y a pas les options pour Amd64... :-(

Merci d'avoir pris de votre temps pour m'avoir lu.



De rien et bienvenue dans ce monde merveilleux qu'est la Gentoo. :-)



Merci bien...


Avatar
no_spam
On Tue, 23 Nov 2004 00:33:47 +0100, Jerome Lambert wrote:

billiob wrote:
(...)
Je suppose qu'il faut comprendre -mfpmath=sse à la place de -fpmath=sse
Avec ces falgs, puis-je ajouter d'autre options ?
Pourriez-vous m'expliquer à quoi servent -funroll-loops et


C'est l'option la plus discutée dans les optimisations... ;-)

-funroll-loops déroule les boucles dont on connait par avance le nombre
de fois que l'opération se répète.

Ainsi, la boucle suivante exécute les instructions 10 fois:
pour i de 1 à 10 faire
<instructions>
fin_pour

optimisée, elle devient une répétition bout à bout:

<instructions>
<instructions>
...
<instructions>

Cela évite quelques opérations, comme l'incrémentation du i, le test
pour savoir si on continue ou si on arrète, etc.

Le problème est que cela ne marche que pour des boucles dont on connait
par avance le nombre d'itérations (10 dans l'exemple), ce qui est assez
rare. De même, le code généré est plus volumineux, donc il arrive que le
gain de vitesse soit perdu par la lourdeur du code, donc bof. Il faut
tester et voire si cela vaut la peine.


Ca n'optimise pas uniquement les boucles dont on connait le nombre
d'itération à l'avance. Il y a pas mal d'autres cas qui peuvent être
optimisés en testant en début de boucle si le nombre d'itération
correspond à des critères particuliers. Le code généré est plus
volumineux mal il est rare qu'on y perde en vitesse, à moins d'avoir un
CPU avec des caches extrèmement petits: quand on a une boucle dont la
vitesse d'execution est critique, il vaut mieux s'assurer qu'elle ne soit
jamais éjectée du cache durant son execution.


Avatar
Michel Tatoute
Le Sun, 21 Nov 2004 22:42:03 +0100, Jerome Lambert a écrit :

(C'est limite débats, mais je préfère d'abord une réponse *technique*)

Bonsoir,

Coutumier des distributions binaires, je me suis attelé ce week-end à
l'installation d'une Gentoo 2004.3.

Avec le manuel, tout s'est bien passé (pas loin de 50h de compilation
sur un P-3 450), mais j'ai été stupéfait par ... le nombre de warning
lors de la compilation.


Ca y va, tu as raison

Est-ce normal, et ont-ils une incidence sur le bon fonctionnement des
programmes? Je pense notamment aux avertissements concernant une
comparaison entre pointeur et entier sans cast de celui-ci, ce qui, si
mes souvenirs sont bons, n'est pas une manière "propre" de travailler,
ou encore aux messages avertissant de l'utilisation de variable non
initialisées.


Pour la comparaison de pointeurs/entiers c'est pas terrible, mais c'est
parfois tres difficile à chercher. Surtout quand tu developpe de manière
générique.

Les fonctions des librairies que tu utilise peuvent avoir une interface
changeante.

Pour les variables non initialisées, malheureusement gcc est un peu trop
généreux... Parfois il se laisse emporter par un graphe excessif:

int f(int a)
{
int i;
switch(a) {
default:
i=0;
}
return i;
}

en general ce code annonce que i n'est pas initialisé... bien à tort. Si
des questions de perf interdisent d'initialiser i au départ, il faut
vivre avec le warning. Les prozelites (hum) du 0 warning diront que le
compilateur va éliminer l'init inutile en optimisant... mais c'est
justement par ce que il n'a pas vu l'inutilité qu'il va le laisser.

Sans critiqiue excessive, ajourd'hui (il y a peu en tout cas ) gcc n'est
pas tip top sur les warnings.

J'ai un peu d'expérience en programmation, et je me souviens que c'était
le genre de messages qui faisait sauter mon prof au plafond, d'où mon
inquiétude.

Merci de vos éclaircissements,



de rien.

Jérôme.
Michel.


Avatar
billiob
Dans le message <news:41a228b9$0$3363$,
*billiob* tapota sur f.c.o.l.configuration :

Auriez-vous une petite doc pour savoir quoi mettre dans la variable
cflags ?



Une référence en la matière :

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

Merci d'avoir pris de votre temps pour m'avoir lu.



De rien et bienvenue dans ce monde merveilleux qu'est la Gentoo. :-)

Merci tout le monde, je l'installerais ce week-end !

--
@+
billiob
Utilisateur de Linux n°342916
Enregistrez-vous sur http:counter.li.org !!
Remplaçez INVALID par swissinfo pour m'envoyer un mail.


Avatar
Sebastien Kirche
Le 21 nov 2004, Jerome Lambert a formulé :

Salut Jérôme,

En effet, c'est assez stupéfiant d'avoir un P-III 450/128Mo à peine
moins réactif qu'un Athlon64 3000+/1Go, le premier avec une Gentoo, le
second avec une Fedora Core 3 Amd64.


Troll à part, ça vaut *vraiment* le coup de se taper la compilation de
*tout* ? La machine est à ce point réactive ?

Je vois que l'architecture Sparc est supportée, ça pourrait redonner un coup
de fouet à ma chère SS20 (bi-75) ?

Vu que c'est ma passerelle et que ça m'embêterait de la couper trop
longtemps je me demande si je peux envisager la cross-compilation ?

Sébastien Kirche

1 2 3 4 5