sqrt et compilateur Visual C++ - C++ - Programmation
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
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.
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. |
OK, j'essaye d'utiliser #pragma intrinsic(sqrt) mais bizarrement ce n'est pas reconnu par le compilo:
Code :
|
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?
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.
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 |
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.
Marsh Posté le 24-04-2009 à 10:10:57
youplab00m a écrit : |
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
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.
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
Sinon mouais moi aussi avec Borland C++ 0.1 mon code est naze ...
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.
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:
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:
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.