-fp-model
influye cómo se llevan a cabo cálculos de punto flotante, y puede cambiar el resultado numérico (por licencias optimizaciones inseguras o cambiando la precisión a la que intermedia los resultados son evaluados).
-fp-speculation
no cambia los resultados numéricos, pero puede afectar qué indicadores de punto flotante son generados por una operación (o qué trampas se toman si las capturas de punto flotante están habilitadas). El 99,99% de los programadores no necesitan atención sobre estas cosas, por lo que probablemente pueda ejecutar con el valor predeterminado y no preocuparse por ello.
Aquí hay un ejemplo concreto; suponga que tiene la siguiente función:
double foo(double x) {
// lots of computation
if (x >= 0) return sqrt(x);
else return x;
}
sqrt
es, relativamente hablando, lento. Sería bueno que elevador el cálculo de sqrt(x)
así:
double foo(double x) {
const double sqrtx = sqrt(x);
// lots of computation
if (x >= 0) return sqrtx;
else return x;
}
Al hacer esto, permitimos que el cálculo de sqrt
proceder simultáneamente con otros cálculos, lo que reduce la latencia de nuestra función. Sin embargo, hay un problema; si x
es negativo, entonces sqrt(x)
levanta la bandera inválida. En el programa original, esto nunca podría suceder, porque sqrt(x)
solo se calculó si x
no fue negativo. En el programa modificado, sqrt(x)
se calcula incondicionalmente. Por lo tanto, si x
es negativo, el programa modificado levanta la bandera inválida, mientras que el programa original no lo hace.
La bandera -fp-speculation
le da una forma de decirle al compilador si le interesan estos casos o no, por lo que sabe si tiene licencia para realizar tales transformaciones.
Considere otra variación, donde 'sqrt (x)' se evalúa incondicionalmente. Obviamente, la misma optimización es aplicable, pero ahora, en lugar de una excepción de FPU extraña, tenemos una excepción de FPU que ocurre demasiado pronto, posiblemente antes de que otras escrituras de memoria sean observables desde el manipulador de trampas. La ejecución especulativa no solo puede generar excepciones de FPU adicionales sino también cambiar el tiempo de las excepciones. –