Diferencia en gcc -ffp-contract opciones

Tengo una pregunta relacionada con el -ffp-contract en GNU GCC (consulte https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html ).

La documentación de la bandera se escribe de la siguiente manera:

-ffp-contract=off deshabilita la contracción de la expresión de punto flotante. -ffp-contract=fast habilita la contracción de la expresión de punto flotante, como la formación de operaciones de adición múltiple fusionadas si el destino tiene soporte nativo para ellas. -ffp-contract=on habilita la contracción de la expresión de punto flotante si lo permite el estándar de idioma. Actualmente, esto no se implementa y se trata de igual a -ffp-contract=off . El valor predeterminado es -ffp-contract=fast .

Ahora la pregunta:

  • ¿Cuál es la diferencia entre rápido y encendido?
  • ¿Hay algún otro ejemplo de contracción al lado del FMA (o similar como el sub-fusionado)?

En C89, la contracción de FP no está permitida. A partir de C99, una implementación puede hacer la contracción de expresiones de FP de forma predeterminada, pero luego se requerirá que proporcione un #pragma FP_CONTRACT que se puede activar para influir en el comportamiento de la contracción.

Así que se suponía que el interruptor GCC era:

  • -ffp-contract=off : no hacer contracción. Ignorar #pragma FP_CONTRACT . Este es el valor predeterminado para -std=c89 .
  • -ffp-contract=on : habilita la contracción por defecto y #pragma FP_CONTRACT . Este sería el valor predeterminado para -std=c99 y superior.
  • -ffp-contract=fast : no reclamamos conformidad ISO en el modo rápido de matemáticas, por lo que está bien contratar siempre, incluso expresiones separadas (ver el comentario de Marc Glisse).

Desafortunadamente, #pragma FP_CONTRACT aún no está implementado en GCC, por lo que por ahora -ffp-contract=on hace lo que es necesario para mantener la conformidad con ISO: nada .

Tendría que indagar en las fonts (o lista de correo) para ver qué tipo de contracciones puede hacer GCC, pero no tiene que estar limitado a FMA.


Lo que el estándar C11 tiene que decir sobre #pragma FP_CONTRACT :

§6.5¶8 : Se puede contraer una expresión flotante, es decir, evaluarse como si fuera una sola operación, omitiendo así los errores de redondeo implicados por el código fuente y el método de evaluación de la expresión.89) El pragma FP_CONTRACT en proporciona una manera de rechazar Expresiones contratadas. De lo contrario, si y cómo se contratan las expresiones se define en la implementación.90)

89) Las operaciones intermedias en la expresión contratada se evalúan como infinitas en rango y precisión, mientras que la operación final se redondea al formato determinado por el método de evaluación de la expresión. Una expresión contratada también puede omitir el aumento de excepciones de punto flotante.

90) Esta licencia está diseñada específicamente para permitir que las implementaciones exploten instrucciones rápidas de la máquina que combinan múltiples operadores de C. Como las contracciones pueden minar la previsibilidad e incluso pueden disminuir la precisión para contener expresiones, su uso debe estar bien definido y claramente documentado.