Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
5203 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Optimisation douteuse pour hypot()

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Optimisation douteuse pour hypot()

n°1514070
dave_teteh​i
cat /dev/urandom > /dev/fb0
Posté le 13-02-2007 à 13:25:30  profilanswer
 

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.
 

mood
Publicité
Posté le 13-02-2007 à 13:25:30  profilanswer
 

n°1514073
Elmoricq
Modérateur
Posté le 13-02-2007 à 13:38:11  profilanswer
 

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]

n°1514096
0x90
Posté le 13-02-2007 à 14:35:44  profilanswer
 

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.
n°1514156
Taz
bisounours-codeur
Posté le 13-02-2007 à 16:23:06  profilanswer
 

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.
 

n°1514196
dave_teteh​i
cat /dev/urandom > /dev/fb0
Posté le 13-02-2007 à 17:44:35  profilanswer
 

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

n°1514234
Sve@r
Posté le 13-02-2007 à 18:56:02  profilanswer
 

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.
n°1514238
dave_teteh​i
cat /dev/urandom &gt; /dev/fb0
Posté le 13-02-2007 à 19:12:50  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Optimisation douteuse pour hypot()

 

Sujets relatifs
Optimisation C++/SqlTween - probleme et optimisation
optimisation des requetes SQLOptimisation PHP/Apache
[Oracle ASM] Problème d'optimisation de requête suite à migrationOptimisation de code et délai d'exécution
[Oracle] Optimisation d'une requête de mise à jourOptimisation - Techniques d'animation par pixels
optimisation ...[ORA] - Optimisation d'une requete
Plus de sujets relatifs à : Optimisation douteuse pour hypot()


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)