2011-01-03 34 views
34

Estoy leyendo "acelerado C++". Encontré una frase que dice "a veces double tiene una ejecución más rápida que float en C++". Después de leer la oración me confundí sobre float y double trabajando. Por favor explícame este punto.¿doble o flotante, que es más rápido?

+6

Casi lo mismo que: http://stackoverflow.com/questions/417568/float-vs-double-performance –

+0

@Devendra: Eso es C#, no C++. – AbdullahC

+4

Si está leyendo "acelerado C++", lo último que debe preocupar es qué tipo es más rápido: concéntrese en los conceptos y cuando tenga un problema real, entonces preocúpese ... – Nim

Respuesta

38

Depende de lo que hace el hardware nativo.

  • Si el hardware implementa doble (como el x86 hace), entonces flotador está emulado por que se extiende allí, y la conversión costará tiempo. En este caso, el doble será más rápido.

  • Si el hardware implementa flotador solamente, emular el doble con esto costará aún más tiempo. En este caso, el flotador será más rápido.

  • Y si el hardware no implementa ninguno, y ambos tienen que implementarse en el software. En este caso, ambos serán lentos, pero el doble será un poco más lento (más operaciones de carga y almacenamiento como mínimo).

La cita que menciona se refiere probablemente a la plataforma x86, donde el primer caso era dado. Pero esto no es cierto en general.

+18

AFAIK x86 en realidad tiene registros de 80bit, no flota ni se duplica. – ybungalobill

+0

Además, depende de la cantidad de datos que está procesando. Con matrices o matrices grandes, la memoria caché puede comenzar a tener un efecto en el rendimiento. –

+0

@Bart, he hecho pruebas antes y básicamente doblo para ganar contra float, incluso con grandes conjuntos de datos. Si quiere estar seguro de que debe hacer un punto de referencia, pero básicamente flotar rara vez gana en x86. –

23

puede encontrar una respuesta completa sobre este artículo

What Every Computer Scientist Should Know About Floating-Point Arithmetic

Esta es una cita de un anterior Tema desbordamiento de pila del flotador doble X con respecto a la memoria de ancho de banda

Si un doble requiere más almacenamiento que un flotador, entonces tomará más tiempo para leer los datos. Esa es la respuesta ingenua. En un moderno IA32, todo depende de dónde provenga el dato . Si está en caché L1, , la carga es insignificante siempre que los datos provengan de una sola línea de caché. Si se extiende por más de una línea de caché , hay una pequeña sobrecarga. Si es de L2, tarda un poco más, si es en la RAM, entonces es más largo y finalmente, si está en el disco, es un gran momento . Por lo tanto, la elección de float o double es menos importante que la forma en que se utilizan los datos . Si desea hacer un pequeño cálculo de en muchos datos secuenciales de , se prefiere un tipo de datos pequeño. Hacer una gran cantidad de cálculos en un pequeño conjunto de datos le permitiría utilizar tipos de datos más grandes con cualquier efecto significativo . Si está accediendo a los datos de forma muy aleatoria, la elección del tamaño de los datos no es importante: los datos se cargan en páginas/líneas de caché. Así que incluso si solo quiere un byte de la RAM, puede obtener 32 bytes transferidos (esto es muy dependiendo de la arquitectura del sistema ). Además de todo esto, la CPU/FPU podría ser súper escalar (también conocido como pipeline). Así, a pesar de que una carga puede tomar varios ciclos, la CPU/FPU podría ser ocupado haciendo otra cosa (un se multiplican por ejemplo) que oculta el tiempo carga en un grado

+0

+1 para el enlace al artículo :-) – Nawaz

+0

+1 de mí también para ese enlace. – foo

3

me ocurren dos casos básicos a la hora de dobles son más rápidos que los flotadores:

  1. Su hardware es compatible con las operaciones dobles, pero no flota operaciones, por lo que los flotadores serán emulados por software y por lo tanto será más lento.

  2. Realmente necesita la precisión de los dobles. Ahora, si usa flotadores de todos modos, tendrá que usar dos flotadores para alcanzar una precisión similar al doble. La emulación de un verdadero doble con flotadores será más lenta que el uso de flotadores en primer lugar.

    1. No necesariamente necesita duplicar pero su algoritmo numérico converge más rápido debido a la precisión mejorada de los dobles. Además, los dobles pueden ofrecer la precisión suficiente para usar un algoritmo más rápido pero numéricamente menos estable.

De forma complementaria también doy algunas razones para el caso contrario de los flotadores de ser más rápido. Se puede ver por sí mismo whichs razones dominan en su caso:

  1. flotadores son más rápidos que los dobles cuando no se necesita el doble de precisión y que están obligados memoria de ancho de banda y su hardware no lleva una penalización en carrozas

  2. Conservan el ancho de banda de memoria porque ocupan la mitad del espacio por número.

  3. También hay plataformas que pueden procesar más flotadores que los dobles en paralelo.

+0

Debido a que repetidamente recibo votos abajo sin comentarios, decidí enmendar mi respuesta. Lo nuevo está en la primera parte de la respuesta. –

1

flotador es generalmente más rápido. el doble ofrece una mayor precisión. Sin embargo, el rendimiento puede variar en algunos casos si se usan extensiones de procesador especiales como 3dNow o SSE.

3

En Intel, el coprocesador (actualmente integrado) manejará ambas partes igualmente rápido, pero como algunos otros han notado, el doble da como resultado un mayor ancho de banda de memoria que puede causar cuellos de botella. Si está utilizando instrucciones escalares SSE (valor predeterminado para la mayoría de los compiladores en 64 bits), aplica lo mismo. Por lo tanto, en general, a menos que esté trabajando en un conjunto grande de datos, no importa mucho.

Sin embargo, las instrucciones SSE paralelas permitirán manejar cuatro flotadores en una instrucción, pero solo dos dobles, por lo que aquí la flotación puede ser significativamente más rápida.

8

La respuesta corta es: depende.

La CPU con x87 comprimirá los flotadores y los duplicará con la misma rapidez. El código vectorizado se ejecutará más rápido con flotadores, porque SSE puede hacer crujir 4 flotadores o 2 dobles en una sola pasada.

Otra cosa a considerar es la velocidad de la memoria. Dependiendo de su algoritmo, su CPU podría estar funcionando al ralentí mientras espera los datos. El código intensivo en memoria se beneficiará del uso de flotadores, pero el código limitado de ALU no lo hará (a menos que esté vectorizado).

2

Existe una sola razón por la que los flotantes de 32 bits pueden ser más lentos que los dobles de 64 bits (u 80x87 de 80 bits). Y eso es alineación. Aparte de eso, las carrozas toman menos memoria, lo que generalmente significa un acceso más rápido, un mejor rendimiento de la memoria caché. También se requieren menos ciclos para procesar las instrucciones de 32 bits. E incluso cuando el (co) -procesador no tiene instrucciones de 32 bits, puede realizarlas en registros de 64 bits con la misma velocidad. Probablemente sea posible crear un caso de prueba donde los dobles serán más rápidos que los flotantes, y v.v., pero mis medidas de algos de estadísticas reales no mostraron una diferencia notable.

+0

Pareces asumir que el acceso a la memoria no costaría tiempo. Pero según mi experiencia (y las hojas de datos de todo el hardware que he visto), lo hace. – foo

2

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.

+1

Bueno, esperemos lo mejor que –

+0

El doble tiene una mayor precisión que flota y usa más memoria doble 8 bytes y flotante 4 bytes. El más rápido flota a través de la escritura de la memoria. No sé cómo se ve la prueba, pero el tiempo es ruidoso. –

Cuestiones relacionadas