Pregunta

Yo sé que x87 tiene mayor precisión interna, que es probablemente la mayor diferencia que la gente ve entre ella y las operaciones de la ESS. Pero me pregunto, ¿hay algún otro beneficio de usar x87? Tengo la costumbre de escribir -mfpmath=sse automáticamente en cualquier proyecto, y me pregunto si me falta algo más que la FPU x87 ofrece.

¿Fue útil?

Solución

Para asm escrito a mano, tiene algunas instrucciones x87 que no existen en el conjunto de instrucciones SSE.

De la parte superior de mi cabeza, es toda la materia trigonométrica como fsin, fcos, fatan, fatan2 y algunas cosas exponencial / logaritmo.

Con gcc -O3 -ffast-math -mfpmath=387, GCC9 sin(x) en realidad todavía en línea como una instrucción fsin, independientemente de lo que la aplicación de libm habría utilizado. ( https://godbolt.org/z/Euc5gp ).

MSVC llama __libm_sse2_sin_precise cuando se compila para x86 de 32 bits.


Si su código pasa la mayor parte del tiempo haciendo trigonometría, es posible que vea una ganancia de rendimiento ligero o pérdida si utiliza x87, dependiendo de si su aplicación matemática-biblioteca estándar usando SSE1 / SSE2 es más rápido o más lento que el lento microcódigo para fsin en cualquier CPU que está utilizando.

Los proveedores de CPU no ponen mucho esfuerzo en la optimización del microcódigo para obtener instrucciones x87 en las nuevas generaciones de CPU, ya que generalmente se considera obsoleto y rara vez se utiliza. (Mira el recuento de UOP y rendimiento para obtener instrucciones x87 complejos en tablas de instrucciones de Agner Fog en los últimos generaciones de CPU: más ciclos de CPU que en mayores). El más reciente de la CPU, más probable x87 será más lenta que muchas instrucciones SSE o AVX para calcular log, exp, prisionero de guerra, o de las funciones trigonométricas.

Aún cuando x87 está disponible, no todas las librerías matemáticas optan por utilizar instrucciones complejas como fsin para implementar funciones como sin(), o especialmente exp / log donde trucos enteros para la manipulación de los patrones de bits FP basada en registros son útiles.

Algunos algoritmos DSP utilizan una gran cantidad de trig, pero por lo general se benefician de un mucho de auto-vectorización con librerías matemáticas SIMD.

Sin embargo, para las matemáticas de código en el que pasar la mayor parte de su tiempo haciendo adiciones, multiplicaciones, etc. SSE es generalmente más rápido.


También relacionado: Intel subestima error de límites por 1.3 trillones de - el peor caso para fsin (cancelación catastrófica para las entradas fsin muy cerca de pi ) es muy malo. El software puede hacer mejor, pero sólo con las técnicas extendida precisión lentos.

Otros consejos

  1. Está presente en las máquinas muy antiguas.

EOF

FPU instrucciones son más pequeñas que las instrucciones SSE, por lo que son ideales para la materia demoscene

  • Existe un considerable legado y la compatibilidad del sistema con la pequeña x87: SSE es una característica relativamente nueva del procesador. Si el código es para ejecutarse en un microcontrolador integrado, hay una buena probabilidad de que no apoyará las instrucciones SSE.

  • Incluso los sistemas que no tienen una FPU instalado a menudo proporcionar emuladores de 80x87 que hará que el código se ejecute de forma transparente (más o menos). No sé de ningún emuladores-SSE sin duda uno de mis sistemas no tiene ninguna, por lo que las nuevas versiones de Adobe Photoshop elementos negarse a ejecutar.

  • Las instrucciones 80x87 tienen buenas características de operación paralelas que han sido explorados y analizados desde su introducción en 1982 o tan a fondo. Varios clones de la x86 podrían estancarse en una instrucciones SSE.

La conversión entre float y double es más rápido con x87 (por lo general libres) que con SSE. Con x87, puede cargar y almacenar una float, double o long double hacia o desde la pila de registros y se convierte a partir de precisión extendida o sin costo adicional. Con SSE, se requieren instrucciones adicionales para hacer la conversión de tipo si los tipos son mixtos, debido a que los registros contienen valores float o double. Estas instrucciones de conversión son bastante rápido, pero toman tiempo extra.

La solución real es que se abstengan de mezcla float y double en exceso, no usar x87, por supuesto.

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