2010-08-06 14 views
51

Los valores dobles almacenan una mayor precisión y son del doble del tamaño de un flotador, pero ¿las CPU Intel están optimizadas para flotadores?¿Está utilizando el doble más rápido que el flotador?

Es decir, las operaciones dobles son igual de rápidas o más rápidas que las operaciones de flotación para +, -, * y /?

¿Cambia la respuesta para las arquitecturas de 64 bits?

+0

Depende de lo que esté haciendo con ellos. En teoría, el ancho de banda de la memoria podría entrar en eso. ¿Tienes más información? –

Respuesta

61

No hay una sola "CPU Intel", especialmente en términos de qué operaciones están optimizadas con respecto a otras !, pero la mayoría de ellas, a nivel de CPU (específicamente dentro de la FPU), son tales que la respuesta a su pregunta:

son operaciones dobles tan rápido o más rápido que operaciones de flotación de +, -, * , y /?

es "sí" - dentro de la CPU. Sin embargo,, ocupar el doble de memoria para cada número implica claramente una carga más pesada en la memoria caché y más ancho de banda de memoria para llenar y derramar esas líneas de caché de/a la RAM; el momento en que se preocupa por el rendimiento de una operación de coma flotante es cuando realiza un lote de tales operaciones, por lo que las consideraciones de memoria y caché son cruciales.

@ respuesta de Richard señala que también hay otras maneras de realizar operaciones de PF (los SSE instrucciones; el bueno de MMX era enteros solamente), especialmente adecuado para operaciones simples en gran cantidad de datos ("SIMD", sola instrucción/datos múltiples) donde cada registro puede empaquetar 4 flotadores de precisión simple o solo 2 de precisión doble, por lo que este efecto será aún más marcado.

Al final, usted tiene que referencia, pero mi predicción es que una razonable (es decir, grandes ;-) puntos de referencia, encontrará ventaja para quedarse con precisión simple (asumiendo por supuesto que usted don' t necesita los bits adicionales de precisión! -).

+1

Esto también dependería del tamaño del bloque de caché, ¿correcto? Si su caché recupera bloques de 64 bits o más, entonces un doble sería igual de eficiente (si no más rápido) que un flotador, al menos en lo que respecta a las lecturas/escrituras de memoria. –

+3

@Razor Si trabaja exactamente tantos flotantes como quepan en una línea de caché, entonces si utilizó los dobles en cambio, la CPU tendrá que buscar dos líneas de caché. Sin embargo, el efecto de almacenamiento en caché que tenía en mente al leer la respuesta de Alex es: el conjunto de flotadores se ajusta a tu caché de nivel n, pero el conjunto correspondiente de dobles no.En este caso, experimentará un gran impulso en el rendimiento si usa flotadores. –

+0

@Peter, sí, tiene sentido, digamos que tiene una línea de caché de 32 bits, con dobles tendría que buscar dos veces cada vez. –

5

La única respuesta realmente útil es: solo usted puede saber. Necesita comparar sus escenarios. Pequeños cambios en la instrucción y los patrones de memoria podrían tener un impacto significativo.

Sin duda importará si está utilizando el tipo de hardware FPU o SSE (former hace todo su trabajo con 80 pero mayor precisión, por lo que el doble estará más cerca; luego es de 32 bits, es decir flotante).

Actualización: s/MMX/SSE/como se indica en otra respuesta.

2

El punto flotante es normalmente una extensión de la CPU de uso general. Por lo tanto, la velocidad dependerá de la plataforma de hardware utilizada. Si la plataforma tiene soporte de punto flotante, me sorprendería si hay alguna diferencia.

21

Si todos los cálculos de coma flotante se realizan dentro de la FPU, entonces no, no hay diferencia entre un cálculo double y un cálculo float porque las operaciones de punto flotante se realizan con 80 bits de precisión en la pila FPU. Las entradas de la pila de FPU se redondean según corresponda para convertir el formato de punto flotante de 80 bits al formato de coma flotante double o float. Mover sizeof(double) bytes a/desde RAM frente a sizeof(float) bytes es la única diferencia en velocidad.

Si, sin embargo, tiene un cálculo vectorializable, puede usar las extensiones SSE para ejecutar cuatro cálculos float al mismo tiempo que dos cálculos double. Por lo tanto, el uso inteligente de las instrucciones SSE y los registros XMM puede permitir un mayor rendimiento en los cálculos que solo usan float s.

7

Otro punto a considerar es si está usando GPU (la tarjeta gráfica). Trabajo con un proyecto que es numéricamente intensivo, pero no necesitamos la precisión que ofrece el doble. Usamos tarjetas GPU para ayudar a acelerar aún más el procesamiento. Las GPU de CUDA necesitan un paquete especial para admitir el doble, y la cantidad de RAM local en una GPU es bastante rápida, pero bastante escasa. Como resultado, usar flotante también duplica la cantidad de datos que podemos almacenar en el

. Otro punto es la memoria. Los flotadores toman la mitad de RAM que los dobles. Si se trata de conjuntos de datos MUY grandes, este puede ser un factor realmente importante. Si usa doble significa que tiene que almacenar en caché en disco contra ram puro, su diferencia será enorme.

Entonces, para la aplicación con la que estoy trabajando, la diferencia es bastante importante.

9

En experimentos de adición de 3,3 por 2000 millones de veces, los resultados son los siguientes:

Summation time in s: 2.82 summed value: 6.71089e+07 // float 
Summation time in s: 2.78585 summed value: 6.6e+09 // double 
Summation time in s: 2.76812 summed value: 6.6e+09 // long double 

Así doble es más rápido y de forma predeterminada en C y C++. Es más portátil y el valor predeterminado en todas las funciones de la biblioteca C y C++. Alos double tiene una precisión significativamente mayor que el flotador.

Incluso BS recomienda doble sobre float:.

"El significado exacto de una, dos y extendida precisión es definida por la implementación La elección de la precisión adecuada para un problema donde las cuestiones de elección requiere una comprensión significativa de computación de coma flotante. Si no tiene esa comprensión, obtenga consejos, tómese el tiempo para aprender, o use el doble y espere lo mejor ".

Quizás el único caso en el que debe usar flotador en lugar de doble es en hardware de 64 bits con un gcc moderno. Porque el flotador es más pequeño; el doble tiene 8 bytes y el flotante tiene 4 bytes.

+3

+1 por hacer el esfuerzo de hacer algunos tiempos. Pero Stroustrup no recomienda usar 'doble' porque es más rápido, pero debido a la precisión adicional. Con respecto a su último comentario, si necesita más precisión que salvar la memoria, entonces es muy posible que desee usar "doble" en el hardware de 32 bits. Y eso nos lleva de nuevo a la pregunta: ¿Es el doble más rápido que flotar incluso en hardware de 32 bits con una FPU moderna que hace cálculos de 64 bits? –

+0

Una diferencia de unas pocas centésimas de segundo parece que todavía está dentro del campo del error experimental. Especialmente si hay otras cosas también (como un ciclo no desenrollado ...). – imallett

+2

Es bastante exagerado decir que Stroustrup recomienda 'doble' cuando en realidad está recomendando RTFM. – sunside

9

sólo quiero añadir a los grandes respuestas ya existentes que la familia __m256? del mismo-instrucción-varios-datos (SIMD) C++ funciones intrínsecas operan en ya seadouble s en paralelo (por ejemplo _mm256_add_pd), o float s en paralelo (por ejemplo, _mm256_add_ps).

No estoy seguro si esto se puede traducir en un real velocidad, pero parece posible para procesar 2x tantos flotadores por instrucción cuando se utiliza SIMD.

Cuestiones relacionadas