2010-10-29 14 views
2

Im essayant d'optimiser mon application d'exercice dans VS2010. Fondamentalement, j'ai plusieurs sqrt, pow et memset dans la boucle de base. Plus précisément, ce que je fais:Comment puis-je savoir si la version intrinsèque de la fonction est utilisée à partir du démontage?

// in a cpp file ... 
#include <cmath> 

#pragma intrinsic(sqrt, pow, memset) 
void Simulator::calculate() 
{ 
    for(int i=0; i<NUM; i++) 
    { 
    ... 
    float len = std::sqrt(lenSq); 
    distrib[0] = std::pow(baseVal, expVal); 
    ... 
    clearQuad(i); // invokes memset 
    } 
} 

Après la construction, le démontage montre que, par exemple, l'appel de sqrt compile toujours comme « appel _CIsqrt (0x ####) » ne change rien que ce soit le drapeau/Oi est activé ou non.

Quelqu'un peut-il expliquer comment je peux activer la version intrinsèque et comment puis-je la vérifier avec le code de désassemblage? (j'ai également activé dans les paramètres du projet du/O2.)

Merci

Edit: Problème résolu en ajoutant/fp: rapide. Pour sqrt, par exemple, la version intrinsèque utilise un seul "fsqrt" pour remplacer la version std "appel __CIsqrt()". Malheureusement, dans mon cas, la version intrinsèque est 5% plus lente.

Un grand merci à Zan Lynx et mch.

Répondre

1

Vous compilez le code machine et non .NET CLR. Droite?

Si vous compilez vers .NET, le code ne sera pas optimisé avant d'être exécuté via JIT. À ce stade, NET a ses propres intrinsèques et d'autres choses qui vont arriver. Si vous compilez le code machine natif, vous pouvez jouer avec le /arch option et le /fp:fast option.

+0

Testé, résultat positif. Le/fp: rapide le résout. Je vous remercie – Veg

2

L'utilisation de l'espace de noms std C++ peut entraîner que le compilateur n'utilise pas les intrinsèques. Essayez de supprimer std:: de vos appels sqrt, pow et memset.

La documentation de MSDN Library pour #pragma intrinsic offre un exemple pour tester si la valeur intrinsèque est réellement utilisée: compilez avec l'indicateur -FAs et examinez le fichier .asm résultant. En regardant le désassemblage dans le débogueur, comme vous semblez déjà le faire, devrait également montrer l'intrinsèque plutôt que call.

+0

1) J'ai supprimé le fichier std :: et j'ai quand même obtenu le même résultat. 2) Si sqrt, pow et memset sont fournis par le compilateur, dois-je inclure au début? – Veg

+0

Je pense que cl est assez permissif sur les fonctions CRT fonctionnant toujours si vous incluez un en-tête pour eux ou non. Cela n'a probablement pas d'importance, mais est-ce que c'est x86 ou x64? Avez-vous essayé de compiler le fichier à la main sur la ligne de commande? – mch

+0

l'arc de code est x86. Je n'ai pas essayé la compilation en ligne de commande à la main. De plus, je viens de le tester sans #include: la compilation a échoué. La sortie indique que sqrt a besoin d'une définition. – Veg