sqrt et compilateur Visual C++

sqrt et compilateur Visual C++ - C++ - Programmation

Marsh Posté le 22-04-2009 à 20:47:55    

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.

Reply

Marsh Posté le 22-04-2009 à 20:47:55   

Reply

Marsh Posté le 22-04-2009 à 21:01:19    

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
Reply

Marsh Posté le 22-04-2009 à 21:45:06    

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.

Reply

Marsh Posté le 22-04-2009 à 23:22:19    

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?

Reply

Marsh Posté le 22-04-2009 à 23:23:48    

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

Reply

Marsh Posté le 24-04-2009 à 03:53:49    

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.

Reply

Marsh Posté le 24-04-2009 à 10:10:57    

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

Reply

Marsh Posté le 25-04-2009 à 19:12:10    

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.

Reply

Marsh Posté le 25-04-2009 à 19:47:32    

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

Reply

Marsh Posté le 25-04-2009 à 20:19:32    

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.

Reply

Marsh Posté le 25-04-2009 à 20:19:32   

Reply

Marsh Posté le 25-04-2009 à 21:21:58    

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

Reply

Sujets relatifs:

Leave a Replay

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