¿Por qué no puedes tener instrucciones altas por ciclo y alta velocidad de reloj?

37

El Megahertz Myth se convirtió en una táctica promocional debido a las diferencias entre el procesador INTEL 8086 de la PC y el procesador Rockwell 6502 de Apple. El 8086 corrió a 4.77MHz mientras que el 6502 corrió a 1MHz. Sin embargo, las instrucciones en el 6502 necesitaban menos ciclos; tantos menos, de hecho, que funcionó más rápido que el 8086. ¿Por qué algunas instrucciones necesitan menos ciclos? ¿Y por qué no se pueden combinar las instrucciones del 6502, que necesita menos ciclos, con un procesador de ciclo rápido del 8086?

El artículo de Wikipedia para instrucciones por ciclo (IPC) dice

Factores que rigen el IPC
Se puede lograr un determinado nivel de instrucciones por segundo con un IPC alto y una velocidad de reloj baja ... o con un IPC bajo y una velocidad de reloj alta.

¿Por qué no puedes tener instrucciones altas por ciclo y alta velocidad de reloj?

¿Quizás esto tiene que ver con lo que es un ciclo de reloj? Wikipedia menciona sincronización de circuitos? No estoy seguro de lo que eso significa.

¿O tal vez esto tiene que ver con cómo funciona una tubería? No estoy seguro de por qué las instrucciones en una tubería corta son diferentes de las instrucciones en una tubería larga.

Cualquier idea sería genial! Solo trato de entender la arquitectura detrás del mito. ¡Gracias!

Referencias

Instrucción por ciclo vs mayor recuento de ciclos

http://en.wikipedia.org/wiki/Instructions_per_cycle

http://en.wikipedia.org/wiki/Clock_cycle

dobus
fuente
1
> ¿Por qué algunas instrucciones necesitan menos ciclos? RISC / CISC (bueno, tipo de ). ¿Y por qué no se pueden combinar las instrucciones del 6502, que necesita menos ciclos, con un procesador de ciclo rápido del 8086? Pueden y tienen. El problema es que una vez que ya ha establecido una base, es difícil deshacerse de todo y comenzar el siguiente modelo desde cero.
Synetech
@Synetech, Intel hizo algo así al presentar un conjunto de instrucciones CISC a los programadores, y luego convertirlo a instrucciones RISCier en el chip
soandos
Bueno, cuando dije que los dos se habían combinado, me refería a fabricantes de chips completamente diferentes. No tengo una lista a la mano, pero ha habido otros (no Intel / AMD) que han hecho cosas así. (La mayoría de la gente se olvida de que hay un montón de fabricantes de chips, porque ahora dominan el mercado Intel y AMD de escritorio.)
Synetech

Respuestas:

21

tl; dr

Las tuberías más cortas significan velocidades de reloj más rápidas, pero pueden reducir el rendimiento. Además, vea las respuestas # 2 y 3 en la parte inferior (son cortas, lo prometo).

Versión más larga:

Hay algunas cosas a considerar aquí:

  1. No todas las instrucciones toman el mismo tiempo.
  2. No todas las instrucciones dependen de lo que se hizo inmediatamente (o incluso de diez o veinte) instrucciones.

Una tubería muy simplificada (lo que sucede en los chips Intel modernos es más que complejo) tiene varias etapas:

Recuperar -> Decodificar -> Acceso a memoria -> Ejecutar -> Reescritura -> Actualización de contador de programa

En cada uno -> hay un costo de tiempo en el que se incurre. Además, en cada tic (ciclo de reloj), todo se mueve de una etapa a la siguiente, por lo que su etapa más lenta se convierte en la velocidad de TODAS las etapas (realmente vale la pena que tengan la mayor longitud posible).

Digamos que tiene 5 instrucciones y desea ejecutarlas (foto tomada de wikipedia, aquí no se realiza la actualización de la PC). Se vería así:

ingrese la descripción de la imagen aquí

Aunque cada instrucción tarda 5 ciclos de reloj en completarse, una instrucción terminada sale de la tubería cada ciclo. Si el tiempo que toma cada etapa es de 40 ns, y 15 ns para los bits intermedios (usando mi tubería de seis etapas anterior), tomará 40 * 6 + 5 * 15 = 315 ns para obtener la primera instrucción.

Por el contrario, si eliminara la tubería por completo (pero mantuviera todo lo demás igual), tomaría solo 240 ns para obtener la primera instrucción. (Esta diferencia en la velocidad para obtener la "primera" instrucción se llama latencia. Generalmente es menos importante que el rendimiento, que es el número de instrucciones por segundo).

Sin embargo, la verdadera diferencia es que en el ejemplo canalizado, recibo una nueva instrucción (después de la primera) cada 60 ns. En el no canalizado, se necesitan 240 cada vez. Esto muestra que las tuberías son buenas para mejorar el rendimiento.

Dando un paso más allá, parecería que en la etapa de acceso a la memoria, necesitaré una unidad adicional (para hacer cálculos de direcciones). Eso significa que si hay una instrucción que no usa la etapa mem ese ciclo, entonces puedo hacer otra adición. Por lo tanto, puedo hacer dos etapas de ejecución (con una en la etapa de acceso a la memoria) en un procesador en un solo tic (la programación es una pesadilla, pero no vayamos allí. Además, la etapa de actualización de la PC también necesitará una unidad adicional en el caso de un salto, por lo que puedo hacer tres estados de ejecución de suma en una marca). Al tener una tubería, se puede diseñar de modo que dos (o más) instrucciones puedan usar diferentes etapas (o etapas de salto, etc.), ahorrando un tiempo valioso.

Tenga en cuenta que para hacer esto, los procesadores hacen mucha "magia" ( ejecución fuera de orden , predicción de ramificaciones y mucho más), pero esto permite que varias instrucciones salgan más rápido que sin una tubería (tenga en cuenta que las tuberías también mucho tiempo son muy difíciles de administrar e incurren en un costo más alto simplemente esperando entre etapas La otra cara es que si hace que la tubería sea demasiado larga, puede obtener una velocidad de reloj loca, pero pierde muchos de los beneficios originales (de tener el mismo tipo de lógica que puede existir en varios lugares y usarse al mismo tiempo) )

Respuesta # 2:

Los procesadores SIMD (instrucción única de datos múltiples) (como la mayoría de las GPU) hacen mucho trabajo en muchos bits de información, pero les lleva más tiempo hacerlo. La lectura de todos los valores lleva más tiempo (significa un reloj más lento, aunque esto se compensa al tener un bus mucho más ancho hasta cierto punto), pero puede obtener muchas más instrucciones a la vez (instrucciones más efectivas por ciclo).

Respuesta # 3:

Debido a que puede "hacer trampa" y alargar artificialmente el conteo del ciclo para que pueda hacer dos instrucciones en cada ciclo (solo reduzca a la mitad la velocidad del reloj). También es posible hacer algo solo cada dos tics en lugar de uno (dando una velocidad de reloj 2x, pero no cambiar las instrucciones por un segundo).

soandos
fuente
3
¡Las tuberías cortas significan velocidades de reloj más lentas! Pentium 4 tenía relojes altos debido a las largas tuberías, aquí está WP: "NetBurst difirió de P6 (Pentium III, II, etc.) al presentar una tubería de instrucciones muy profunda para lograr velocidades de reloj muy altas". El punto es que haces poco por etapa para alcanzar altas velocidades. Sin embargo, esto no resultó viable e Intel perdió un gran impulso con AMD debido a esto. Volvieron a la arquitectura Pentium 3 y se les ocurrió "Core".
stolsvik
@stolsvik, ¿puedes explicar esto? No tiene sentido para mí (que tiene medios etapas menos intersticiales de todo, los ciclos de reloj iguales demás será más corta, dando una velocidad de reloj más alta)
soandos
44
Se realiza una etapa de tubería por ciclo de reloj ; La tubería completa avanza un paso por reloj, obteniendo nuevas instrucciones en la parte inferior, "emitiendo" instrucciones terminadas en la parte superior. Por lo tanto, la idea con Pentium4 era hacer pasos muy pequeños que fueran rápidos de realizar, dando relojes altos, pero por lo tanto requiriendo una larga tubería. La pista con una tubería (todos los procesadores emplean uno) es que tiene varias instrucciones en curso procesándose en cualquier momento. Una tubería larga significa que hay muchas instrucciones en progreso, y si falla una predicción de rama, entonces tendrá que vaciar toda la tubería.
stolsvik
Para su respuesta n. ° 2, la CPU solo accede a los datos a través de la memoria caché (el acceso a la memoria suele ser transparente desde la perspectiva de la instrucción). Disminuir la frecuencia del reloj no afectará el tiempo que tardarán los datos en llegar de la RAM (si no está en la memoria caché). Además, el ancho del bus solo afecta la velocidad de las operaciones SIMD en relación con el tamaño de sus operandos (es decir, puedo cargar 8 operandos de 8 bits en un bus de 64 bits a la vez, pero todavía tengo que cargar manualmente 8 valores de 64 bits si tengo operandos de 64 bits).
Avance
2
También para la respuesta # 1, cuando dices "si hay una instrucción que no usa la etapa mem ese ciclo, entonces puedo hacer otra adición", esto es falso. La ejecución fuera de orden se aplica a nivel de instrucción, no a nivel de microoperación. Si una instrucción requería dos ejecuciones en la tubería, esto causaría una burbuja en la tubería . Por último, la arquitectura x86 tiene una ALU separada para calcular direcciones de memoria sobre la marcha durante las lecturas / escrituras de memoria (permite el [EBX+ECX*4+100]direccionamiento de estilo).
Avance
8

Estoy simplificando mucho esto, pero el punto importante a recordar es que estos términos comparan manzanas con naranjas. Un "Ciclo" no es una sola unidad de medida unificada que es igual en todos los procesadores, como un "segundo" es una medida unificada de tiempo. En cambio, un ciclo representa una determinada unidad de trabajo, que se define de manera algo arbitraria pero limitada por la complejidad del diseño de la tubería y, por supuesto, por la física.

En muchos casos, hacer mucho trabajo en un ciclo podría permitirle limpiar toda la tubería. Si tiene éxito, esto significa que su próximo ciclo no estará optimizado porque tendrá que llenar la tubería nuevamente, lo que puede llevar algo de tiempo.

Podría diseñar un procesador muy simple que procese una etapa de una instrucción RISC cada ciclo, y si esta fuera la base de mi CPU, probablemente podría lograr ciclos muy, muy altos por segundo debido a la complejidad reducida de lo que constituye "un ciclo".

Los detalles entran en una gran cantidad de física e ingeniería eléctrica que realmente no entiendo, pero recuerde que la velocidad del reloj no se logra simplemente agregando ingenuamente voltaje de entrada al procesador y esperando lo mejor. Como mínimo, el perfil térmico es otra preocupación necesaria.

allquixotic
fuente
Esto realmente no responde a su pregunta (que no tiene nada que ver con por qué no se pueden acelerar las cosas). Él está preguntando cómo más ciclos! = Más trabajo todo el tiempo
soandos
Sin embargo, esta respuesta aborda un problema que no vi en las otras respuestas, es decir, habla sobre la inclusión de conjuntos de instrucciones particulares que completan operaciones en menos ciclos de reloj y la capacidad de medir ciclos de reloj en función de los conjuntos de instrucciones más lentos que pueden No ser tan eficiente. (Sin embargo, podría estar muy equivocado ... Encuentro que la arquitectura es fascinante, pero no me consideraré un experto de ninguna manera)
Stephen R
5

Aquí hay una explicación muy simple (quizás demasiado simplificada): digamos que tiene un trabajo particular que hacer, digamos que agregue dos números de 32 bits. Puedes tomar dos enfoques. Puede dividirlo en una gran cantidad de pasos muy pequeños o puede dividirlo en una pequeña cantidad de pasos muy grandes.

Por ejemplo, podría simplemente decir "sumar los dos números". Ahora solo tienes un paso. Pero ese paso tiene múltiples partes y tomará más tiempo hacerlo. Entonces tiene instrucciones altas por ciclo, una en este caso. Pero la velocidad de tu reloj no puede ser alta porque tienes mucho que hacer en ese ciclo.

Alternativamente, podría decir: "Obtenga el primer número en un registro. Luego busque el segundo número. Luego agregue los bits menos significativos. Luego agregue el segundo bit menos significativo con el acarreo de antes. Luego agregue el tercero menos ... A continuación, agregue los bits más significativos. Si hubo un acarreo, establezca el indicador de desbordamiento. Luego escriba el resultado en la memoria ". Ahora tienes una gran cantidad de pasos. Pero cada paso puede ser absurdamente rápido. Entonces tiene instrucciones bajas por ciclo (1/36 más o menos en este caso). Pero la velocidad de su reloj puede ser muy alta ya que cada ciclo solo tiene un poco más que hacer.

Para tener instrucciones altas por ciclo y una alta velocidad de reloj, tendrías que dividir una instrucción compleja en un número muy pequeño de pasos muy simples. Pero eso no se puede hacer porque la instrucción es compleja.

Las compensaciones específicas reales y los números de ciclo son muy diferentes porque las CPU modernas están canalizadas y se superponen a las instrucciones. Pero la idea básica es correcta.

David Schwartz
fuente
2

Usted puede tener las dos instrucciones por ciclo de altas y una alta velocidad de reloj. Donde se topa con los límites es cuando el retardo de propagación del circuito digital excede el ancho de pulso de un solo ciclo de reloj. Esto se puede superar aumentando el voltaje de la CPU, pero debe tenerse en cuenta que esto aumentará el consumo de energía (y, por lo tanto, se disipará el calor).

Entonces, si desea una velocidad de reloj más rápida, debe aumentar el voltaje (aumentando la velocidad de deriva de electrones ) para reducir el retraso de propagación. Si esta demora supera un ciclo de reloj, lo más probable es que la CPU no se comporte como se esperaba y el software que se ejecuta se bloqueará o generará una excepción. Sin embargo, obviamente hay un límite para el voltaje que puede ejecutar a través de un procesador, y esto está dictado por el diseño de la CPU en sí misma, principalmente, la capacidad de transporte de corriente de las vías eléctricas internas.


La canalización permite velocidades de reloj más altas en algunos casos, porque cada instrucción se divide en varias "microoperaciones" más pequeñas. Estas microoperaciones son operaciones muy simples, que utilizan circuitos mucho más pequeños interconectados en una cadena (en el sentido físico, ya que cuanto menor es la distancia que necesitan los electrones para viajar, más corto es el retardo de propagación a través de una subunidad particular).

La ventaja adicional de una CPU canalizada es que puede aumentar considerablemente la cantidad de instrucciones ejecutadas por unidad de tiempo, a expensas de un diseño más complejo.

En cuanto a por qué algunas instrucciones necesitan más o menos ciclos, depende de qué instrucción esté ejecutando. Por ejemplo, en el conjunto de instrucciones x86, hay una MOVSinstrucción que puede mover una cadena completa en la memoria de un lugar a otro. Claramente, no puede copiar instantáneamente una cadena larga, pero puede hacerlo copiando palabra por palabra, tomando múltiples ciclos de reloj. Por lo tanto, la MOVSinstrucción lleva una cantidad de tiempo variable (dependiendo de la cantidad de caracteres que se copiarán).

El efecto de las operaciones de varios ciclos es menos notorio en un diseño RISC (es decir, ARM) en comparación con un diseño CISC (es decir, x86). Esto se debe a que los diseños basados ​​en RISC solo tendrán las operaciones elementales más comúnmente utilizadas, y son mucho más fáciles de canalizar en una forma de lograr un rendimiento de una instrucción por ciclo.

Penetración
fuente
1

El tiempo que demore su computadora en finalizar una tarea en particular no depende de la velocidad del reloj de la computadora ... depende de cómo se diseñan y diseñan las unidades computacionales.

La velocidad del reloj es en realidad una decisión (más o menos) arbitraria tomada por el diseñador de la CPU, a veces por buenas razones (eficiencia), a veces por malas (publicidad).

Digamos que una CPU dada tiene una mezcla de instrucciones que tardan entre 1 y 100 nanosegundos (ns) en finalizar. Puede configurar la frecuencia de reloj de modo que 1 "tic" sea 100 ns (10 MHz), lo que significa que cada instrucción finalizará exactamente en 1 tic. Sin embargo, si los tiempos de ejecución de la instrucción se distribuyen uniformemente, esto significa que sus unidades computacionales estarían inactivas el 50% del tiempo (la velocidad de ejecución promedio sería 50ns, dejando las otras 50ns de la marca inactiva). Si, por otro lado, configura su tic en 10ns, las instrucciones oscilarían entre 1 y 10 ticks, pero la unidad nunca estaría inactiva más de 9ns antes de que comenzara la siguiente instrucción, y el inactivo promedio sería 5ns.

Durante el desarrollo, una CPU estará diseñada para funcionar a una velocidad determinada, en función de la cantidad de trabajo que la CPU sea capaz de realizar. Si aumenta o disminuye la velocidad del reloj, en realidad no está cambiando la cantidad de trabajo que puede realizar la CPU, solo está jugando con la relación de eficiencia.

(Y antes de llorar por el overclocking de las CPU: esto le brinda dos ventajas que resultan en ganancias de velocidad en el mundo real: las instrucciones de ejecución rápida (que toman menos de 1 ciclo) terminan con tiempos de ejecución más rápidos, y todas las instrucciones tienen menos tiempo de inactividad. de hecho, esto puede aumentar la cantidad de trabajo que puede realizar su computadora, pero encontrará que el overclocking de una CPU en un X% no siempre equivale al aumento del X% en el trabajo realizado cuando lo compara.)

TL; DR

Una CPU puede lograr X trabajo en un segundo. Si usa la velocidad de reloj H y I IPC, tenemos I = X / H. Cambiar H no cambia X, pero afecta inversamente a I.

Benjamin Chambers
fuente
1
La velocidad del reloj está lejos de ser una decisión arbitraria. Debe elegirse cuidadosamente en función de la tensión de alimentación de la CPU, así como las longitudes de rastreo de IC (para evitar retrasos de propagación excesivos).
Avance
Creo que te perdiste el hecho de que una CPU es un circuito digital síncrono . Las instrucciones no toman X nanosegundos (suponiendo que su ciclo de reloj sea menor que el retraso de propagación), todo sucede en un borde de reloj ascendente o descendente, o en ambos. Las instrucciones toman X ciclos, no X unidades de tiempo. Sí, puede modificar la duración de un ciclo, pero la distinción es qué sucede cuando. Y, por último, la cantidad de trabajo que puede hacer una CPU en un segundo es una función de la velocidad del reloj, por lo que su fórmula realmente no funciona aquí.
cp2141
Una CPU es una amalgama síncrona de varias unidades asíncronas. Los ticks de reloj se usan para alinear las cosas muy bien, pero no determinan cuánto tiempo lleva la ejecución ... Por ejemplo, una suma de enteros tomará una cierta cantidad de tiempo en función de qué tan lejos debe viajar la corriente a través de la CPU y qué tan rápido los transistores cambiará de estado. El resultado es LEER en el siguiente tictac del reloj, pero el cálculo real se realiza de forma asincrónica a lo largo del tic.
Benjamin Chambers
0

Uno no puede tener instrucciones altas por ciclo y alta velocidad de reloj porque los requisitos son contradictorios.

Se puede demostrar que, en una primera aproximación, el IPC depende de la complejidad (A) del diseño como

IPC = un sqrt (A)

mientras que la frecuencia máxima (F) alcanzable por el diseño se escala como [1]

F = 1 / {b + c sqrt (A)}

con los parámetros a, byc.

Por lo tanto, aumentar la complejidad del muarch aumenta el IPC a expensas de reducir la frecuencia de trabajo, mientras que la reducción de la complejidad aumenta la frecuencia a expensas del IPC. Esto corresponde a los dos casos extremos mencionados en el artículo de wikipedia, pero la wikipedia no menciona los nombres: Brainiac y speed-demon.

  • Diseño Brainiac: IPC alto y baja frecuencia
  • Diseño de demonio de velocidad: alta frecuencia y bajo IPC.

[1] Algunos autores afirman que la expresión para la frecuencia es "1 / {b + c A}", pero en ambos casos la complejidad creciente reduce la frecuencia máxima alcanzable.

juanrga
fuente