Optimisation O3 de gcc [c] - C - Programmation
Marsh Posté le 11-02-2004 à 14:05:31
fo comparer l assembleur
Marsh Posté le 11-02-2004 à 15:27:35
taz a écrit : -O3 fait de l'inline à gogo |
euh je pense pas que ça ait à voir...
Marsh Posté le 11-02-2004 à 15:29:33
mais bon tes mesures sont élagement soumises à des alea. fait des calcul qui te permettent d'avoir un temps d'exécution >=10sec
Marsh Posté le 11-02-2004 à 15:57:28
farib a écrit : |
bah ouais, j'ai répondu un peu à coté de la plaque, j'avais pas vraiment lu, et je pensais que tu faisais plusieurs milleirs d'appels à ta fonction pour la tester, mais non, donc l'inline n'influe pas.
1) prends le temps moyen sur un bon millier d'appel
2) fais en sorte que la durée de l'appel ne soit pas infinitésimale
Marsh Posté le 11-02-2004 à 16:27:41
c'est bon pour l'appel, les résultats sont normaux, et j'obtiens le même ordre de grandeur à chaque fois
je voudrais juste savoir quelle est l'optimisation de gcc qui rend les deux algos équivalents
Marsh Posté le 11-02-2004 à 16:28:59
farib a écrit : c'est bon pour l'appel, les résultats sont normaux, et j'obtiens le même ordre de grandeur à chaque fois |
Tout simplement le fait qu'il se rende compte que l'ordre d'evaluation n'influe pas. IMHO
Marsh Posté le 11-02-2004 à 16:42:31
Kristoph a écrit : |
cad ? c'est à dire qu'il fait justement le raisommement que les accès mémoires pénalisent, et que faire la somme dans l'autre sens fonctionne mieux ?
c'est quoi le nom de cette optimisation ( notemment dans les options de gcc ?)
sympa
Marsh Posté le 12-02-2004 à 00:08:30
ReplyMarsh Posté le 12-02-2004 à 00:09:49
farib a écrit : |
J'en sais rien. Tu n'as qu'à les essayer une par une pour trouver c'est laquelle qui compte.
Marsh Posté le 12-02-2004 à 00:29:16
mais t'as essayé sur des vrais exemples qui durent plusieurs secondes ?!!!
Marsh Posté le 12-02-2004 à 00:39:30
j'aurais le déroulement de boucle, mais il est anormal qu'au premier jeu, somme 1 < somme 2 et qu'au deuxième somme 2 < somme 1.
Marsh Posté le 12-02-2004 à 00:46:10
bjone a écrit : j'aurais le déroulement de boucle, mais il est anormal qu'au premier jeu, somme 1 < somme 2 et qu'au deuxième somme 2 < somme 1. |
Oui mais le deuxième c'est une difference de 3 ms seulement. Pas vraiment signification quoi.
Il suffit que après optim gcc génère le même code exactement et que le deuxième passage profite du fait qu'une partie du tableau est déjà en cache.
Marsh Posté le 12-02-2004 à 00:59:56
a mon avis il est moins gourmand de parcourir le tableau par colonne puis par ligne ke l inverse, il y a plus de calculs je pense
Marsh Posté le 12-02-2004 à 01:07:27
bah c'est pas que ça, de ligne à ligne, tu vas à l'encontre du système de ligne de la mémoire cache, et tu t'as moins chances de faire un cache hit dans le TLB...
Marsh Posté le 12-02-2004 à 01:13:05
bjone a écrit : bah c'est pas que ça, de ligne à ligne, tu vas à l'encontre du système de ligne de la mémoire cache, et tu t'as moins chances de faire un cache hit dans le TLB... |
oui, le fait de passer de ligne en ligne pour chaque colonne c est n est pas le mecanisme "normal"
Marsh Posté le 11-02-2004 à 13:49:56
j'ai un tp ou pour mettre en évidence des pb de pagination mémoire et d'optimisation, je calcule la somme de tous les éléments d'un tableau a deux dimensions de deux manières : par colonne , puis par ligne, et je mesure leur temps d'exécution
M=N=2048
lorsque je passe en O3, les deux algos sont prèsques identiques
13:48 farib@alizee ~% gcc -O2 tp4.c -o o2
13:48 farib@alizee ~% gcc -O3 tp4.c -o o3
13:49 farib@alizee ~% ./o2
Le temps d'excécution de la fonction somme1 est 54097 microsecondes
Le temps d'exécution de la fonction somme2 est 144731 microsecondes
13:49 farib@alizee ~% ./o3
Le temps d'excécution de la fonction somme1 est 41750 microsecondes
Le temps d'exécution de la fonction somme2 est 38920 microsecondes
quelle est donc l'optimisation utilisée qui peut produire un tel résultat ?
Message édité par farib le 11-02-2004 à 14:06:52
---------------
Bitcoin, Magical Thinking, and Political Ideology