Después de leer todo el asunto, existe una abrumadora evidencia de numerosas fuentes de que el uso de conversiones en C o C++ estándar para convertir de coma flotante a números enteros en Intel es muy lento. Para cumplir con la especificación ANSI/ISO, las CPU Intel necesitan ejecutar una gran cantidad de instrucciones, incluidas las necesarias para cambiar el modo de redondeo del hardware de la FPU.¿Cómo me aseguro de que lrint está en línea en gcc?
Existen varios métodos alternativos descritos en diversos documentos, pero el más limpio y portátil parece ser el llamado lrint() agregado a los estándares C99 y C++ 0x. Muchos documentos dicen que un compilador debe expandir estas funciones cuando la optimización está habilitada, lo que lleva a un código que es más rápido que un molde convencional, o una llamada a función.
Incluso encontré referencias a las bolsas de seguimiento de funciones de gcc para agregar esta expansión en línea al optimizador de gcc, pero en mis propias pruebas de rendimiento no he podido hacerlo funcionar. Todos mis intentos muestran que el rendimiento de lrint es mucho más lento que un simple molde de estilo C o C++. Examinar la salida de ensamblaje del compilador y desensamblar los objetos compilados siempre muestra una llamada explícita a una función externa lrint() o lrintf().
Las versiones de gcc con las que he estado trabajando son 4.4.3 y 4.6.1, y he intentado varias combinaciones de banderas en objetivos de 32 bits y 64 bits x86, incluidas opciones para habilitar explícitamente SSE.
¿Cómo obtengo gcc en línea expandir lrint, y darme conversiones rápidas?
¿Ha perfilado y confirmado que usar el lanzamiento obvio está tomando una cantidad significativa del tiempo de ejecución de tu programa? –
La creación de perfiles muestra que puedo obtener una diferencia de velocidad de 2-4% usando una macro ensamblador escrita a mano levantada de un artículo. Esto vale la pena ya que el cálculo se realiza entre cuadros de una aplicación de renderizado 3D. –
¿estableciste '-fno-math-errno'? también debería considerar usar '-ffast-math', que no siempre es una opción si confía en la semántica de fp específica ... – Christoph