Segmentación de instrucciones

El pipelining de instrucciones es una técnica utilizada en el diseño de microprocesadores, microcontroladores y CPUs modernos para aumentar su rendimiento de instrucciones (el número de instrucciones que pueden ejecutarse en una unidad de tiempo).

La idea principal es dividir (lo que se denomina "split") el procesamiento de una instrucción de la CPU, tal y como se define en el microcódigo de la instrucción, en una serie de pasos independientes de microoperaciones (también llamados "microinstrucciones", "micro-op" o "µop"), con almacenamiento al final de cada paso. Esto permite a la lógica de control de la CPU manejar las instrucciones a la velocidad de procesamiento del paso más lento, que es mucho más rápida que el tiempo necesario para procesar la instrucción como un solo paso.

El término tubería se refiere al hecho de que cada paso lleva una sola microinstrucción (como una gota de agua), y cada paso está vinculado a otro paso (analogía; similar a las tuberías de agua).

La mayoría de las CPUs modernas se mueven por medio de un reloj. La CPU consta internamente de lógica y memoria (flip flops). Cuando llega la señal de reloj, los flip flops almacenan su nuevo valor y luego la lógica requiere un período de tiempo para decodificar los nuevos valores de los flip flops. Luego llega el siguiente pulso de reloj y los flip flops almacenan otro valor, y así sucesivamente. Al dividir la lógica en piezas más pequeñas e insertar los flip flops entre las piezas de la lógica, el tiempo requerido por la lógica (para decodificar los valores hasta generar salidas válidas en función de estos valores) se reduce. De este modo, se puede reducir el periodo de reloj. Por
ejemplo, el pipeline RISC se divide en cinco etapas con un conjunto de flip flops entre cada etapa, de la siguiente manera

  1. Búsqueda de instrucciones
  2. Descodificación de instrucciones y obtención de registros
  3. Ejecutar
  4. Acceso a la memoria
  5. Registrar la respuesta

Los procesadores con pipelining constan internamente de etapas (módulos) que pueden trabajar de forma semi-independiente en microinstrucciones separadas. Cada etapa está conectada por medio de flip flops a la siguiente etapa (como una "cadena"), de modo que la salida de la etapa es una entrada para otra etapa hasta que se termina el trabajo de procesamiento de las instrucciones. Esta organización de los módulos internos del procesador reduce el tiempo total de procesamiento de las instrucciones.

Una arquitectura sin canalización no es tan eficiente porque algunos módulos de la CPU están inactivos mientras otro módulo está activo durante el ciclo de instrucción. La canalización no elimina por completo el tiempo de inactividad en una CPU canalizada, pero hacer que los módulos de la CPU trabajen en paralelo aumenta el rendimiento de las instrucciones.

Se dice que un pipeline de instrucciones está totalmente canalizado si puede aceptar una nueva instrucción cada ciclo de reloj. Un pipeline que no está totalmente alineado tiene ciclos de espera que retrasan el progreso del pipeline.

Canalización básica de cinco etapas en una máquina RISC (IF = búsqueda de instrucciones, ID = decodificación de instrucciones, EX = ejecución, MEM = acceso a la memoria, WB = escritura en el registro). El eje vertical son las instrucciones sucesivas, el eje horizontal es el tiempo. Así, en la columna verde, la primera instrucción se encuentra en la fase WB y la última está en fase de búsqueda de instrucciones.Zoom
Canalización básica de cinco etapas en una máquina RISC (IF = búsqueda de instrucciones, ID = decodificación de instrucciones, EX = ejecución, MEM = acceso a la memoria, WB = escritura en el registro). El eje vertical son las instrucciones sucesivas, el eje horizontal es el tiempo. Así, en la columna verde, la primera instrucción se encuentra en la fase WB y la última está en fase de búsqueda de instrucciones.

Ventajas y desventajas del pipelining

Ventajas del pipelining:

  1. El tiempo de ciclo del procesador se reduce, aumentando el rendimiento de las instrucciones. La canalización no reduce el tiempo que se tarda en completar una instrucción, sino que aumenta el número de instrucciones que se pueden procesar simultáneamente ("a la vez") y reduce el retardo entre las instrucciones completadas (lo que se denomina "rendimiento").
    Cuantas más etapas de pipeline tenga un procesador, más instrucciones podrá procesar "a la vez" y menos retraso habrá entre las instrucciones completadas. Todos los microprocesadores de
    propósito general que se fabrican hoy en día utilizan al menos 2 etapas de pipeline hasta 30 o 40 etapas.
  2. Si se utiliza el pipelining, la unidad aritmética lógica de la CPU puede diseñarse más rápidamente, pero será más compleja.
  3. En teoría, la canalización aumenta el rendimiento con respecto a un núcleo sin canalizar en un factor del número de etapas (suponiendo que la frecuencia de reloj también aumenta en el mismo factor) y el código es ideal para la ejecución en canal.
  4. Las CPUs con pipelines suelen trabajar a una frecuencia de reloj más alta que la de la RAM, (a partir de las tecnologías de 2008, las RAMs trabajan a frecuencias bajas en comparación con las frecuencias de las CPUs) aumentando el rendimiento general de los ordenadores.

Desventajas del pipelining:

El pipelining tiene muchas desventajas, aunque los diseñadores de CPUs y compiladores utilizan muchas técnicas para superar la mayoría de ellas; la siguiente es una lista de los inconvenientes más comunes:

  1. El diseño de un procesador no pipelinado es más sencillo y barato de fabricar, el procesador no pipelinado ejecuta una sola instrucción a la vez. Esto evita los retrasos en las bifurcaciones (en el pipelining, cada bifurcación se retrasa), así como los problemas cuando se ejecutan simultáneamente instrucciones en serie.
  2. En un procesador con pipelines, la inserción de flip flops entre módulos aumenta la latencia de las instrucciones en comparación con un procesador sin pipelines.
  3. Un procesador no canalizado tendrá un rendimiento de instrucciones definido. El rendimiento de un procesador con pipelines es mucho más difícil de predecir y puede variar mucho para diferentes programas.
  4. Muchos diseños incluyen pipelines de hasta 7, 10, 20, 31 e incluso más etapas; una desventaja de un pipeline largo es que cuando un programa se bifurca, todo el pipeline debe ser vaciado (limpiado). El mayor rendimiento de los pipelines se queda corto cuando el código ejecutado contiene muchas bifurcaciones: el procesador no puede saber de antemano dónde leer la siguiente instrucción, y debe esperar a que la instrucción de bifurcación termine, dejando el pipeline detrás de él vacío. Esta desventaja puede reducirse prediciendo si la instrucción de bifurcación condicional se bifurcará basándose en la actividad anterior. Una vez resuelta la bifurcación, la siguiente instrucción tiene que recorrer toda la tubería antes de que su resultado esté disponible y el procesador vuelva a "trabajar". En estos casos extremos, el rendimiento de un procesador canalizado puede ser peor que el de un procesador no canalizado.
  5. Por desgracia, no todas las instrucciones son independientes. En un pipeline sencillo, completar una instrucción puede requerir 5 etapas. Para funcionar a pleno rendimiento, este pipeline tendrá que ejecutar 4 instrucciones independientes posteriores mientras se completa la primera. Cualquiera de esas 4 instrucciones puede depender de la salida de la primera instrucción, lo que hace que la lógica de control del pipeline tenga que esperar e insertar un bloqueo o un ciclo de reloj desperdiciado en el pipeline hasta que se resuelva la dependencia. Afortunadamente, técnicas como el forwarding pueden reducir significativamente los casos en los que es necesario el stalling.
  6. Los programas que se modifican a sí mismos pueden no ejecutarse correctamente en una arquitectura de canalización cuando las instrucciones que se modifican están cerca de las instrucciones que se ejecutan. Esto puede deberse a que las instrucciones pueden estar ya en la cola de entrada de prefetch, por lo que la modificación puede no tener efecto para la próxima ejecución de instrucciones. Las cachés de instrucciones empeoran aún más el problema.
  7. Peligros: Cuando un programador (o compilador) escribe código ensamblador, generalmente asume que cada instrucción se ejecuta antes de la siguiente. Cuando esta suposición no es validada por el pipelining hace que un programa se comporte de forma incorrecta, la situación se conoce como peligro. Existen
    varias
    técnicas para resolver los peligros o trabajar en torno a ellos, como el forwarding y el delaying (insertando un stall o un ciclo de reloj desperdiciado).

Ejemplos

Tubería genérica

A la derecha se muestra una tubería genérica con cuatro etapas:

  1. Buscar en
  2. Descodificar
  3. Ejecutar
  4. Reescritura

El cuadro gris superior es la lista de instrucciones que esperan ser ejecutadas; el cuadro gris inferior es la lista de instrucciones que han sido completadas; y el cuadro blanco del medio es el pipeline.

La ejecución es la siguiente:

Tiempo

Ejecución

0

Cuatro instrucciones están a la espera de ser ejecutadas

1

  • la instrucción verde se obtiene de la memoria

2

  • la instrucción verde se descodifica
  • la instrucción púrpura se obtiene de la memoria

3

  • se ejecuta la instrucción verde (se realiza la operación real)
  • la instrucción púrpura se decodifica
  • la instrucción azul se recupera

4

  • los resultados de la instrucción verde se escriben en el archivo de registro o en la memoria
  • la instrucción púrpura se ejecuta
  • la instrucción azul se descodifica
  • la instrucción roja se obtiene

5

  • la instrucción verde se ha completado
  • la instrucción púrpura se escribe de vuelta
  • se ejecuta la instrucción azul
  • la instrucción roja es decodificada

6

  • La instrucción púrpura se completa
  • la instrucción azul se escribe de nuevo
  • se ejecuta la instrucción roja

7

  • la instrucción azul se ha completado
  • la instrucción roja se escribe de nuevo

8

  • la instrucción roja se ha completado

9

Todas las instrucciones se ejecutan

Burbuja

Cuando se produce un "hipo" (interrupción) en la ejecución, se crea una "burbuja" en el pipeline en la que no ocurre nada útil. En el ciclo 2, la búsqueda de la instrucción púrpura se retrasa y la etapa de decodificación en el ciclo 3 contiene ahora una burbuja. Todo lo que está detrás de la instrucción púrpura se retrasa también, pero todo lo que está delante de la instrucción púrpura continúa con la ejecución.

Claramente, cuando se compara con la ejecución anterior, la burbuja produce un tiempo de ejecución total de 8 ticks de reloj en lugar de 7.

Las burbujas son como los stalls (retrasos), en los que no ocurrirá nada útil para la obtención, decodificación, ejecución y escritura. Es como un código NOP (abreviatura de No OPeration).

Ejemplo 1

Una instrucción típica para sumar dos números podría ser ADD A, B, C, que suma los valores que se encuentran en las ubicaciones de memoria A y B, y luego pone el resultado en la ubicación de memoria C. En un procesador canalizado, el controlador de canalización dividiría esto en una serie de tareas similares a:

LOAD A, R1 LOAD B, R2 ADD R1, R2, R3 STORE R3, C LOAD siguiente instrucción

Las posiciones 'R1' y 'R2' son registros en la CPU. Los valores almacenados en las ubicaciones de memoria etiquetadas como 'A' y 'B' se cargan (copian) en estos registros, luego se suman y el resultado se almacena en una ubicación de memoria etiquetada como 'C'.

En este ejemplo, el pipeline consta de tres etapas: cargar, ejecutar y almacenar. Cada uno de los pasos se llama etapas del pipeline.

En un procesador sin canalización, sólo puede funcionar una etapa a la vez, por lo que la instrucción completa tiene que terminar antes de que pueda comenzar la siguiente. En un procesador con pipelines, todas las etapas pueden trabajar a la vez en diferentes instrucciones. Así, cuando esta instrucción está en la etapa de ejecución, una segunda instrucción estará en la etapa de decodificación y una tercera instrucción estará en la etapa de búsqueda.

Ejemplo 2

Para entender mejor el concepto, podemos ver una tubería teórica de tres etapas:

Escenario

Descripción

Carga

Instrucción de lectura de la memoria

Ejecutar

Ejecutar instrucción

Tienda

Almacenar el resultado en la memoria y/o en los registros

y un listado de pseudocódigo ensamblador para ser ejecutado:

LOAD #40, A ; carga 40 en A MOVE A, B ; copia A en B ADD #20, B ; añade 20 a B STORE B, 0x300 ; almacena B en la celda de memoria 0x300

Así es como se ejecutaría:

Reloj 1

Carga

Ejecutar

Tienda

CARGA

 

 

La instrucción LOAD se obtiene de la memoria.

Reloj 2

Carga

Ejecutar

Tienda

MOVER

CARGA

 

La instrucción LOAD se ejecuta, mientras que la instrucción MOVE se obtiene de la memoria.

Reloj 3

Carga

Ejecutar

Tienda

ADD

MOVER

CARGA

La instrucción LOAD está en la fase de almacenamiento, donde su resultado (el número 40) se almacenará en el registro A. Mientras tanto, se está ejecutando la instrucción MOVE. Como debe mover el contenido de A a B, debe esperar a que termine la instrucción LOAD.

Reloj 4

Carga

Ejecutar

Tienda

TIENDA

ADD

MOVER

La instrucción STORE está cargada, mientras que la instrucción MOVE está terminando y la ADD está calculando.

Y así sucesivamente. Tenga en cuenta que, a veces, una instrucción dependerá del resultado de otra (como nuestro ejemplo MOVE). Cuando más de una instrucción hace referencia a una ubicación particular para un operando, ya sea leyéndolo (como entrada) o escribiéndolo (como salida), la ejecución de esas instrucciones en un orden diferente del orden original del programa puede llevar a la situación de peligro (mencionada anteriormente).

Tubería genérica de 4 etapas; las cajas de color representan instrucciones independientes entre síZoom
Tubería genérica de 4 etapas; las cajas de color representan instrucciones independientes entre sí

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

Páginas relacionadas

  • Tubería (informática)
  • Computación paralela
  • Paralelismo a nivel de instrucción

Preguntas y respuestas

P: ¿Qué es el pipelining de instrucciones?


R: La canalización de instrucciones es una técnica utilizada en el diseño de microprocesadores, microcontroladores y CPU modernos para aumentar el rendimiento de sus instrucciones dividiendo el procesamiento de una instrucción de CPU en una serie de pasos independientes con almacenamiento al final de cada paso.

P: ¿Cómo funciona el pipelining?


R: El pipelining funciona dividiendo la lógica en piezas más pequeñas e insertando flip flops entre las piezas de lógica, lo que reduce el tiempo necesario para que la lógica decodifique los valores hasta generar salidas válidas en función de estos valores. Esto permite periodos de reloj más rápidos.

P: ¿Cuáles son algunos ejemplos de canalizaciones?


R: Un ejemplo de canalización es la canalización RISC, que se divide en cinco etapas con un conjunto de flip flops entre cada etapa.

P: ¿Cómo aumenta el pipelining el rendimiento de las instrucciones?


R: El pipelining aumenta el rendimiento de las instrucciones al permitir que los módulos de la CPU trabajen en paralelo, lo que reduce el tiempo de inactividad durante un ciclo de instrucciones y aumenta el tiempo total de procesamiento.

P: ¿Están todos los pipelines completamente canalizados?


R: No, no todos los pipelines son completamente pipelines; algunos pipelines tienen ciclos de espera que retrasan el progreso en el pipeline.

AlegsaOnline.com - 2020 / 2023 - License CC3