2011-09-14 10 views
8

El compilador Intel C++ proporciona dos opciones para el control de punto flotante:Lo que está flotando punto de la especulación y en qué se diferencia del modelo de punto flotante del compilador

-fp-especulación (rápido/seguro/estricta/apagado) - modelo fp (preciso/rápido/estricto y fuente/doble/extendido)

Creo que entiendo lo que hace fp-model. Pero, ¿qué es la especulación fp y cómo se relaciona con el modelo fp? ¡Aún no he encontrado ningún documento de inteligencia que explique esto!

Respuesta

13

-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.

+1

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. –

1

La ejecución desordenada y la ejecución especulativa pueden dar lugar a excepciones extrañas o generar excepciones en el momento incorrecto.

Si eso es importante para usted, puede usar la opción fp-speculation para controlar la especulación de las instrucciones de coma flotante.

Para (un poco) más información: http://software.intel.com/sites/products/documentation/hpc/compilerpro/en-us/fortran/lin/compiler_f/copts/common_options/option_fp_speculation.htm

+1

La bandera controla la especulación * del software * por el compilador, no la ejecución de la especulación de hardware.La ejecución especulativa en un procesador fuera de orden * no puede * generar excepciones extrañas: cualquier excepción espuria se repara en el momento de la retirada de la instrucción, de modo que el efecto observable en cualquier programa sea como si las instrucciones se ejecutaran en orden de programa. –

+2

@Stephen: Sí, y el compilador PUEDE generar lógica para arreglar cosas también, pero eso ralentiza el programa. De ahí las diferentes opciones para negociar velocidad versus comportamiento de excepción preciso. –

+0

El compilador no necesita generar ningún código para "reparar" hardware * especulación. Eso se maneja en silicio. Aquí estamos hablando de que el compilador hace cosas como elevar operaciones de latencia larga a través de puntos de ramificación (* software * especulación). –

-1

En el sistema operativo Windows: 1.Compilador inteligente cálculo flotante Aplicación de 32 bits frente a la aplicación de 64 bits, mismo código Puede darte un resultado diferente !!!! No importa qué bandera elijas:) !!!!

2.Visual compilador de estudio de cálculo flotante de 32 bits frente a la aplicación de 64 bits, el mismo código de salida el mismo resultado.

+0

Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar aclaraciones de un autor, deje un comentario debajo de su publicación; siempre puede comentar sus propias publicaciones, y una vez que tenga [reputación suficiente] (http://stackoverflow.com/help/privileges/comment) lo hará poder comentar cualquier publicación. –

+0

Esto no es crítica o aclaración. Son simples hechos de mi expiriense y dado que estoy trabajando en Intel y trabajando con el compilador de Intel, creo que puedo escribir comentarios sin "suficiente reputación" – user3004288

+0

https://software.intel.com/en-us/forums/topic/271440 – user3004288

Cuestiones relacionadas