traduccion tipos que protocolo programming computer processor pipelining

processor - tipos - protocolo pipeline



¿Cuál es la diferencia entre superperscaling y pipelining? (5)

Bueno, parece una pregunta demasiado simple para ser formulada, pero pregunté después de pasar por algunos ppts en ambos.

Ambos métodos aumentan el rendimiento de la instrucción. Y Superscaling casi siempre hace uso de pipelining también. La supercalibración tiene más de una unidad de ejecución y también lo hace la canalización o ¿estoy equivocado aquí?


La canalización es la ejecución simultánea de diferentes etapas de instrucciones múltiples en el mismo ciclo. Se basa en dividir el procesamiento de instrucciones en etapas y tener unidades especializadas para cada etapa y registros para almacenar resultados intermedios.

La supercalibración está distribuyendo múltiples instrucciones (o microinstrucciones) a múltiples unidades de ejecución existentes en la CPU. Se basa así en unidades redundantes en la CPU.

Por supuesto, estos enfoques pueden complementarse entre sí.


La canalización es lo que hace una compañía automotriz en la fabricación de sus automóviles. Desglosan el proceso de armar un automóvil en etapas y realizan las diferentes etapas en diferentes puntos a lo largo de una línea de montaje hecha por diferentes personas. El resultado neto es que el automóvil se fabrica exactamente a la velocidad de la etapa más lenta.

En las CPU, el proceso de canalización es exactamente el mismo. Una "instrucción" se divide en varias etapas de ejecución, generalmente algo así como 1. instrucción fetch, 2. operandos de recuperación (registros o valores de memoria que se leen), 2. realizar cálculos, 3. escribir resultados (en memoria o registros) . Lo más lento de esto podría ser la parte de cálculo, en cuyo caso la velocidad de rendimiento global de las instrucciones a través de esta tubería es solo la velocidad de la parte de cálculo (como si las otras partes fueran "libres").

Super-escalar en microprocesadores se refiere a la capacidad de ejecutar varias instrucciones desde una única secuencia de ejecución a la vez en paralelo. Entonces, si una compañía automotriz administrara dos líneas de ensamblaje, obviamente podrían producir el doble de autos. Pero si el proceso de poner un número de serie en el automóvil estaba en la última etapa y tenía que hacerlo una sola persona, entonces tendrían que alternar entre las dos tuberías y garantizar que podían hacer cada una en la mitad del tiempo de la etapa más lenta para evitar convertirse en la etapa más lenta.

Super-escalar en microprocesadores es similar pero generalmente tiene muchas más restricciones. Por lo tanto, la etapa de captación de instrucciones típicamente producirá más de una instrucción durante su etapa; esto es lo que hace que sea super escalar en microprocesadores. Luego habría dos etapas de búsqueda, dos etapas de ejecución y dos etapas de escritura. Esto, obviamente, se generaliza a más de dos tuberías.

Todo esto está bien y muy bien, pero desde la perspectiva de la ejecución del sonido, ambas técnicas podrían conducir a problemas si se hace a ciegas. Para la ejecución correcta de un programa, se supone que las instrucciones se ejecutan completamente una tras otra en orden. Si dos instrucciones secuenciales tienen cálculos interdependientes o usan los mismos registros, entonces puede haber un problema. La última instrucción debe esperar a que se complete la escritura de la instrucción anterior antes de que pueda realizar la etapa de recuperación del operando. Por lo tanto, necesitas paralizar la segunda instrucción en dos etapas antes de que se ejecute, lo que frustra el propósito de lo que se ganó con estas técnicas en primer lugar.

Hay muchas técnicas que se usan para reducir el problema de la necesidad de bloqueo que son un poco complicadas de describir, pero las incluiré en una lista: 1. reenvío de registros, (también almacenar para reenvío de carga) 2. registro de nombres, 3. puntuación, 4 ejecución fuera de orden. 5. Ejecución especulativa con retroceso (y retiro) Todas las CPU modernas usan casi todas estas técnicas para implementar super-escalar y canalización. Sin embargo, estas técnicas tienden a tener rendimientos decrecientes con respecto a la cantidad de tuberías en un procesador antes de que los puestos se vuelvan inevitables. En la práctica, ningún fabricante de CPU fabrica más de 4 tuberías en un solo núcleo.

Multi-core no tiene nada que ver con ninguna de estas técnicas. Básicamente se trata de aplicar dos microprocesadores para implementar un multiprocesamiento simétrico en un solo chip y compartir solo aquellos componentes que tienen sentido compartir (generalmente caché L3 y E / S). Sin embargo, una técnica que Intel llama "hyperthreading" es un método para tratar de implementar virtualmente la semántica de multi-core dentro del marco súper-escalar de un solo núcleo. De modo que una sola microarquitectura contiene los registros de dos (o más) núcleos virtuales y obtiene instrucciones de dos (o más) flujos de ejecución diferentes, pero se ejecuta desde un sistema súper escalar común. La idea es que debido a que los registros no pueden interferir entre sí, tenderá a haber más paralelismo que conduzca a un menor número de puestos. Entonces, en lugar de simplemente ejecutar dos flujos de ejecución de núcleo virtual a la mitad de la velocidad, es mejor debido a la reducción general en los puestos. Esto parece sugerir que Intel podría aumentar el número de tuberías. Sin embargo, se ha encontrado que esta técnica carece de implementaciones prácticas. Sin embargo, como es parte integral de las técnicas súper-escalares, lo he mencionado de todos modos.


El diseño superescalar implica que el procesador puede emitir múltiples instrucciones en un solo reloj, con facilidades redundantes para ejecutar una instrucción. Estamos hablando de un núcleo único, eso sí, el procesamiento multinúcleo es diferente.

Pipelining divide una instrucción en pasos, y dado que cada paso se ejecuta en una parte diferente del procesador, varias instrucciones pueden estar en diferentes "fases" de cada reloj.

Casi siempre se usan juntos. Esta imagen de Wikipedia muestra ambos conceptos en uso, ya que estos conceptos se explican mejor gráficamente:

Aquí, dos instrucciones se están ejecutando a la vez en una tubería de cinco etapas.

Para desglosarlo aún más, dada su edición reciente:

En el ejemplo anterior, una instrucción pasa por 5 etapas para ser "realizada". Estos son IF (búsqueda de instrucciones), ID (decodificación de instrucciones), EX (ejecución), MEM (actualización de memoria), WB (escritura en caché).

En un diseño de procesador muy simple, cada reloj se completaría una etapa diferente, así que tendríamos:

  1. SI
  2. CARNÉ DE IDENTIDAD
  3. EX
  4. MEM
  5. WB

Lo cual haría una instrucción en cinco relojes. Si luego agregamos una unidad de ejecución redundante e introducimos un diseño superescalar, tendremos esto, para dos instrucciones A y B:

  1. IF (A) IF (B)
  2. ID (A) ID (B)
  3. EX (A) EX (B)
  4. MEM (A) MEM (B)
  5. WB (A) WB (B)

Dos instrucciones en cinco relojes: una ganancia máxima teórica del 100%.

Pipelining permite que las partes se ejecuten simultáneamente, por lo que terminaríamos con algo así como (para diez instrucciones de la A a la J):

  1. IF (A) IF (B)
  2. ID (A) ID (B) SI (C) SI (D)
  3. EX (A) EX (B) ID (C) ID (D) SI (E) IF (F)
  4. MEM (A) MEM (B) EX (C) EX (D) ID (E) ID (F) IF (G) IF (H)
  5. WB (A) WB (B) MEM (C) MEM (D) EX (E) EX (F) ID (G) ID (H) IF (I) IF (J)
  6. WB (C) WB (D) MEM (E) MEM (F) EX (G) EX (H) ID (I) ID (J)
  7. WB (E) WB (F) MEM (G) MEM (H) EX (I) EX (J)
  8. WB (G) WB (H) MEM (I) MEM (J)
  9. WB (I) WB (J)

En nueve relojes, hemos ejecutado diez instrucciones: se puede ver en qué lugar la canalización realmente mueve las cosas. Y esa es una explicación del gráfico de ejemplo, no cómo se implementa realmente en el campo (eso es magia negra ).

Los artículos de Wikipedia para Superscalar y de Instruction son bastante buenos.


Hace mucho tiempo , las CPU ejecutaban solo una instrucción de máquina a la vez . Solo cuando estuvo completamente terminado, la CPU obtuvo la siguiente instrucción de la memoria (o, más tarde, la caché de instrucciones).

Finalmente, alguien notó que esto significaba que la mayoría de las CPU no hacía nada la mayor parte del tiempo, ya que había varias subunidades de ejecución (como el decodificador de instrucciones, la unidad aritmética de enteros y la unidad aritmética FP, etc.) y ejecutaban una instrucción solo uno de ellos ocupado a la vez.

Por lo tanto, nació una canalización " simple ": una vez que se terminaba una instrucción de decodificación y se pasaba a la siguiente subunidad de ejecución, ¿por qué no recuperar y decodificar la siguiente instrucción? Si tuviera 10 de esas " etapas ", entonces haciendo que cada etapa procesara una instrucción diferente , en teoría podría aumentar el rendimiento de la instrucción diez veces sin aumentar en absoluto el reloj de la CPU. Por supuesto, esto solo funciona sin problemas cuando no hay saltos condicionales en el código (esto llevó a un gran esfuerzo adicional para manejar saltos condicionales especialmente).

Más tarde, con la ley de Moore continuando siendo correcta por más tiempo de lo esperado, los fabricantes de CPU se encontraron con más transistores para usar y pensaron "¿por qué tener solo una de cada subunidad de ejecución?". Así, nacieron CPUs superescalares con múltiples subunidades de ejecución capaces de hacer lo mismo en paralelo , y los diseños de CPU se volvieron mucho, mucho más complejos para distribuir instrucciones a través de estas unidades totalmente paralelas mientras se garantizaban los mismos resultados que si las instrucciones hubieran sido ejecutadas secuencialmente.


Una analogía: lavar la ropa

Imagine una tienda de limpieza en seco con las siguientes instalaciones: una rejilla para colgar ropa sucia o limpia, una lavadora y una secadora (cada una de las cuales puede lavar una prenda a la vez), una mesa plegable y una tabla de planchar.

El encargado que hace todo el lavado y secado es bastante tonto por lo que el dueño de la tienda, que toma las órdenes de limpieza en seco, tiene especial cuidado en escribir cada instrucción de manera muy cuidadosa y explícita.

En un día típico, estas instrucciones pueden ser algo así como:

  1. tomar la camisa del estante
  2. lavar la camisa
  3. secar la camisa
  4. planchar la camisa
  5. doblar la camisa
  6. poner la camisa de nuevo en el estante
  7. tomar los pantalones del estante
  8. lavar los pantalones
  9. secar los pantalones
  10. dobla los pantalones
  11. poner los pantalones de nuevo en el estante
  12. tomar el abrigo del estante
  13. lavar el abrigo
  14. secar el saco
  15. planchar el abrigo
  16. poner el abrigo de nuevo en el estante

El asistente sigue estas instrucciones hasta el tee, teniendo mucho cuidado de no hacer nada fuera de lugar. Como se puede imaginar, lleva mucho tiempo realizar la colada del día porque lleva mucho tiempo lavar, secar y doblar por completo cada prenda de ropa, y todo debe hacerse de a uno por vez.

Sin embargo, un día se cierra el asistente y se contrata a un nuevo asistente más inteligente que advierte que la mayoría del equipo está inactivo en cualquier momento durante el día. Mientras los pantalones se estaban secando, ni la tabla de planchar ni la lavadora estaban en uso. Entonces decidió hacer un mejor uso de su tiempo. Por lo tanto, en lugar de la serie de pasos anterior, él haría esto:

  1. tomar la camisa del estante
  2. lavar la camisa, sacar los pantalones del estante
  3. seca la camisa, lava los pantalones
  4. planche la camisa, seque los pantalones
  5. dobla la camisa, (toma el abrigo del estante)
  6. coloque la camisa en el estante, doble los pantalones (lave el abrigo)
  7. coloque los pantalones sobre la rejilla , (seque el abrigo)
  8. (plancha el abrigo)
  9. (Pon el saco de nuevo en el estante)

Esto es pipelining. Secuenciar actividades no relacionadas de tal manera que usen diferentes componentes al mismo tiempo. Al mantener activos tantos componentes a la vez, maximiza la eficiencia y acelera el tiempo de ejecución, en este caso reduciendo 16 "ciclos" a 9, una aceleración de más del 40%.

Ahora, la pequeña tienda de limpieza en seco comenzó a ganar más dinero porque podían trabajar mucho más rápido, por lo que el propietario compró una lavadora, secadora, tabla de planchar, estación de plegado adicionales e incluso contrató a otro asistente. Ahora las cosas son aún más rápidas, en lugar de lo anterior, tienes:

  1. toma la camisa del estante, toma los pantalones del estante
  2. lavar la camisa, lavar los pantalones , (sacar el abrigo del estante)
  3. seque la camisa, seque los pantalones , (lave el abrigo)
  4. planchar la camisa, doblar los pantalones , (secar el abrigo)
  5. doblar la camisa, poner los pantalones de nuevo en el estante , (planchar el abrigo)
  6. coloque la camisa en el estante, (vuelva a poner el abrigo en el estante)

Este es un diseño superescalar. Múltiples subcomponentes capaces de realizar la misma tarea simultáneamente, pero con el procesador decidiendo cómo hacerlo. En este caso, dio como resultado un aumento de velocidad de casi 50% (en 18 "ciclos" la nueva arquitectura podría ejecutarse a través de 3 iteraciones de este "programa" mientras que la arquitectura anterior solo podría ejecutarse a través de 2).

Los procesadores antiguos, como el 386 o el 486, son procesadores escalares simples, ejecutan una instrucción a la vez exactamente en el orden en que se recibieron. Los procesadores de consumo modernos desde PowerPC / Pentium son canalizados y superescalares. Una CPU Core2 es capaz de ejecutar el mismo código que se compiló para un 486 sin dejar de aprovechar el paralelismo del nivel de instrucción porque contiene su propia lógica interna que analiza el código máquina y determina cómo reordenarlo y ejecutarlo (lo que se puede ejecutar en paralelo , lo que no se puede, etc.) Esta es la esencia del diseño superescalar y por qué es tan práctico.

En contraste, un procesador vectorial paralelo realiza operaciones en varios datos a la vez (un vector). Por lo tanto, en lugar de solo agregar x y ya, el procesador de vectores agregaría, digamos, x0, x1, x2 a y0, y1, y2 (lo que da como resultado z0, z1, z2). El problema con este diseño es que está estrechamente relacionado con el grado específico de paralelismo del procesador. Si ejecuta un código escalar en un procesador vectorial (suponiendo que pudiera), no vería ninguna ventaja de la paralelización del vector porque necesita ser utilizado explícitamente, de manera similar si quisiera aprovechar un procesador vectorial más nuevo con más unidades de procesamiento en paralelo (por ej. capaz de agregar vectores de 12 números en lugar de solo 3) necesitaría recompilar su código. Los diseños de procesadores vectoriales eran populares en la generación más antigua de súper computadoras porque eran fáciles de diseñar y existen grandes clases de problemas en ciencia e ingeniería con una gran cantidad de paralelismo natural.

Los procesadores superescalares también pueden tener la capacidad de realizar una ejecución especulativa. En lugar de dejar las unidades de procesamiento inactivas y esperar que una ruta de código termine de ejecutarse antes de ramificar, un procesador puede adivinar mejor y comenzar a ejecutar el código más allá de la bifurcación antes de que el código anterior haya terminado de procesarse. Cuando la ejecución del código anterior alcanza al punto de bifurcación, el procesador puede comparar la rama real con la suposición de bifurcación y continuar si la suposición es correcta (ya está muy por delante de donde habría estado esperando) o puede invalidar los resultados de la ejecución especulativa y ejecutar el código para la rama correcta.