Latencia de las instrucciones de la CPU en procesadores x86 y x64


13

Estoy buscando una tabla o algo similar que pueda ayudarme a calcular la eficiencia del código de ensamblaje.

Como sé, el cambio de bits requiere 1 reloj de CPU, pero realmente estoy mirando cuánto toma la suma (la resta debería tomar lo mismo), la multiplicación y cómo supuestamente calcular el tiempo de división si conozco valores que están dividiendo.

Realmente necesito información sobre valores enteros, pero los tiempos de ejecución flotantes también son bienvenidos.


Respuestas:


9

En general, cada una de estas operaciones también requiere un ciclo de reloj único para ejecutarse si los argumentos están en registros en las distintas etapas de la tubería.

¿Qué quieres decir con latencia? ¿Cuántos ciclos pasa una operación en la ALU?

Puede encontrar útil esta tabla: http://www.agner.org/optimize/instruction_tables.pdf

Dado que los procesadores modernos son súper escalares y pueden ejecutarse fuera de orden, a menudo puede obtener instrucciones totales por ciclo que exceden 1. Los argumentos para el comando macro son los más importantes, pero la operación también es importante ya que las divisiones tardan más que XOR (<1 latencia de ciclo).

Muchas instrucciones x86 pueden tomar varios ciclos para completar algunas etapas si son complejas (comandos REP o peor, MWAIT, por ejemplo).


3
La multiplicación de enteros es de al menos 3c de latencia en todas las CPU x86 recientes (y superior en algunas CPU más antiguas). En muchas CPU está totalmente canalizado, por lo que el rendimiento es de 1 por reloj, pero solo puede lograrlo si tiene tres multiplicaciones independientes en vuelo. (La multiplicación de FP en Haswell es de latencia de 5c, rendimiento de 0.5c, por lo que necesita 10 en vuelo para saturar el rendimiento). La división ( divy idiv) es aún peor: está microcodificada y tiene una latencia mucho mayor que addo shr, y ni siquiera está totalmente canalizada en ninguna CPU. Todo esto proviene directamente de las tablas de instrucciones de Agner Fog, por lo que es bueno que hayas vinculado eso.
Peter Cordes


7

Calcular la eficiencia del código de ensamblaje no es la mejor manera de avanzar en estos días de tuberías Super Scalar de ejecución fuera de orden. Varía según el tipo de procesador. Varía según las instrucciones tanto antes como después (¡puede agregar código adicional y hacer que se ejecute más rápido a veces!). Algunas operaciones (especialmente la división) pueden tener un rango de tiempos de ejecución incluso en chips más antiguos y más predecibles. En realidad, la sincronización de muchas iteraciones es el único camino a seguir.


Lo sé, pero necesito eso no en un proyecto real sino en un tipo de proyecto de programación divertido .
ST3

Si lo necesita de verdad o por diversión no cambia la respuesta para esta línea de procesadores. ¿Ha considerado cambiar a un procesador más determinista, como un chip Propeller?
Brian Knoblauch

3
Incluso con un escalar, las predicciones erróneas de la rama de implementación en orden y las fallas de caché pueden causar variaciones en el tiempo de ejecución.
Paul A. Clayton

Para cosas puramente vinculadas a la CPU (sin errores de caché, sin errores de rama), el comportamiento de la CPU se entiende con suficiente detalle que el análisis estático a menudo puede predecir casi exactamente cuántos ciclos por iteración tomará un bucle en una CPU específica (por ejemplo, Intel Haswell). por ejemplo, vea esta respuesta SO donde, al mirar el compilador generado por el compilador, permítame explicar por qué la versión ramificada se ejecutó casi exactamente 1.5 veces más rápido que la versión CMOV en la CPU Sandybridge del OP, pero mucho más cerca de mi Skylake.
Peter Cordes

Si escribe asm a mano por razones de rendimiento, entonces es realmente útil buscar cuellos de botella de latencia y rendimiento en las CPU Intel y AMD. Sin embargo, es difícil, y a veces lo que es óptimo para AMD no es lo que es óptimo para Intel.
Peter Cordes

4

Puede encontrar información sobre Intel CPU en los manuales de desarrollador de software de Intel . Por ejemplo, la latencia es 1 ciclo para una suma entera y 3 ciclos para una multiplicación entera.

No sé acerca de la multiplicación, pero espero que la suma siempre tome un ciclo.


Un ciclo, excepto cuando es "libre" (en paralelo cuando las tuberías se alinean correctamente) o tarda más debido a una falta de caché. :-)
Brian Knoblauch

2
Actualmente (2018) esta información está disponible en el Apéndice C denominado "Latencia y rendimiento de la instrucción" del documento 248966 "Manual de referencia de optimización de arquitecturas Intel® 64 e IA-32" también disponible en la página vinculada en la respuesta
stefanct
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.