De Wikipedia, la enciclopedia libre
Saltar a navegación Saltar a búsqueda

En informática , la canalización de instrucciones es una técnica para implementar el paralelismo a nivel de instrucción dentro de un solo procesador. La canalización intenta mantener ocupada cada parte del procesador con alguna instrucción dividiendo las instrucciones entrantes en una serie de pasos secuenciales (la " canalización " del mismo nombre) realizados por diferentes unidades de procesador con diferentes partes de instrucciones procesadas en paralelo.

Concepto y motivación [ editar ]

En una computadora interconectada, las instrucciones fluyen a través de la unidad central de procesamiento (CPU) en etapas. Por ejemplo, podría tener una etapa para cada paso del ciclo de von Neumann : buscar la instrucción, buscar los operandos, ejecutar la instrucción, escribir los resultados. Una computadora interconectada generalmente tiene "registros de interconexión" después de cada etapa. Estos almacenan información de la instrucción y los cálculos para que las puertas lógicas de la siguiente etapa puedan realizar el siguiente paso.

Esta disposición permite a la CPU completar una instrucción en cada ciclo de reloj. Es común que las etapas pares operen en un borde del reloj de onda cuadrada, mientras que las etapas impares operan en el otro borde. Esto permite un mayor rendimiento de la CPU que una computadora multiciclo a una frecuencia de reloj determinada , pero puede aumentar la latencia debido a la sobrecarga adicional del proceso de canalización en sí. Además, aunque la lógica electrónica tiene una velocidad máxima fija, una computadora interconectada se puede hacer más rápida o más lenta variando el número de etapas en la línea. Con más etapas, cada etapa hace menos trabajo, por lo que la etapa tiene menos retrasos desde las puertas lógicas y podría funcionar a una frecuencia de reloj más alta.

Un modelo de computadora en cadena es a menudo el más económico, cuando el costo se mide como puertas lógicas por instrucción por segundo. En cada instante, una instrucción se encuentra en una sola etapa de canalización y, en promedio, una etapa de canalización es menos costosa que una computadora multiciclo. Además, cuando se hace bien, la mayor parte de la lógica de la computadora interconectada está en uso la mayor parte del tiempo. Por el contrario, las computadoras averiadas suelen tener una gran cantidad de lógica inactiva en un instante dado. Cálculos similares suelen mostrar que una computadora interconectada usa menos energía por instrucción.

Sin embargo, una computadora interconectada suele ser más compleja y costosa que una computadora multiciclo comparable. Por lo general, tiene más puertas lógicas, registros y una unidad de control más compleja. De manera similar, podría usar más energía total, mientras usa menos energía por instrucción. Las CPU fuera de servicio generalmente pueden realizar más instrucciones por segundo porque pueden ejecutar varias instrucciones a la vez.

En una computadora interconectada, la unidad de control se encarga de que el flujo se inicie, continúe y se detenga como lo ordena un programa. Los datos de instrucción generalmente se pasan en registros de canalización de una etapa a la siguiente, con una pieza de lógica de control algo separada para cada etapa. La unidad de control también asegura que la instrucción en cada etapa no dañe el funcionamiento de las instrucciones en otras etapas. Por ejemplo, si dos etapas deben usar el mismo dato, la lógica de control asegura que los usos se realicen en la secuencia correcta.

Cuando funciona de manera eficiente, una computadora interconectada tendrá una instrucción en cada etapa. Luego, está trabajando en todas esas instrucciones al mismo tiempo. Puede terminar aproximadamente una instrucción por cada ciclo de su reloj. Pero cuando un programa cambia a una secuencia diferente de instrucciones, la canalización a veces debe descartar los datos en proceso y reiniciarse. A esto se le llama "puesto".

Gran parte del diseño de una computadora interconectada evita la interferencia entre las etapas y reduce las paradas.

Número de pasos [ editar ]

El número de pasos dependientes varía con la arquitectura de la máquina. Por ejemplo:

  • El proyecto IBM Stretch de 1956–61 propuso los términos Obtener, Decodificar y Ejecutar que se han vuelto comunes.
  • La canalización clásica de RISC comprende:
    1. Búsqueda de instrucciones
    2. Decodificación de instrucciones y recuperación de registros
    3. Ejecutar
    4. Acceso a la memoria
    5. Registrarse escribir de nuevo
  • El Atmel AVR y el microcontrolador PIC tienen cada uno una tubería de dos etapas.
  • Muchos diseños incluyen tuberías de hasta 7, 10 e incluso 20 etapas (como en el Intel Pentium 4 ).
  • Los últimos núcleos Netburst "Prescott" y "Cedar Mill" de Intel, utilizados en los últimos modelos Pentium 4 y sus derivados Pentium D y Xeon , tienen una larga tubería de 31 etapas.
  • El procesador de red Xelerated X10q tiene un pipeline de más de mil etapas, aunque en este caso 200 de estas etapas representan CPU independientes con instrucciones programadas individualmente. Las etapas restantes se utilizan para coordinar los accesos a la memoria y las unidades de función en el chip. [1] [2]

A medida que la canalización se hace "más profunda" (con un mayor número de pasos dependientes), un paso dado se puede implementar con circuitos más simples, lo que puede permitir que el reloj del procesador funcione más rápido. [3] Tales oleoductos pueden denominarse superpipelines. [4]

Se dice que un procesador está completamente canalizado si puede obtener una instrucción en cada ciclo. Por lo tanto, si algunas instrucciones o condiciones requieren retrasos que impiden la obtención de nuevas instrucciones, el procesador no está completamente conectado.

Historia [ editar ]

Los usos fundamentales de la canalización se encontraban en el proyecto ILLIAC II y el proyecto IBM Stretch , aunque anteriormente se utilizó una versión simple en el Z1 en 1939 y el Z3 en 1941. [5]

La canalización comenzó en serio a fines de la década de 1970 en supercomputadoras como procesadores vectoriales y procesadores de matriz. [ cita requerida ] Una de las primeras supercomputadoras fue la serie Cyber ​​construida por Control Data Corporation. Su arquitecto principal, Seymour Cray , más tarde dirigió Cray Research. Cray desarrolló la línea XMP de supercomputadoras, utilizando canalización para funciones de multiplicar y sumar / restar. Más tarde, Star Technologies agregó el paralelismo (varias funciones canalizadas trabajando en paralelo), desarrollado por Roger Chen. En 1984, Star Technologies agregó el circuito de división por tuberías desarrollado por James Bradley. A mediados de la década de 1980, muchas empresas diferentes de todo el mundo utilizaban la canalización. [ cita requerida ]

La canalización no se limitó a las supercomputadoras. En 1976, el mainframe de propósito general de la serie 470 de Amdahl Corporation tenía una tubería de 7 pasos y un circuito de predicción de rama patentado. [ cita requerida ]

Peligros [ editar ]

El modelo de ejecución secuencial supone que cada instrucción se completa antes de que comience la siguiente; esta suposición no es cierta en un procesador en cadena. Una situación en la que el resultado esperado es problemático se conoce como peligro . Imagine las siguientes dos instrucciones de registro para un procesador hipotético:

1: agregue 1 a R52: copie R5 a R6

Si el procesador tiene los 5 pasos enumerados en la ilustración inicial, la instrucción 1 se buscará en el tiempo t 1 y su ejecución se completará en t 5 . La instrucción 2 se buscaría en t 2 y se completaría en t 6 . La primera instrucción podría depositar el número incrementado en R5 como su quinto paso (escritura de registro) en t 5 . Pero la segunda instrucción podría obtener el número de R5 (para copiar a R6) en su segundo paso (decodificación de instrucción y búsqueda de registro) en el tiempo t 3 . Parece que la primera instrucción no habría incrementado el valor para entonces. El código anterior invoca un peligro.

Escribir programas de computadora en un lenguaje compilado podría no suscitar estas preocupaciones, ya que el compilador podría diseñarse para generar código de máquina que evite peligros.

Soluciones alternativas [ editar ]

En algunos procesadores DSP y RISC tempranos, la documentación aconseja a los programadores que eviten tales dependencias en instrucciones adyacentes y casi adyacentes (llamadas ranuras de retardo ), o declara que la segunda instrucción usa un valor antiguo en lugar del valor deseado (en el ejemplo anterior, el El procesador puede copiar de forma contraria a la intuición el valor no incrementado), o declara que el valor que utiliza no está definido. El programador puede tener un trabajo no relacionado que el procesador puede hacer mientras tanto; o, para garantizar resultados correctos, el programador puede insertar NOP en el código, negando en parte las ventajas de la canalización.

Soluciones [ editar ]

Los procesadores canalizados comúnmente usan tres técnicas para funcionar como se espera cuando el programador asume que cada instrucción se completa antes de que comience la siguiente:

  • La tubería podría detenerse o dejar de programar nuevas instrucciones hasta que los valores requeridos estén disponibles. Esto da como resultado ranuras vacías en la tubería, o burbujas , en las que no se realiza ningún trabajo.
  • Se puede agregar una ruta de datos adicional que enruta un valor calculado a una instrucción futura en otra parte de la tubería antes de que la instrucción que la produjo se haya retirado por completo, un proceso llamado reenvío de operandos . [6] [7]
  • El procesador puede localizar otras instrucciones que no dependen de las actuales y que pueden ejecutarse inmediatamente sin riesgos, optimización conocida como ejecución fuera de orden .

Ramas [ editar ]

Una derivación de la secuencia de instrucciones normal a menudo implica un peligro. A menos que el procesador pueda dar efecto a la rama en un solo ciclo de tiempo, la canalización continuará obteniendo instrucciones secuencialmente. No se puede permitir que tales instrucciones surtan efecto porque el programador ha desviado el control a otra parte del programa.

Una rama condicional es aún más problemática. El procesador puede o no bifurcarse, dependiendo de un cálculo que aún no se haya realizado. Varios procesadores pueden detenerse, pueden intentar la predicción de bifurcaciones y pueden comenzar a ejecutar dos secuencias de programa diferentes ( ejecución ansiosa ), cada una asumiendo que la bifurcación se ha tomado o no, descartando todo el trabajo que pertenezca a la suposición incorrecta. [a]

Un procesador con una implementación de predicción de bifurcaciones que normalmente hace predicciones correctas puede minimizar la penalización de rendimiento de la bifurcación. Sin embargo, si las ramas se predicen mal, puede crear más trabajo para el procesador, como vaciar de la tubería la ruta de código incorrecta que ha comenzado la ejecución antes de reanudar la ejecución en la ubicación correcta.

Los programas escritos para un procesador canalizado evitan deliberadamente las ramificaciones para minimizar la posible pérdida de velocidad. Por ejemplo, el programador puede manejar el caso habitual con ejecución secuencial y ramificarse solo al detectar casos inusuales. El uso de programas como gcov para analizar la cobertura del código le permite al programador medir con qué frecuencia se ejecutan realmente ramas particulares y obtener información con la que optimizar el código. En algunos casos, un programador puede manejar tanto el caso habitual como el caso inusual con código sin ramificaciones .

Situaciones especiales [ editar ]

Programas auto modificables
La técnica del código de modificación automática puede ser problemática en un procesador en cadena. En esta técnica, uno de los efectos de un programa es modificar sus propias instrucciones próximas. Si el procesador tiene un caché de instrucciones , es posible que la instrucción original ya se haya copiado en una cola de entrada de captación previa y la modificación no tendrá efecto. Algunos procesadores, como el Zilog Z280, pueden configurar sus memorias caché en chip para búsquedas de datos únicamente, o como parte de su espacio de direcciones de memoria ordinario, y evitar tales dificultades con las instrucciones de modificación automática.
Instrucciones ininterrumpidas
Una instrucción puede ser ininterrumpida para garantizar su atomicidad , como cuando intercambia dos elementos. Un procesador secuencial permite interrupciones entre instrucciones, pero un procesador de canalización se superpone a las instrucciones, por lo que la ejecución de una instrucción ininterrumpida también hace ininterrumpidas partes de las instrucciones ordinarias. El error de coma Cyrix podría colgar un sistema de un solo núcleo usando un bucle infinito en el que una instrucción ininterrumpida estaba siempre en la tubería.

Consideraciones de diseño [ editar ]

Velocidad
La canalización mantiene ocupadas todas las partes del procesador y aumenta la cantidad de trabajo útil que el procesador puede realizar en un tiempo determinado. La canalización normalmente reduce el tiempo de ciclo del procesador y aumenta el rendimiento de las instrucciones. La ventaja de velocidad se reduce en la medida en que la ejecución se encuentra con peligros que requieren que la ejecución disminuya por debajo de su tasa ideal. Un procesador sin canalización ejecuta solo una instrucción a la vez. El inicio de la siguiente instrucción se retrasa no en función de los peligros, sino de forma incondicional.
La necesidad de un procesador canalizado de organizar todo su trabajo en pasos modulares puede requerir la duplicación de registros, lo que aumenta la latencia de algunas instrucciones.
Economía
Al simplificar cada paso dependiente, la canalización puede permitir operaciones complejas de manera más económica que agregar circuitos complejos, como para cálculos numéricos. Sin embargo, un procesador que se niega a buscar una mayor velocidad con canalización puede ser más simple y económico de fabricar.
Previsibilidad
En comparación con los entornos en los que el programador necesita evitar o solucionar los peligros, el uso de un procesador sin canalización puede facilitar la programación y la formación de los programadores. El procesador sin canalización también facilita la predicción de la sincronización exacta de una secuencia de instrucciones determinada.

Ejemplo ilustrado [ editar ]

A la derecha hay una canalización genérica con cuatro etapas: buscar, decodificar, ejecutar y escribir. El recuadro gris superior es la lista de instrucciones que esperan ser ejecutadas, el recuadro gris inferior es la lista de instrucciones cuya ejecución se ha completado y el recuadro blanco del medio es la canalización.

La ejecución es la siguiente:

Canalización genérica de 4 etapas; los cuadros de colores representan instrucciones independientes entre sí

Burbuja de canalización [ editar ]

Una burbuja en el ciclo 3 retrasa la ejecución.

Un procesador en canalización puede hacer frente a los peligros deteniéndose y creando una burbuja en la canalización, lo que da como resultado uno o más ciclos en los que no ocurre nada útil.

En la ilustración de la derecha, en el ciclo 3, el procesador no puede decodificar la instrucción púrpura, quizás porque el procesador determina que la decodificación depende de los resultados producidos por la ejecución de la instrucción verde. La instrucción verde puede pasar a la etapa de ejecución y luego a la etapa de escritura diferida según lo programado, pero la instrucción violeta se detiene durante un ciclo en la etapa de recuperación. La instrucción azul, que debía recuperarse durante el ciclo 3, se detiene durante un ciclo, al igual que la instrucción roja que le sigue.

Debido a la burbuja (los óvalos azules en la ilustración), el circuito de decodificación del procesador está inactivo durante el ciclo 3. Su circuito de ejecución está inactivo durante el ciclo 4 y su circuito de escritura no está inactivo durante el ciclo 5.

Cuando la burbuja sale de la tubería (en el ciclo 6), se reanuda la ejecución normal. Pero todo ahora tiene un ciclo de retraso. Se necesitarán 8 ciclos (ciclo 1 a 8) en lugar de 7 para ejecutar completamente las cuatro instrucciones que se muestran en colores.

Ver también [ editar ]

  • Estado de espera
  • Canalización RISC clásica

Notas [ editar ]

  1. ^ Los primeros procesadores canalizados sin ninguna de estas heurísticas, como elprocesador PA-RISC de Hewlett-Packard , se ocupaban de los peligros simplemente advirtiendo al programador; en este caso, una o más instrucciones que siguen a la rama se ejecutarían independientemente de si la rama se tomó o no. Esto podría resultar útil; por ejemplo, después de calcular un número en un registro, se podría seguir una rama condicional cargando en el registro un valor más útil para cálculos posteriores tanto en el caso de rama como en el de no rama.

Referencias [ editar ]

  1. ^ Glaskowsky, Peter (18 de agosto de 2003). "Xtraordinary NPU de Xelerated - El primer procesador de paquetes de 40 Gb / s del mundo tiene 200 CPU" . Informe del microprocesador . 18 (8): 12-14 . Consultado el 20 de marzo de 2017 .
  2. ^ https://www.eetimes.com/xelerated-brings-programmable-40-gbits-s-technology-to-the-mainstream-ethernet/#
  3. ^ John Paul Shen, Mikko H. Lipasti (2004). Diseño de procesador moderno . Profesional de McGraw-Hill . ISBN 9780070570641.
  4. ^ Sunggu Lee (2000). Diseño de Computadoras y Otros Dispositivos Digitales Complejos . Prentice Hall . ISBN 9780130402677.
  5. ^ Raúl Rojas (1997). "Legado de Konrad Zuse: la arquitectura de la Z1 y Z3". IEEE Annals of the History of Computing . 19 (2).
  6. ^ "Conferencia 19 de CMSC 411, reenvío de datos de canalización" . Departamento de Ciencias de la Computación e Ingeniería Eléctrica de la Universidad de Maryland Baltimore County . Consultado el 22 de enero de 2020 .
  7. ^ "Computación de alto rendimiento, notas de la clase 11" . hpc.serc.iisc.ernet.in. Septiembre de 2000. Archivado desde el original el 27 de diciembre de 2013 . Consultado el 8 de febrero de 2014 .

Enlaces externos [ editar ]

  • Predicción de sucursales en la familia Pentium ( copia de Archive.org )
  • Artículo de ArsTechnica sobre canalización
  • Arquitectura del procesador de canalización de contraflujo