lunes, 28 de julio de 2008

Instrucciones del procesador matemático

h0aX [hoax_ws@yahoo.es]

Me ha pasado muchas veces mientras uso APIs de OpenGL o DirectX, donde un bucle demasiado grande y con muchas llamadas a funciones matemáticas hacen toda la diferencia y llegan a definir si tu programa correrá en un PIII o no.

Cuando te enfrentas por primera vez a este tipo de problemas te das cuenta que funciones matemáticas de la librería MATH.H que haz usado durante años ya no te parecen tan eficientes. Pero ¿de qué manera podría escribir funciones más rápidas que las definidas en MATH.H? Lo primero que me vino a la mente fue reescribir funciones como sin() y sqrt() (que eran unas de las que más problemas me daban en bucles grandes), pero rehacerlas esta vez en ensamblador. Para ello tuve que recurrir a las instrucciones del procesador matemático. El resultado es notable, principalmente cuando se usa recursividad o bucles.

//Seno
Extended mysin(Extended X)
{
  asm
  {
    FLD X
    FSIN
    FWAIT
  }
}

//Coseno
Extended mycos(Extended X)
{
  asm
  {
    FLD X
    FCOS
    FWAIT
  }
}

//Raíz cuadrada
Extended mysqrt(Extended X)
{
  asm
  {
    FLD X
    FSQRT
    FWAIT
  }
}


Artículos relacionados


No hay comentarios: