Pipeline

Es una técnica que se implementa en los procesadores (Actualmente la mayoría de los procesadores modernos) para mejorar la eficacia del trabajo que se realiza y así se consigue utilizar y aprovechar al máximo los componentes del procesador, con esto se consigue aumentar el rendimiento de algunos sistemas electrónicos digitales en la que se superpone la ejecución de varias instrucciones dentro de un solo procesador. 

Su aporte a la computación fue que elimino la dependencia del ciclo de fetch en sus tres etapas principales y las dividió y en la etapa de decode la dividió en dos etapas (Calculate operands y fetch operands) además de también poder hacer un prefetch el cual lo que hace es leer información de forma anticipada antes de que sea requerida con la idea de que el procesador no se detenga  a la espera de la siguiente instrucción y esto ocasiona que se aumente el rendimiento de la computadora a una velocidad de reloj determinada. 

Como funciona el Pipeline 

El pipeline de un procesador tiene 6 etapas de funcionamiento las cuales son las siguientes: 

  • Fetch instruction: Trae la instrucción a la unidad central de procesamiento. 

  • Decode instruction: Decodifica la instrucción para saber lo que necesita. 

  • Calculate operands: Cálculo: suma dos registros, corrimiento en memoria, salto a alguna dirección. 

  • Fetch operands: Trae los operadores que están en los registros o memoria principal. 

  • Execute instruction: Realiza el trabajo específico de lo que se solicitó. 

  • Write operands: Escritura de los resultados. 

Por ejemplo digamos que se tienen 3 instrucciones que el procesador tiene que ejecutar por ende en el primer tick de reloj la instrucción 1 entra en la etapa de fetch instruction, en el segundo tick de reloj la instrucción 1 pasaría a la etapa de decode instruction y la instrucción 2 pasaría a la etapa de fetch instruction, en el tercer tick la instrucción 1 se encontraría en la  etapa de calculate operands mientras que la instrucción 2 se encontraría en la etapa de decode seguidamente la instrucción 3 se encontraría en la etapa de fecth, en el cuarto tick de reloj la instrucción 1 se encontraría en la etapa de fetch operands mientras que la instrucción 2 se encuentra en la etapa de calculete operands y la instrucción 3 se encuentra en la etapa de decode , si hubiera una instrucción 4 en este tick de reloj entraría al fetch instruction pero como lo hay no se entra a esa etapa y se sigue el ciclo hasta acabar de ejecutar las instrucciones. A continuación, se presentará una tabla para explicar lo mencionado anteriormente: 

 

1 

2 

3 

4 

5 

6 

7 

8 

9 

Ins 1 

FI 

DI 

CO 

FO 

EI 

WO 

 

 

 

Ins 2 

 

FI 

DI 

CO 

FO 

EI 

WO 

 

 

Ins 3 

 

 

FI 

DI 

CO 

FO 

EI 

WO 

 

 

Predicción de saltos 

La predicción de saltos es un circuito que decide si se toma un salto o no utilizando un tipo de estadística para tratar de hacer esta predicción. Además es uno de los acercamientos para solucionar el problema de las ramificaciones. Existen cinco técnicas que pueden ser implementadas: 

  • Nunca se saltará: En esta técnica nunca se hace el branch y siempre se carga la secuencia inmediatamente después del salto. 

  • Siempre se saltará: En esta técnica siempre hace el branch y siempre carga la secuencia destino. No es circuitería adicional. Mismo acercamiento de la carga anticipada de la rama. 

  • Por código de operación: En esta técnica se toma el código de la instrucción condicional y el código de la operación de salto. Se tiene una tabla en memoria con estos códigos y un contador que tiene: sí, no y total. Se tiene records para cada uno de los saltos. Si la cantidad de si´s es mayor a la cantidad de no´s, se toma el salto. De lo contrario, no lo toma. 

  • Intercambio de salto/no salto: Es un tipo de grafo de estados con todas las combinaciones de si toma salto o no. Se mueve en razón de dos factores: el estado actual y resultado del último salto. Si el salto se toma, se carga de forma anticipada la instrucción destino. 

  • Tabla histórica de saltos: Es una combinación entre buffer de ciclos y código de operación. En lugar de llevar el control del código condicional y código de operación, lleva el ID del programa que está ejecutando y el número de instrucción de ese programa y a partir de estos lleva la estadística de si se han tomado o no los saltos. Luego de esto, decide para tal instrucción si se hace el salto o no. Esto lo hace más exacto en cuanto a cada salto, ya que cada uno tiene su estadística propia. 

Ventajas 

  • El tiempo de ciclos del procesador es reducido 

  • Aumenta el rendimiento del sistema 

  • Se ejecuta más trabajo en cada ciclo del reloj. 

Desventajas 

  • El diseño de un procesador pipeline es complejo por lo tanto es más costoso de fabricar. 

  • La latencia de las instrucciones es más elevada 

  • La duración de cada etapa es diferente y atrasa las anteriores 

  • Dependencia de datos entre instrucciones 

  • Dificultad al acceso de datos. 

Referencias

  • Rauber, T., & Rünger, G. (2013). Parallel Programming: For Multicore and Cluster Systems (2nd 2013 ed.). Springer. 

No comments

Comentarios en artículos

No comments

Nobody has submitted a comment yet.