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

  FORUM HardWare.fr
  Programmation
  C++

  sqrt et compilateur Visual C++

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

sqrt et compilateur Visual C++

n°1876449
taoa
Posté le 22-04-2009 à 20:47:55  profilanswer
 

Bonjour
 
Une question me trotte l'esprit:
 
Supposons que:
1) l'on crée un nouveau projet C++ (Empty C++) sous Visual Studio Express 2008.
2) l'on possède un Core 2 Duo 6400 @ 2.13GHz comme le mien ou un truc du genre
3) l'on écrive, compile et exécute ce code:
 

Code :
  1. #include <math.h>
  2. int main(void)
  3. {
  4.     sqrt(71634.4174f);
  5.     return 0;
  6. }


 
L'exécution de sqrt(71634.4174f); va-t-elle mapper une (ou un set d') instruction(s) mathématique(s) implantée(s) dans le processeur, ou bien va-t-on faire recours à une implémentation du calcul de la racine carrée issue de ce qu'on trouve dans les bibliothèques pointées par math.h. Et dans ce dernier cas, y a-t-il moyen de faire en sorte que le programme fasse usage des instructions mathématiques implantées dans le CPU, sans plonger dans de l'écriture de microcode en assembleur?
 
Pour info, Je trouve dans cet article (attention pdf) ceci, à propos des Core 2 Duos:
 

Citation :

Sqrt is an intrinsic on the SSE-platform, and thus reduces to a single instruction. The implementation for ppu/spu is based on the inverse-square-root estimate intrinsic of these platforms. This instruction is combined with one iteration of the Newton-Raphson algorithm to provide the final result.


 
Je m'étonne au passage (et avec admiration) que leur implémentation soit capable d'obtenir une valeur suffisamment précise avec une seule itération de l'algo de Newton. Leur approximation de base doit être diablement bonne. Ca me rappelle 0x5f3759df :)
 
 
Je demande ça parce que j'ai testé le temps d'exécution de 10 millions de fois une sqrt() et 10 millions de fois une fonction racine obtenue par l'algo de Newton, justement, et j'ai été surpris d'obtenir un temps 2/3 voire 3/4 inférieur avec un code fait à la main.
 
Donc: qu'est-ce que le compilo de VC++ va faire avec un code comme ça?
 
Merci.

mood
Publicité
Posté le 22-04-2009 à 20:47:55  profilanswer
 

n°1876465
Joel F
Real men use unique_ptr
Posté le 22-04-2009 à 21:01:19  profilanswer
 

sqrt appelle l'implentation de libc qui selon les vendeurs sera optimisées ou pas. Sous VC, il doit utiliser l'implantation issue de IEE 754 SUN MATH ou approchant.

 

1 passe de Newton-Raphson suffit du moment ou ton approximation est à 10-4 pres pour etre amené à 10-8. C'est la meme astuce en Altivec.
Et au fait, on ecrit plus d'assembleur pr faire du SSE depuis genre 10 ans, faudrait voir à ce tenir au jus :o

Message cité 1 fois
Message édité par Joel F le 22-04-2009 à 21:03:29
n°1876488
jesus_chri​st
votre nouveau dieu
Posté le 22-04-2009 à 21:45:06  profilanswer
 

sous visual il y a un pragma pour activer les intrinsics, y compris sqrt. On peut aussi utiliser une option du compilo, je sais plus laquelle.
Ca dépend de ton compilateur et de sa configuration, pas de ton processeur.
 
En cas de doute, compile en release + info de debug (c'est possible) et regarde l'asm.

n°1876554
taoa
Posté le 22-04-2009 à 23:22:19  profilanswer
 

jesus_christ a écrit :

sous visual il y a un pragma pour activer les intrinsics, y compris sqrt. On peut aussi utiliser une option du compilo, je sais plus laquelle.
Ca dépend de ton compilateur et de sa configuration, pas de ton processeur.
 
En cas de doute, compile en release + info de debug (c'est possible) et regarde l'asm.


 
OK, j'essaye d'utiliser #pragma intrinsic(sqrt) mais bizarrement ce n'est pas reconnu par le compilo:

Code :
  1. 1>.\sq.cpp(1) : warning C4164: 'sqrt' : intrinsic function not declared


Je me suis assuré de compiler en activant les instrinsics (/Oi) et avec une certaine optimisation, même minimale (/O1)
 
J'ai donc encore raté un train. Mais lequel? Oubliais-je un #include?

n°1876555
taoa
Posté le 22-04-2009 à 23:23:48  profilanswer
 

Mille et un oups. J'avais bêtement mis la ligne de pragma avant celle du include.
Tout va bien.

n°1877096
youplab00m
Posté le 24-04-2009 à 03:53:49  profilanswer
 

Joel F a écrit :

Et au fait, on ecrit plus d'assembleur pr faire du SSE depuis genre 10 ans, faudrait voir à ce tenir au jus :o


Gnééé?  
Je sais pas ou t'as vu ca, mais y'a des gens qui ecrivent de l'assembleur SSE tous les jours, et qui travaillent pour de grandes compagnies hi tech.
Certes, pas forcement pour des applications grand public, mais ca existe.
Sous VC la compilation des intrinsics SSE ne donne tout le temps pas le meme resultat que l'assembleur inline.

n°1877179
Joel F
Real men use unique_ptr
Posté le 24-04-2009 à 10:10:57  profilanswer
 

youplab00m a écrit :


Gnééé?  
Je sais pas ou t'as vu ca, mais y'a des gens qui ecrivent de l'assembleur SSE tous les jours, et qui travaillent pour de grandes compagnies hi tech.
Certes, pas forcement pour des applications grand public, mais ca existe.
Sous VC la compilation des intrinsics SSE ne donne tout le temps pas le meme resultat que l'assembleur inline.


 
C'est qu'ils utilisent un compilateur completement à chier. Je vois comment tu peut avoir un code différent entre faire du naked avec movaps etc et appeler mm_load etc qui ne sont QUE des amcros autour de ces dits appels assembleurs :o

n°1877761
jesus_chri​st
votre nouveau dieu
Posté le 25-04-2009 à 19:12:10  profilanswer
 

youplab00m a écrit :

Sous VC la compilation des intrinsics SSE ne donne tout le temps pas le meme resultat que l'assembleur inline.


Ben tu vois je suis d'accord, j'utilise moi aussi l'assembleur en dur plutôt que les intrinsics, déjà parce que c'est un poil + portable (avec NASM) mais surtout parce qu'avec les intrinsics, une fois que je regardais l'assembleur généré, c'était n'importe quoi.
Celà dit je parle de VC6 + SP5 + processor pack. Je n'ai plus essayé avec un compilo + récent.
De toute façon une fois qu'on a un peu l'habitude de l'ASM ça devient pas plus dur que les intrinsics, tout en étant, à mon gout, plus propre.

n°1877770
Joel F
Real men use unique_ptr
Posté le 25-04-2009 à 19:47:32  profilanswer
 

:[ j'ai envie de vomir en lisant ça. Je vosi comment de l'assembleur nu avec une synatxe à chier est plsu propre que des fonctions C. Dites juste que vous avez pas envie d'essayer quoi :o
 
Sinon mouais moi aussi avec Borland C++ 0.1  mon code est naze ...

n°1877774
jesus_chri​st
votre nouveau dieu
Posté le 25-04-2009 à 20:19:32  profilanswer
 

ben moi c'est voir un langage embarqué dans un autre qui me gène. J'aime avoir du code C++ ou ASM mais pas les deux, surtout si ça détruit la compatibilité. Essaye de faire un projet ayant au choix du C/ASM ou du C pur, genre Lame.
Dans un cas on configure juste le fichier à compiler (truc.asm ou truc.c) dans l'autre on pourri son code à coup de #if.
Et pour le faire compatible VC++/gcc, rien que ça, va courrir.
et entre
 
__sse_mpackadd( mm1, mm2 );
 
et  
 
mpadd xmm1, xmm2
 
je vois pas une différence énorme.

mood
Publicité
Posté le 25-04-2009 à 20:19:32  profilanswer
 

n°1877778
Joel F
Real men use unique_ptr
Posté le 25-04-2009 à 21:21:58  profilanswer
 

c'ets moi ou on dit la meme chose ....


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

  sqrt et compilateur Visual C++

 

Sujets relatifs
créer projet à partir de code sous visual studio 2008 [10€!]nombre premier visual basic
[RESOLU] - [C#] - Lancement et Création de Thread[C][GTK] Problème de signal_connect
equivalent de #define en C#[C++] Utiliser le pointeur this dans le constructeur
Interfacer Python et C++[C#] upload sur serveur + erreur 550
Conseils IHM Visual Studio 2005Interface C/Ada + SDL
Plus de sujets relatifs à : sqrt et compilateur Visual C++


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR