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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top