[c] Optimisation O3 de gcc

Optimisation O3 de gcc [c] - C - Programmation

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
 

Code :
  1. int somme1(int tableau[N][M])
  2. {
  3.    int i,j, somme;
  4.    somme = 0;
  5.    for (i=0; i < N; i++) {
  6.       for (j=0; j < M; j++) {
  7.          somme += tableau[i][j];
  8.       }
  9.    }
  10.    return somme;
  11. }
  12. int somme2(int tableau[N][M])
  13. {
  14.    int i,j, somme;
  15.    somme = 0;
  16.    for (j=0; j < M; j++) {
  17.       for (i=0; i < N; i++) {
  18.          somme += tableau[i][j];
  19.       }
  20.    }
  21.    return somme;
  22. }


 
 
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
Reply

Marsh Posté le 11-02-2004 à 13:49:56   

Reply

Marsh Posté le 11-02-2004 à 14:05:31    

fo comparer l assembleur :D


---------------
:: Light is Right ::
Reply

Marsh Posté le 11-02-2004 à 14:56:33    

-O3 fait de l'inline à gogo

Reply

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...
 


---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

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

Reply

Marsh Posté le 11-02-2004 à 15:57:28    

farib a écrit :


euh je pense pas que ça ait à voir...
 
 

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

Reply

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


---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

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
 
je voudrais juste savoir quelle est l'optimisation de gcc qui rend les deux algos équivalents


 
Tout simplement le fait qu'il se rende compte que l'ordre d'evaluation n'influe pas. IMHO

Reply

Marsh Posté le 11-02-2004 à 16:42:31    

Kristoph a écrit :


 
Tout simplement le fait qu'il se rende compte que l'ordre d'evaluation n'influe pas. IMHO


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 :)


Message édité par farib le 11-02-2004 à 16:43:11

---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 12-02-2004 à 00:08:30    

Reply

Marsh Posté le 12-02-2004 à 00:08:30   

Reply

Marsh Posté le 12-02-2004 à 00:09:49    

farib 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 :)


 
J'en sais rien. Tu n'as qu'à les essayer une par une pour trouver c'est laquelle qui compte.

Reply

Marsh Posté le 12-02-2004 à 00:29:16    

mais t'as essayé sur des vrais exemples qui durent plusieurs secondes ?!!!

Reply

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.
 

Reply

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.

Reply

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


---------------
:: Light is Right ::
Reply

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...


Message édité par bjone le 12-02-2004 à 01:07:45
Reply

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" :D


---------------
:: Light is Right ::
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed