Options de compilation gcc
Methodix
Messages postés
8
Date d'inscription
Statut
Membre
Dernière intervention
-
Methodix Messages postés 8 Date d'inscription Statut Membre Dernière intervention -
Methodix Messages postés 8 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Mon objectif est de connaître l'effet de certaines options de compilation sur le code assembleur résultant.
Je commence avec les options d'optimisation de gcc, par exemple -O1
L'option O1 déclenche les options suivantes[-fdefer-pop/-fmerge-constants/-fthread-jumps/-floop-optimize/-fcrossjumping/-fif-conversion/-fif-conversion2/-fdelayed-branch/-fguess-branch-probability/-fcprop-registers]
J'écris des sources C pour lesquelles chacunes des options précédentes sont sensées avoir un effet sur le code assembleur. Je compile une fois avec l'option , et une fois sans l'option.
Par exemple:
ccppc.exe -std=c89 -fno-loop-optimize -S Test_loop.c -o no_loop_opt.txt
ccppc.exe -std=c89 -floop-optimize -S Test_loop.c -o loop_opt.txt
Le fichier Test_loop par exemple ne contient qu'une boucle for dont le code assembleur doit être optimisé avec l'option -floop-optimize .
void test_Loop(T_uint16 a, T_uint16 b )
{
for (a=0; a < 12; a++)
{
a++;
}
}
Mais je n'obtiens aucune différence entre les deux sorties.
Est il normal que je n'obtienne pas de différences?
Y a-t-il des documents qui présentent les effets des options de compilation et les conditions (exemples de sources) où ces options d'optimisation ont un effet.?
Ma version de gcc est la version 3.3.2 (Wind River vxworks-6.2)
Mon objectif est de connaître l'effet de certaines options de compilation sur le code assembleur résultant.
Je commence avec les options d'optimisation de gcc, par exemple -O1
L'option O1 déclenche les options suivantes[-fdefer-pop/-fmerge-constants/-fthread-jumps/-floop-optimize/-fcrossjumping/-fif-conversion/-fif-conversion2/-fdelayed-branch/-fguess-branch-probability/-fcprop-registers]
J'écris des sources C pour lesquelles chacunes des options précédentes sont sensées avoir un effet sur le code assembleur. Je compile une fois avec l'option , et une fois sans l'option.
Par exemple:
ccppc.exe -std=c89 -fno-loop-optimize -S Test_loop.c -o no_loop_opt.txt
ccppc.exe -std=c89 -floop-optimize -S Test_loop.c -o loop_opt.txt
Le fichier Test_loop par exemple ne contient qu'une boucle for dont le code assembleur doit être optimisé avec l'option -floop-optimize .
void test_Loop(T_uint16 a, T_uint16 b )
{
for (a=0; a < 12; a++)
{
a++;
}
}
Mais je n'obtiens aucune différence entre les deux sorties.
Est il normal que je n'obtienne pas de différences?
Y a-t-il des documents qui présentent les effets des options de compilation et les conditions (exemples de sources) où ces options d'optimisation ont un effet.?
Ma version de gcc est la version 3.3.2 (Wind River vxworks-6.2)
A voir également:
- Gcc -g option
- Option d'ergonomie - Guide
- Option volte/vowifi - Guide
- G-talk - Télécharger - Messagerie
- G mail connexion - Guide
- Option empreinte digitale disparue ✓ - Forum Xiaomi
10 réponses
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.
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?
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
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;
}
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)
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.
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.
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?
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.
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