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 :
- #include <math.h>
- int main(void)
- {
- sqrt(71634.4174f);
- return 0;
- }
|
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.