Optimisation douteuse pour hypot()

Optimisation douteuse pour hypot() - C - Programmation

Marsh Posté le 13-02-2007 à 13:25:30    

Bonjour,
J'ai une question sans grand intéret, mais qui m'embête un peu.
 
hypot(a,b) (dans math.h) est sensé retourner sqrt(a*a + b*b).
Seulement, l'utilisation de hypot() (avec l'option -O3) me donne 163 cycles processeurs (les fonctions d'entrée-sortie sont utiles pour éviter les optimisations inconvenantes.

Code :
  1. int a, b, c;
  2. scanf("%d %d", &a, &b);
  3. c = hypot(a, b);
  4. printf("%d %d %d\n", a, b, c);


Maintenant le problème (si c'est réellement un problème), c'est quand je remplace hypot() par dist(), j'obtient 126 cycles processeurs.

Code :
  1. int dist(int a, int b)
  2. {
  3. int aa;
  4. int bb;
  5. int c;
  6. aa = a*a;
  7. bb = b*b;
  8. c = aa+bb;
  9. return sqrt(c);
  10. }


A mon avis c'est:
  _Soit une histoire de pipeline.
  _Soit le fait que hypot() travail tout du long avec des double (Il y'a quand même sqrt() dans dist()).
 
Quoi qu'il en soit, si l'on travaille uniquement sur des entiers, c'est visiblement plus efficace de définir sa propre fonction.
 

Reply

Marsh Posté le 13-02-2007 à 13:25:30   

Reply

Marsh Posté le 13-02-2007 à 13:38:11    

Puisque tu y es, tu devrais également optimiser pour avoir un sqrt() qui ne travaille qu'avec des entiers. J'veux dire, autant aller jusqu'au bout, hein ?  [:mullet]

Reply

Marsh Posté le 13-02-2007 à 14:35:44    

plus efficace mais plus limité aussi...
 
teste ta fonction avec a=b=32768 par exemple...


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 13-02-2007 à 16:23:06    

tu ne travaille pas uniquement avec des entiers puisque tu utilises sqrt ...  
 
et comme dis l'autre, bonjour les overflow.
 
si t'en es à faire de la parano de performances alors que t'en es à utiliser scanf, faudrait voir à arrêter la branlette intellectuelle. Fais un programme correct.
 

Reply

Marsh Posté le 13-02-2007 à 17:44:35    

Taz a écrit :

tu ne travaille pas uniquement avec des entiers puisque tu utilises sqrt ...  
 
et comme dis l'autre, bonjour les overflow.
 
si t'en es à faire de la parano de performances alors que t'en es à utiliser scanf, faudrait voir à arrêter la branlette intellectuelle. Fais un programme correct.


 
Pour le sqrt(), j'aurais pas du préciser en début de post que srqt() travail avec des double.
Pour les overflow, c'est indéniable... Mais pour des valeurs relativement limitées, ca le fait bien quand même
 
Bien entendu, faut être vraiment stupide pour insérer des operations d'entré-sortie dans une évaluation de temps (ou alors, pour une centaine de cycle, votre scanf est très rapide  :whistle: <- je ne sais pas de qui viens l'incohérence). Je ne vois vraiment pas pourquoi je me mange tous les blâmes du monde, ca peut énormément servir dans certain cas (pas si rare que ça).
 

Citation :


  Puisque tu y es, tu devrais également optimiser pour avoir un sqrt() qui ne travaille qu'avec des entiers. J'veux dire, autant aller jusqu'au bout, hein ?  [:mullet]


 
C'est vrai quoi, ca peut arriver de temps en temps de vouloir calculer la distance euclidienne, et de vouloir rester sur des entiers... :D  <- bien sûr c'est une blague, y'a qua voire la quantité d'interface graphique ou de wm (par ex,  pour gérer la distance entre 2 fenêtres) qui utilise soit cette fonction, soit une implémentation personnelle plus ou moins efficace. Alors, en 6 lignes de codes,  obtenir le 3/4 du temps d'une fonction (sensé optimisée), c'est bon à savoir, nen? Mais c'est vrai, elle est sur des réels...

Reply

Marsh Posté le 13-02-2007 à 18:56:02    

dave_tetehi a écrit :

hypot(a,b) (dans math.h) est sensé retourner sqrt(a*a + b*b).
<...>
A mon avis c'est:
  _Soit une histoire de pipeline.
  _Soit le fait que hypot() travail tout du long avec des double (Il y'a quand même sqrt() dans dist()).


Ou alors, histoire d'optimiser le bouzin vers le bas, hypot(a,b) retourne sqrt(pow((double)a, 2.0) + pow((double)b, 2.0))  :sol:

Message cité 1 fois
Message édité par Sve@r le 13-02-2007 à 18:56:29

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 13-02-2007 à 19:12:50    

Sve@r a écrit :

Ou alors, histoire d'optimiser le bouzin vers le bas, hypot(a,b) retourne sqrt(pow((double)a, 2.0) + pow((double)b, 2.0))  :sol:


Pas la peine, John Carmack est là pour ça  :D  
http://fr.wikipedia.org/wiki/John_Carmac

Reply

Sujets relatifs:

Leave a Replay

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