La página de instrucciones por segundo de Wikipedia dice que un i7 3630QM entrega ~ 110,000 MIPS a una frecuencia de 3.2 GHz; sería (110 / 3.2 instrucciones) / 4 núcleos = ~ 8.6 instrucciones por ciclo por núcleo ?! ¿Cómo puede un solo núcleo entregar más de una instrucción por ciclo?
Según tengo entendido, una tubería solo debería poder entregar un resultado por reloj.
Estos son mis pensamientos:
- La frecuencia interna es en realidad superior a 3.2 GHz
- Algunas partes de la CPU son asíncronas de una manera que un humano humilde como yo no puede entender
- Hay múltiples tuberías concurrentes por núcleo
- Una tubería puede entregar más que el resultado por reloj, una instrucción puede omitir las etapas de la tubería y hay múltiples captadores previos para mantenerse al día
- Me falta algo
microprocessor
cpu
computer-architecture
sin trabajo
fuente
fuente
Respuestas:
Primero, como lo señalan el comentario de Keelan y la respuesta de Turbo J , la medición fue de 113,093 MIPS Dhrystone, no MIPS nativos .
La microarquitectura Ivy Bridge del i7 3630QM solo puede comprometer 4 µops fusionados por ciclo, aunque puede comenzar la ejecución de 6 µops por ciclo. (El número de µops fusionados en una traza de código es aproximadamente igual al número de instrucciones; algunas instrucciones complejas se decodifican en múltiples µops que no están fusionadas y algunos pares de instrucciones pueden fusionarse en una sola µop, por ejemplo, una comparación inmediata seguido de un salto condicional).
Dos de sus especulaciones sobre cómo se pueden ejecutar múltiples instrucciones en un solo ciclo son bastante válidas y se han utilizado en procesadores reales. Su primera especulación, que se utiliza un reloj interno más rápido, se utilizó en las ALU "bola de fuego" del Pentium 4 original. Estas ALU se registraron al doble de la frecuencia del resto del núcleo, que ya era relativamente alta.
(Esto se logró mediante el uso de una ALU escalonada en la que la mitad inferior de una adición se realizó en un ciclo, lo que permite que una operación dependiente use la mitad inferior del resultado en el siguiente ciclo. Para operaciones como sumar, xor o desplazamiento a la izquierda que solo necesitan la mitad inferior de los operandos para producir la mitad inferior completa del resultado, tal escalonamiento, también conocido como canalización de ancho, permite una latencia de resultados de ciclo único, así como un rendimiento de ciclo único).
HyperSPARC utilizó una técnica algo relacionada, las ALU en cascada. HyperSPARC introdujo los resultados de dos ALU en una tercera ALU. Esto permitió ejecutar dos operaciones independientes y una tercera dependiente en un solo ciclo.
Su especulación de que "hay múltiples tuberías concurrentes por núcleo" es la otra técnica que se ha utilizado. Este tipo de diseño se llama superescalar y es, con mucho, el medio más común para aumentar el número de operaciones ejecutadas en un solo ciclo.
También hay algunas otras probabilidades y fines de ejecución de la instrucción que vale la pena señalar. Algunas operaciones pueden realizarse de manera más eficiente fuera de las unidades de ejecución ordinarias. La técnica de eliminación de movimientos explota el uso del cambio de nombre de registro en procesadores fuera de orden para realizar operaciones de movimiento durante el cambio de nombre de registro; el movimiento simplemente copia el número de registro físico de una posición en la tabla de cambio de nombre (llamada tabla de alias de registro) a otra. Esto no solo aumenta efectivamente el ancho de ejecución sino que también elimina una dependencia. Esta técnica se utilizó antes con el x87 basado en pila, pero ahora se usa ampliamente en los procesadores x86 de alto rendimiento de Intel. (El uso de instrucciones destructivas de dos operandos en x86 hace que la eliminación de movimientos sea más útil de lo que sería en un RISC típico).
Una técnica similar a la eliminación de movimiento es el manejo de las instrucciones de puesta a cero del registro durante el cambio de nombre. Al proporcionar un nombre de registro que proporcione el valor cero, una instrucción de borrado de registro (como xor o restar con ambos operandos siendo el mismo registro) simplemente puede insertar ese nombre en la tabla de cambio de nombre (RAT).
Otra técnica utilizada por algunos procesadores x86 reduce el costo de las operaciones push y pop. Normalmente, una instrucción que usa el puntero de la pila tendría que esperar un ciclo completo para una inserción o pop anterior para actualizar el valor del puntero de la pila. Al reconocer que push y pop solo suman o restan un pequeño valor al puntero de la pila, uno puede calcular los resultados de múltiples adiciones / subtacciones en paralelo. El retraso principal para la adición es la propagación de acarreo, pero con valores pequeños, los bits más significativos del valor base, en este caso el puntero de la pila, solo tendrán como máximo un arrastre. Esto permite que se aplique una optimización similar a la de un sumador carry-select a múltiples adiciones de valores pequeños. Además, dado que el puntero de la pila generalmente solo se actualiza mediante constantes,
También es posible fusionar instrucciones en una sola operación más compleja. Si bien el proceso inverso de dividir las instrucciones en operaciones múltiples y más simples es una técnica antigua, fusionar instrucciones (que Intel denomina fusión macro-op) puede permitir que la implementación admita operaciones más complejas que las expuestas en el conjunto de instrucciones.
En el lado teórico, se han propuesto otras técnicas. Las constantes pequeñas que no sean cero podrían admitirse en la RAT y algunas operaciones simples que usan o producen de manera confiable valores tan pequeños podrían manejarse temprano. ("Physical Register Inlining", Mikko H. Lipasti et al., 2004, sugirió usar la RAT como un medio para reducir el conteo de registros, pero la idea podría extenderse para soportar la carga de pequeños elementos inmediatos y operaciones simples en números pequeños).
Para las memorias caché de rastreo (que almacenan secuencias de instrucciones bajo supuestos particulares de flujo de control), puede haber oportunidades para fusionar operaciones separadas por ramas y eliminar operaciones que producen resultados no utilizados en la traza. El almacenamiento en caché de las optimizaciones en una memoria caché de seguimiento también puede alentar la realización de optimizaciones, como la fusión de instrucciones, que tal vez no valga la pena si se tuvieran que hacer cada vez que se obtiene la secuencia de instrucciones.
La predicción de valor se puede usar para aumentar el número de operaciones que se pueden ejecutar en paralelo eliminando dependencias. Un predictor de valor basado en pasos es similar a la optimización pop / push de un motor de pila especializado mencionado anteriormente. Puede calcular múltiples adiciones principalmente en paralelo, eliminando la serialización. La idea general de la predicción de valor es que con un valor predicho, las operaciones dependientes pueden proceder sin demora. (La dirección de la bifurcación y la predicción del objetivo es efectivamente solo una forma muy limitada de predicción de valor, que permite obtener las siguientes instrucciones que dependen del "valor" de la bifurcación, tomada o no, y la siguiente dirección de instrucción, otro valor).
fuente
Un poco de magia oscura ocurre en el interior de los procesadores modernos, pero sus pensamientos definitivamente están en la línea correcta.
La clave para comprender la eficiencia de los procesadores modernos es darse cuenta de que son superescalares . De Wikipedia (énfasis mío):
Estos procesadores modernos tienen múltiples unidades de ejecución por núcleo, como habrás adivinado. Hyper-threading es interesante considerar, se duplican algunas partes de la tubería, pero algunos no lo son.
También es interesante leer acerca de la ejecución fuera de orden , pero no responde directamente a su pregunta. Sin embargo, reduce el número de ciclos de CPU "desperdiciados".
La eficiencia también se ve afectada por muchas otras cosas que pueden causar un bloqueo dentro del procesador, que incluyen (pero definitivamente no se limitan a):
Los compiladores modernos intentan ayudar con muchos de los elementos anteriores, luego el procesador se hace cargo. Para un buen ejemplo, vea esta pregunta en otra parte de Stackexchange, que destaca una diferencia importante entre dos instrucciones que pueden hacer lo mismo (en algunas circunstancias). Sin embargo, uno puede ser "más rápido" que el otro en algunos procesadores debido a la unidad de ejecución en uso.
Para una explicación legible por humanos de la tubería moderna de la CPU, vea Un viaje a través de la tubería de la CPU . Para una explicación algo más técnica, ver el artículo de Microarquitectura de Agner Fog .
fuente
¿Qué crees que sucedió? Todos los ingenieros de Intel, AMD e IBM leyeron que una tubería solo puede entregar un resultado por ciclo, y dijeron "oh, bueno, eso es todo, no pueden hacer que estos procesadores sean más rápidos". ¿O leyeron esto y dijeron: "¿No pueden entregar más de un resultado por ciclo? ¡Ya veremos eso!".
Para una buena introducción a la arquitectura Haswell, por ejemplo, puede seguir este enlace http://www.realworldtech.com/haswell-cpu/ o simplemente puede ir al sitio web de Intel y encontrará un poco de documentación allí.
Cada núcleo del procesador Haswell tiene una gran cantidad de unidades de ejecución, que pueden realizar operaciones independientes entre sí, por lo que se pueden realizar múltiples operaciones en paralelo. A continuación, el procesador Haswell tiene varias unidades de ejecución que manejan operaciones vectoriales de hasta 256 bits de tamaño. Una operación de vector podría, por ejemplo, realizar cuatro operaciones de punto flotante de precisión doble u ocho operaciones de punto flotante de precisión simple en una operación de vector. Y, por último, el procesador Haswell admite "suma múltiple con fusibles", lo que significa que calcular los tiempos b más c es solo una operación.
El máximo teórico, dado que Haswell tiene dos unidades capaces de agregar múltiples con fusibles, es dos operaciones de agregar múltiples con fusibles por ciclo, cada operación realiza ocho multiplicaciones de precisión simple más adiciones, o 32 operaciones de punto flotante de precisión simple.
El procesador 3630 no está en la última lista de precios de Intel, pero hay modelos como el 3740QM con cuatro núcleos. Entonces, en lugar de 32, puede obtener 128 operaciones de punto flotante por ciclo de reloj. Este es el máximo teórico. Lograr la mitad de eso en la vida real es un desafío, pero no imposible para las tareas adecuadas. Hay otros procesadores disponibles con hasta 15 núcleos (para precios que ni siquiera los fanáticos de los juegos más fanáticos pagarán).
Entonces tienes una combinación de varios multiplicadores:
8.6 operaciones por ciclo no es demasiado difícil de lograr. Incluso 8.6 operaciones por ciclo por núcleo no es demasiado difícil.
fuente
ADD
instrucciones se basan en si el desbordamiento no se debe ver afectado o si se debe configurar cuando se produce el desbordamiento (y se debe configurar si no lo hace).El punto de referencia Drystone es de 1984, y la máquina VAX 1 MIPS nominal correspondiente no es muy eficiente en términos modernos. Incluso un Cortex M3 ofrece 1,25 DMPIS / MHz.
Los procesadores de arquitectura Intel Core pueden ejecutar múltiples instrucciones en paralelo en un solo núcleo, porque hay múltiples unidades informáticas presentes.
fuente
Aprendí mucho de los excelentes y extensos artículos de Jon "Hannibal" Stokes de Ars Technica sobre el tema de la arquitectura de microprocesadores. Los artículos están un poco anticuados (parecen ser de aproximadamente 2004), pero siguen siendo muy relevantes.
Algunos de los enlaces a la siguiente parte de un artículo están rotos, sin embargo, parece que puede solucionarlos usted mismo al comparar cuidadosamente la URL de la primera parte y la URL rota de la página siguiente (por ejemplo, agregando
m-
algo en la URL).(sí, esta es una respuesta glorificada de solo enlace, lo siento; los artículos son demasiado buenos para no mencionarlos)
fuente