¿Cómo puedo saber si la versión intrínseca de la función se utiliza desde el desmontaje?
-
27-09-2019 - |
Pregunta
Im tratando de optimizar mi solicitud de ejercicio en VS2010. Básicamente tengo varios sqrt, pow y memset en el bucle central. Más específicamente, esto es lo que hago:
// 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
}
}
Después de la acumulación, los espectáculos de desmontaje que, por ejemplo, la llamada sqrt todavía compila como "llamada _CIsqrt (0 x ####)" nada cambia, independientemente de si la bandera / Oi está activado o no.
Puede alguien amablemente explicar cómo puedo activar la versión intrínseca y cómo puedo comprobar que el código de desmontaje? (I también han permitido a la / O2 en la configuración del proyecto.)
Gracias
Editar Problema resuelto mediante la adición / fp: rápido. Para sqrt, como un ejemplo, la versión intrínseca utiliza un único "fsqrt" para reemplazar la versión std "__CIsqrt llamada ()". Lamentablemente, en mi caso, la versión intrínseca es 5% más lento.
Muchas gracias a Zan Lynx y MCH.
Solución
se compila a código de máquina y no a .NET CLR. ¿Verdad?
Si se compila a .NET entonces el código no será optimizado hasta que se ejecuta a través de JIT. En ese momento .NET tiene sus propias características intrínsecas y otras cosas que va a pasar.
Si está compilando en código máquina nativo, es posible que desee jugar con el / arco opción y la / fp: rápida opción .
Otros consejos
El uso del espacio de nombres std C ++ podría ser la causa de que el compilador no utilizar los intrínsecos. Prueba a eliminar std::
de sus sqrt
, pow
y llamadas memset
.
La documentación de MSDN para #pragma intrinsic
ofrece hasta un ejemplo para probar si el intrínseca verdaderamente se está utilizando: compilar con la -FAs
bandera y vistazo al archivo asm resultante.
Mirando el desmontaje en el depurador, como parece que ya se hace, también debe mostrar el valor intrínseco en lugar de un call
.