trucos tablas siete por para niños multiplicar multiplicaciones multiplicacion divisiones cifras aprender c++ c performance optimization

c++ - siete - tablas multiplicar trucos



¿Es la multiplicación más rápida que la división de flotación? (3)

Esta pregunta ya tiene una respuesta aquí:

En C / C ++, puede configurar el siguiente código:

double a, b, c; ... c = (a + b) / 2;

Esto hace exactamente lo mismo que:

c = (a + b) * 0.5;

Me pregunto cuál es mejor usar. ¿Es una operación fundamentalmente más rápida que la otra?


Es bastante probable que el compilador convierta una división a una multiplicación en este caso, si "piensa" que es más rápido. Dividir por 2 en punto flotante también puede ser más rápido que otras divisiones flotantes. Si el compilador no lo convierte, PUEDE ser más rápido usar multiplicación, pero no es cierto, depende del procesador en sí.

La ganancia de usar manualmente multiplicar en lugar de dividir puede ser bastante grande en los casos donde el compilador no puede determinar que es "seguro" hacerlo (por ejemplo, 0.1 no se puede almacenar exactamente como 0.1 en un número de punto flotante, se convierte en 0.10000000149011612 ) Consulte a continuación las cifras de los procesadores AMD, que se pueden tomar como representativos de la clase.

Para saber si su compilador lo hace bien o no, ¿por qué no escribe un poco de código para experimentar? Asegúrese de escribirlo para que el compilador no solo calcule un valor constante y descarte todo el cálculo en el ciclo tho ''.

Editar:

La guía de optimización de AMD para procesadores Familia 15h proporciona cifras para fdiv y fmul - 42 y 6, respectivamente. Las versiones SSE son un poco más cercanas, 24 (solo) o 27 (dobles) ciclos para DIVPS, DIVPD DIVSS y DIVSD (dividir), y 6 ciclos para todas las formas de multiplicar.

Desde la memoria, las cifras de Intel no están tan lejos.


La multiplicación del punto flotante generalmente toma menos ciclos que la división del punto flotante. Pero con operandos literales, el optimizador es muy consciente de este tipo de micro-optimizaciones.


La multiplicación es más rápida que la división. En la universidad, me enseñaron que la división requiere seis veces más que la multiplicación. Los tiempos reales dependen de la arquitectura, pero en general la multiplicación nunca será más lenta o tan lenta como la división. Siempre optimice su código para usar la multiplicación si los errores de redondeo lo permiten.

Entonces, en un ejemplo, esto normalmente sería más lento ...

for (int i=0; i<arraySize; i++) { a[i] = b[i] / x; }

... que esto ...

y=1/x; for (int i=0; i<arraySize; i++) { a[i] = b[i] * y; }

Por supuesto, con los errores de redondeo, perderá (un poco) precisión con el segundo método, pero a menos que esté calculando repetidamente x=1/x; es poco probable que cause muchos problemas.

Editar:

Solo para referencia. He buscado una comparación de horarios de operación por parte de terceros buscando en Google.

http://gmplib.org/~tege/x86-timing.pdf

Mira los números en MUL y DIV. Esto indica diferencias de entre 5 y 10 veces según el procesador.