Options de compilation gcc
Fermé
Methodix
Messages postés
8
Date d'inscription
mercredi 2 septembre 2009
Statut
Membre
Dernière intervention
9 septembre 2009
-
2 sept. 2009 à 16:09
Methodix Messages postés 8 Date d'inscription mercredi 2 septembre 2009 Statut Membre Dernière intervention 9 septembre 2009 - 9 sept. 2009 à 16:19
Methodix Messages postés 8 Date d'inscription mercredi 2 septembre 2009 Statut Membre Dernière intervention 9 septembre 2009 - 9 sept. 2009 à 16:19
A voir également:
- Gcc -g option
- Option booster free avis - Accueil - Guide opérateurs et forfaits
- Option d'ergonomie - Guide
- Aucune option d'alimentation n'est actuellement disponible - Guide
- G-talk - Télécharger - Messagerie
- Outils option internet ✓ - Forum Windows 10
10 réponses
dubcek
Messages postés
18758
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
24 décembre 2024
5 623
3 sept. 2009 à 16:44
3 sept. 2009 à 16:44
je ne vois pas ce qu'un optimiseur pourrait simplifier dans .
for (a=0; a < 3; a++)
{
abs(a);
}
for (a=0; a < 3; a++)
{
abs(a);
}
dubcek
Messages postés
18758
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
24 décembre 2024
5 623
2 sept. 2009 à 16:15
2 sept. 2009 à 16:15
hello
je pense qu'avec juste a++ dans la boucle, il n'y a pas grand chose à optimiser. Essaye avec du code plus complexe.
je pense qu'avec juste a++ dans la boucle, il n'y a pas grand chose à optimiser. Essaye avec du code plus complexe.
Methodix
Messages postés
8
Date d'inscription
mercredi 2 septembre 2009
Statut
Membre
Dernière intervention
9 septembre 2009
3 sept. 2009 à 14:36
3 sept. 2009 à 14:36
Salut
Je pense qu'il ne s'agit pas d'un probleme de code trop simple. Pour essai j'ai pris le codes suivant
void test_Loop(T_uint16 a, T_uint16 b )
{
for (a=0; a < 3; a++)
{
abs(a);
}
}
Ce code est sensé être optimisé en assembleur par l'appel de trois fois abs() avec l'option -floop-optimize
abs(0); abs(1); abs(2);
Ce qui n'est tjrs pas le cas, n'y aurait -il pas un bug de gcc à ce niveau?
Je pense qu'il ne s'agit pas d'un probleme de code trop simple. Pour essai j'ai pris le codes suivant
void test_Loop(T_uint16 a, T_uint16 b )
{
for (a=0; a < 3; a++)
{
abs(a);
}
}
Ce code est sensé être optimisé en assembleur par l'appel de trois fois abs() avec l'option -floop-optimize
abs(0); abs(1); abs(2);
Ce qui n'est tjrs pas le cas, n'y aurait -il pas un bug de gcc à ce niveau?
dubcek
Messages postés
18758
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
24 décembre 2024
5 623
3 sept. 2009 à 14:54
3 sept. 2009 à 14:54
l'optimiseur ne sait pas combien de fois s'exécutera la boucle,
-floop-optimize
Perform loop optimizations: move constant expressions out of loops, simplify exit test conditions and optionally do strength-reduction as well.
l'optimiseur doit sortir le x=0 de la boucle :
pour les bugs: https://gcc.gnu.org/bugs/
-floop-optimize
Perform loop optimizations: move constant expressions out of loops, simplify exit test conditions and optionally do strength-reduction as well.
l'optimiseur doit sortir le x=0 de la boucle :
int x, y; for (a=0; a < 3; a++) { x=0; y=x+a; abs(a); }
pour les bugs: https://gcc.gnu.org/bugs/
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
3 sept. 2009 à 14:54
3 sept. 2009 à 14:54
Je ne sais pas si il y a grand chose à optimiser dans ton code. Essai :
int b=0;
for (a=0; a < 3; a=a+1)
{
b+=1;// ou : b=5;
}
int b=0;
for (a=0; a < 3; a=a+1)
{
b+=1;// ou : b=5;
}
Methodix
Messages postés
8
Date d'inscription
mercredi 2 septembre 2009
Statut
Membre
Dernière intervention
9 septembre 2009
3 sept. 2009 à 16:04
3 sept. 2009 à 16:04
Salut dubcek
l'option -floop-optimize fait aussi du déroulement de boucle, ce qui peut accroitre la vitesse d'execution
" optionally do strength-reduction and loop unrolling as well."
Char Snipeur J'ai essayé ton bout de code avec les deux chaines de commandes
ccppc.exe -std=c89 -floop-optimize -S Test_loop.c -o test1.txt
ccppc.exe -std=c89 -S Test_loop.c -o test2.txt
Le code assembleur est identique.
Je suis obligé de penser à un bug de gcc 3.3.2 (VxWorks)
l'option -floop-optimize fait aussi du déroulement de boucle, ce qui peut accroitre la vitesse d'execution
" optionally do strength-reduction and loop unrolling as well."
Char Snipeur J'ai essayé ton bout de code avec les deux chaines de commandes
ccppc.exe -std=c89 -floop-optimize -S Test_loop.c -o test1.txt
ccppc.exe -std=c89 -S Test_loop.c -o test2.txt
Le code assembleur est identique.
Je suis obligé de penser à un bug de gcc 3.3.2 (VxWorks)
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
3 sept. 2009 à 16:23
3 sept. 2009 à 16:23
essai de compiler avec l'option -O0 pour voir si il y a une différence.
Je ne suis pas sur que l'on puisse dire que ça soit un bug. Mais si tu le pense vraiment laisse un message sur le forum gcc. Mais je ne sais pas si il sera pris en compte : on en est à la version 4 de gcc.
Essai de te renseigner sur ce que fait exactement cet algorithme.
Je ne suis pas sur que l'on puisse dire que ça soit un bug. Mais si tu le pense vraiment laisse un message sur le forum gcc. Mais je ne sais pas si il sera pris en compte : on en est à la version 4 de gcc.
Essai de te renseigner sur ce que fait exactement cet algorithme.
Les compilateurs sont des bêtes de courses, et l'optimisation, ils connaissent. Voici des programmes différents qui donnent le même binaire:
Ainsi mettre une boucle vide ( for(i=0; i<1000000000; i++); ) histoire de passer un certain temps, ne sert strictement à rien.
Remerciement aux concepteurs de ces fabuleux compilateurs.
Bonne continuation.
int main() { return(0); } int main() { int i; for (i=0; i<10;) i++; return(0); } int main() { int i; for (i=0; i<10; i++) sin(i); return(0); }Moralité: le compilateur (en l'occurence 'gcc') sait bien détecter les lignes de code inutiles et les élimine.
Ainsi mettre une boucle vide ( for(i=0; i<1000000000; i++); ) histoire de passer un certain temps, ne sert strictement à rien.
Remerciement aux concepteurs de ces fabuleux compilateurs.
Bonne continuation.
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
4 sept. 2009 à 08:19
4 sept. 2009 à 08:19
Oui, mais si vous désactivez les optimisations, en théorie, vous ne devriez pas avoir la même chose.
Oui c'est vrai, pour ces exemples, j'ai oublié de le préciser, j'ai utilisé 'gcc 4.3.2' avec simplement l'option 'O2' ce qui est souvent le cas. Gentiment le compilateur nous signale pour la ligne avec 'sin(i)': déclaration sasn effet (avec la faute d'orthographe!) - inutile de préciser qu'il faut utiliser l'option '-Wall', mais comme cela va sans le dire, je ne le dis pas (d'ailleurs c'est inutile de la préciser) ;-).
Bonne journée.
Bonne journée.
Methodix
Messages postés
8
Date d'inscription
mercredi 2 septembre 2009
Statut
Membre
Dernière intervention
9 septembre 2009
9 sept. 2009 à 16:19
9 sept. 2009 à 16:19
Bonjour,
Une autre façon de poser la question? J'utilise gcc 3.3.2
Est il possible d'utiliser certaines des options contenues dans -O1 en désactivant les autres,
Par exemple
[-O1 -fno-defer-pop] donne le même résulat en assembleur que [ -O1].
Comme si -fno-defer-pop n'avait pas d'effet quand on active déjà -O1.
Et je suis bien sûr qu'il ne s'agit pas d'un problème de code car cette option agit normalement lors de l'appel de plusieurs fonctions, donc facilement testable.
Il me semble que sur gcc 3.3.2 il soit impossible de déscativer certaines options ,
Quelqu'un peut il le confirmer?
Une autre façon de poser la question? J'utilise gcc 3.3.2
Est il possible d'utiliser certaines des options contenues dans -O1 en désactivant les autres,
Par exemple
[-O1 -fno-defer-pop] donne le même résulat en assembleur que [ -O1].
Comme si -fno-defer-pop n'avait pas d'effet quand on active déjà -O1.
Et je suis bien sûr qu'il ne s'agit pas d'un problème de code car cette option agit normalement lors de l'appel de plusieurs fonctions, donc facilement testable.
Il me semble que sur gcc 3.3.2 il soit impossible de déscativer certaines options ,
Quelqu'un peut il le confirmer?
9 sept. 2009 à 14:18
L'option -O fait du déroulement de boucle (loop unrolling) pour ganger du temps en execution, en effet dans la boucle for tu as à la fois la gestion de la boucle qui demande du code et la gestion de l'appel de fonction.
Lorsque tu déroules, tu n'as plus que la gestion de la l'appel de la fonction.
Sur l'imprim Ecran tu as à gauche la compil sans optimisation:
la boucle est gérée en 3 partie, le bloc de control(L2) qui suvant condition envoie vers le bloc d'execution principale (L5) ou vers le bloc de sortie (L1).
A droite avec l'optimisation tout est fait en un bloc (L6)qui s'appelle lui meme trois fois.
9 sept. 2009 à 14:22
stwu 1,-32(1)
mflr 0
stw 31,28(1)
stw 0,36(1)
li 31,0
.L6:
mr 3,31
crxor 6,6,6
bl abs
addi 0,31,1
rlwinm 31,0,0,0xffff
cmplwi 7,31,2
ble+ 7,.L6
lwz 0,36(1)
mtlr 0
lwz 31,28(1)
addi 1,1,32
blr.
Sans optimisation
stwu 1,-48(1)
mflr 0
stw 31,44(1)
stw 0,52(1)
mr 31,1
mr 0,3
sth 0,8(31)
li 0,0
sth 0,8(31)
.L2:
lhz 0,8(31)
rlwinm 0,0,0,0xffff
cmplwi 7,0,2
ble 7,.L5
b .L1
.L5:
lhz 0,8(31)
rlwinm 0,0,0,0xffff
mr 3,0
crxor 6,6,6
bl abs
lhz 9,8(31)
addi 0,9,1
sth 0,8(31)
b .L2
.L1:
lwz 11,0(1)
lwz 0,4(11)
mtlr 0
lwz 31,-4(11)
mr 1,11