Está en la página 1de 58

Organización y Arquitectura de Computadoras

Cause segmentado de ejecución (pipeline)

Equipo 6
Roberto Mora Sepúlveda 1941421
Alejandro Eliud Martínez González 1488194
Índice
1. Paralelismo a nivel de instrucción (ILP)

2. Diseño de un procesador con cause segmentado

3. Conflictos (hazards) de control y de datos

4. Esquemas de predicción de salto, salto retardado


(delayed branch)
Introducción
En esta presentación, haremos una introducción general al
cause segmentado de ejecución (o pipeline), que es un
proceso utilizado por los procesadores para agilizar la lectura y
ejecución de instrucciones de manera ordenada.
Paralelismo a nivel de
instrucción (ILP)
¿Qué es el paralelismo a nivel de instrucción?
▪ El paralelismo a nivel de instrucción es un proceso por medio del
cual un procesador puede ejecutar más de una instrucción
simultáneamente.
▪ Es un proceso que ocurre a nivel de compilador y a nivel de
hardware simultáneamente, como ocurre también, por ejemplo,
con la memoria virtual.
• Todos los procesadores modernos utilizan el pipelining para sobreponer
la ejecución de instrucciones y mejorar su desempeño.
• Es a esta sobreposición potencial a la que se le conoce como
paralelismo a nivel de instrucción y puede ser optimizada a nivel de
hardware o software.
Cauce segmentado de ejecución (pipeline)
▪ Es una técnica de implementación en la que múltiples
instrucciones se sobreponen durante su ejecución.
▪ Una analogía de cómo funciona el cause segmentado es el cómo
lavamos nuestra ropa. El proceso es:
▫ Poner la ropa sucia en la lavadora
▫ Pasar la ropa a la secadora
▫ Ponerla en una mesa para doblarla
▫ Guardar la ropa en el armario
Sin utilizar cauce segmentado:
Utilizando cauce segmentado:
• Cabe notar que la segmentación de instrucciones no reduce el tiempo de
ejecución de una instrucción en particular, también conocida como
latencia.

• En nuestro ejemplo anterior, podemos ver la secadora siempre tarda


media hora en realizar su tarea, o que pasar por las 4 etapas siempre
toma 2 horas.

• Lo que la segmentación logra es explotar los recursos que no estén


siendo aprovechados en un determinado momento, aumentando la tasa
de transferencia efectiva (throughput).
Diseño de un
procesador con cauce
segmentado
Comparación de cauce segmentado vs implementación de ciclo único

▪ Estos mismos principios aplican cuando segmentamos instrucciones en


un procesador. Una instrucción MIPS toma típicamente 5 pasos:
1. Recibir la instrucción de la memoria
2. Leer los registros mientras se decodifica la instrucción
3. Ejecutar la operación o calcular la dirección
4. Accesar al operando en la memoria de datos
5. Escribir el resultado en un registro
Para hacer nuestra discusión más concreta, crearemos un cauce
segmentado. En este ejemplo nos limitaremos a 8 instrucciones:

1. Load Word (lw) 5. AND (and)


2. Store Word (sw) 6. OR (or)
3. Add (add) 7. Set Less Than (slt)
4. Substract (sub) 8. Branch On Equal (beq)
Tiempo total para cada instrucción calculado a partir del tiempo de cada
componente:
• Compararemos el tiempo promedio entre intrucciones en una
implementación de ciclo único, en la que todas las instrucciones toman
un ciclo del clock, contra una implemntación segmentada.

• En nuestro caso los tiempos de operación de c/instrucción son 200 ps


para el acceso a memoria, 200 ps para las operaciones ALU y 100 ps
para lectura/escritura de registros.

• En un modelo de ciclo único, cada instrucción toma exactamente un


ciclo del clock, así que el ciclo del clock debe ajustarse para acomodar
la instrucción más lenta.
Implementación de ciclo único:
Implementación de cauce segmentado (pipeline):
• Podemos observar que en la implementación de ciclo único, el ciclo del
clock debe tomar 800 ps, a pesar de que hay instrucciones como Branch
On Equal (beq) que podrían realizarse en 500 ps. El tiempo entre la
primera y la última instrucción es de 3 x 800 ps.

• De igual forma, cuando se utiliza el cauce segmentado, el ciclo del


clock debe acomodar el peor de los casos, que es 200 ps, a pesar de que
algunas de las etapas solo toman 100 ps. El tiempo entre la primera y
la última instrucción es de 3 x 200 ps.

• Se observa que la implementación de cauce segmentado tiene un


desempeño 4 veces mayor al del ciclo único.
• Podemos obtener una fórmula a partir de este ejemplo. Si suponemos
que todas las etapas son equivalentes, entonces el tiempo entre
instrucciones en un procesador de cauce segmentado –suponiendo
condiciones ideales- es igual a:

Tsegmentado = Tno segmentado


Número de instrucciones

Donde T denota el tiempo entre instrucciones


• Bajo condiciones ideales y con un alto número de instrucciones, el
incremento en velocidad se aproxima al número de etapas. Es decir, un
cauce segmentado de 5 etapas es aproximadamente 5 veces mayor.

• Sin embargo, esto es sólo aplica en la teoría, ya que en la práctica esto


se ve limitado por razones técnicas.

• El cauce segmentado es útil porque incrementa la tasa de transferencia


efectiva de instrucciones, no porque minimize el tiempo de ejecución de
una instrucción en particular. Pero la tasa de transferencia efectiva es
importante porque los programas en la vida real ejecutan millones de
instrucciones.
Conflictos (hazards) de
control y de datos
¿Qué es un Hazard?
▪ Hay situaciones, llamadas riesgos (hazards), que impiden que se ejecute
la siguiente instrucción del flujo de instrucciones durante su ciclo de reloj
designado.

▪ Los riesgos reducen el rendimiento de la velocidad ideal lograda por la


segmentación.
Tipos de riesgos
1. Riesgos estructurales surgen de conflictos de los recursos, cuando el hardware
no puede soportar todas las combinaciones posibles de instrucciones en
ejecuciones solapadas simultáneamente (en el ciclo de reloj).
2. Riesgos por dependencias de datos surgen cuando una instrucción depende de
los resultados de una instrucción anterior, de forma que, ambas, podrían llegar a
ejecutarse de forma solapada.
3. Riesgos de control surgen de la segmentación de los saltos y otras instrucciones
que cambian el PC.
Los riesgos en la segmentación pueden hacer necesario detenerla.

Una detención en una máquina segmentada requiere, con frecuencia,


que prosigan algunas instrucciones, mientras se retardan otras.

Detalle importante: las instrucciones anteriores a la instrucción detenida


pueden continuar, pero no se buscan instrucciones nuevas durante la
detención.
Una detención hace que el rendimiento de la segmentación se degrade
con relación al rendimiento ideal.

La segmentación se puede considerar como una disminución del CPI o


de la duración del ciclo de reloj; tratémosla como una disminución del
CPI. El CPI ideal en una máquina segmentada es habitualmente.
Mediante sustitución de varias fórmulas llegamos a esta fórmula para ver el
rendimiento efectivo de una determinada segmentación
Riesgos estructurales
Cuando se segmenta una máquina, la ejecución solapada de las instrucciones
requiere la segmentación de unidades funcionales y duplicación de recursos
para permitir todas las posibles combinaciones de instrucciones. Si alguna
combinación de instrucciones no se puede acomodar debido a conflictos de
recursos, se dice que la máquina tiene un riesgo estructural.
Ejemplo.

Banco de registros:

Acceso al banco de registros en 2 etapas:


 Lectura durante la etapa 2 (ID)
 Escritura durante la etapa 5 (Wb)

Solución: dos puertos de lectura y uno de escritura


Símbolo Terminologías Función
IM (Instruction Memory) ó Búsqueda de instrucción
IF (Instruction Fetch)
DM (Data Memory) o MEM Accede a Memoria

/ Reg (Register Fetch) ó ID/WB


(Instruction Decode/Write Back)
Lee datos de registro o Decodifica la instrucción / Escribe el
dato en el registro
ALU (Arithmetic Logic Unit) ó Hace las operaciones aritméticas correspondientes
EX (Execute / address calculation)
Una manera de evitar problemas cuando se puede crear empalmes
de este tipo sería con

• Arbitraje con interbloqueo: se añade hW que arbitre el conflicto


e interbloquee a una de las instrucciones. Esto crea la aparición
de burbujas o huecos, es decir, tiempo ocioso en la instrucción.
Riesgos por dependencias de datos

▪ Los riesgos por dependencias de datos se presentan cuando el


orden de acceso a los operandos los cambia la segmentación,
con relación al orden normal que se sigue en las instrucciones
que se ejecutan secuencialmente.
Considerar la ejecución encauzada de las instrucciones:
ADD R1,R2,R3
SUB R4,R1,R5
La instrucción SUB tiene una fuente, R1, que es el destino de la
instrucción ADD.
El problema planteado en este ejemplo puede resolverse con una simple técnica
hardware llamada adelantamiento (forwarding) (también llamada desvío
[bypassing] y a veces cortocircuito).

Esta técnica funciona como sigue: el resultado de la ALU siempre realimenta sus
cerrojos de entrada. Si el hardware de adelantamiento detecta que la operación
previa de la ALU ha escrito en un registro, correspondiente a una fuente para la
operación actual de la ALU, la lógica de control selecciona el resultado adelantado
como entrada de la ALU en lugar del valor leído en el fichero de registros.

Observar que con el adelantamiento, si SUB es detenida, se completará ADD, y no


se activará el desvío, haciendo que se utilice el valor del registro. Esto también es
cierto para el caso de una interrupción entre las dos instrucciones.
• La instrucción ADD inicializa R1, y
las cuatro instrucciones siguientes lo
utilizan.
• El valor de R1 debe ser desviado
para las instrucciones SUB, AND y
OR.
• En el instante que la instrucción XOR
va a leer R1 en la fase ID, la
instrucción ADD ha completado WB,
y el valor está disponible.
Cada nivel de desvío requiere un cerrojo y un par de
comparadores para examinar si, instrucciones adyacentes,
comparten un destino y una fuente.

Para operaciones de la ALU, el resultado se adelanta siempre


que la instrucción que utiliza el resultado como fuente entra en
su etapa EX. (La instrucción que calculó el valor que se va a
adelantar, puede estar en sus etapas MEM o WB.)
Se necesitan dos buffers que contengan los resultados de la ALU que se
van a almacenar en el registro destino en las dos siguientes etapas WB.

Los resultados de los buffers pueden ser


entradas a uno de los puertos de la ALU,
vía un par de multiplexores.
Existen variantes del ejemplo mencionado, estos serian (tomando la instrucción de ejemplo):
Instr1 seguida de Instr2
1. Riesgo Read After Write (RAW):
 Instr2 trata de leer un operando fuente antes de que sea escrito por Instr1
2. Riesgo Write After Write (WAW):
 Instr2 trata de escribir un operando antes de que la instr1 lo escriba
 Si se escribe en más de una etapa, cuando se detiene la primera escritura y se permite la
segunda
3. Riesgo Write After Read (WAR)
 Instr2 trata de escribir un resultado antes de la instr1 lo lea
 Instrucciones que escriben resultados al comienzo del cauce con otras que leen un
operando fuente tarde dentro del cauce
No todos los riesgos por dependencias de datos se pueden manipular sin
que tengan efecto en el rendimiento. Considerar la siguiente secuencia de
instrucciones:

LW R1,32(R6)
ADD R4,R1,R7
SUB R5,R1,R8
AND R6,R1,R7

Este caso es diferente de la situación de las operaciones consecutivas de la


ALU. La instrucción LW no tiene el dato hasta el final del ciclo MEM,
mientras que la instrucción ADD necesita el dato al comienzo de ese ciclo
de reloj.
Podemos adelantar el resultado a la ALU directamente desde el MDR
(Memory Data Register), y para la instrucción SUB el resultado llega a
tiempo. Sin embargo, para la instrucción ADD el resultado adelantado
llega demasiado tarde -al final de un ciclo de reloj, aunque se necesita al
comienzo.

La instrucción de carga tiene un retardo o latencia que no se puede


eliminar sólo por adelantamiento; para hacer eso se requeriría que el
tiempo de acceso al dato fuese cero. La solución más común a este
problema es una adición de hardware denominada interbloqueo de la
segmentación.
Un interbloqueo de la segmentación detecta un riesgo y detiene la
segmentación hasta que el riesgo desaparece. En este caso el interbloqueo
detiene la segmentación comenzando a partir de la instrucción que quiere
utilizar el dato hasta que lo produzca la instrucción correspondiente. Este
ciclo de retardo, llamado burbuja o detención del cauce (pipeline stall or
bubble), permite que el dato de carga llegue desde memoria; ahora puede ser
adelantado por el hardware.
El proceso de permitir que una instrucción se desplace desde la etapa
de decodificación de la instrucción (ID) a la de ejecución (EX) de este
cauce, habitualmente, se denomina emisión de la instrucción
(instruction issue); y una instrucción que haya realizado este paso se
dice que ha sido emitida (issued).
En lugar de permitir que se detenga la segmentación, el compilador
puede intentar realizar una planificación que evite estas paradas,
reorganizando la secuencia de código para eliminar el riesgo.

Esta técnica se le denomina planificación de la segmentación o


planificación de instrucciones.
El hardware requerido para detectar y controlar los riesgos por dependencias de
datos de la carga y adelantar el resultado de la carga es como sigue:

• Multiplexores adicionales en las entradas a la ALU (como se requería para el


hardware de desvío para las instrucciones registro-registro).

• Caminos extra desde el MDR a las entradas de los multiplexores a la ALU.

• Un buffer para guardar los números del registro-destino de las dos instrucciones
anteriores (igual que para el adelantamiento registro-registro).

• Cuatro comparadores para comparar los dos posibles campos del registro fuente
con los campos destino de las instrucciones anteriores y buscar una coincidencia
Riesgos de control
▪ Los riesgos de control pueden provocar mayor pérdida de
rendimiento para la segmentación de DLX que los riesgos por
dependencias de datos.
▪ Si un salto cambia el PC a su dirección destino, el salto es
efectivo; en caso contrario es no efectivo. Si la instrucción i es
un salto efectivo, entonces el PC, normalmente, no cambia hasta
el final de MEM, después de que se complete el cálculo de la
dirección y comparación
Esto significa detención durante tres ciclos de reloj, al final de los cuales el nuevo
PC es conocido y se puede buscar la instrucción adecuada. Este efecto se denomina
un riesgo de salto o de control.

El esquema de la Figura no es posible porque no sabemos que la instrucción es un


salto hasta después de la búsqueda de la siguiente instrucción.
A continuación soluciona el problema repitiendo sencillamente la
búsqueda una vez que se conoce el destino.
El número de ciclos de reloj de una detención de salto puede reducirse en
dos pasos:

1. Averiguar si el salto es efectivo o no anteriormente en la segmentación.


2. Calcular anteriormente el PC efectivo (dirección destino del salto).

Para optimizar el comportamiento del salto deben realizarse los dos pasos
anteriores (no ayuda conocer el destino del salto sin saber si la siguiente
instrucción a ejecutar es el destino o la instrucción del PC + 4).
Esquemas de predicción de
salto, salto retardado
(delayed branch)
Evaluación de predicción de salto
Dos estrategias:
• Estática: Suponer que los saltos hacia atrás se efectúan y los saltos
hacia adelante no
• Dinámica: Predicción basada en perfiles: se guarda el
comportamiento del salto, y se hace una predicción basada en
ejecuciones previas
Las instrucciones entre saltos mal predichos constituyen una buena
métrica de los errores de predicción
El esquema más fácil es congelar la segmentación, reteniendo todas las
instrucciones después del salto hasta que se conozca el destino del salto. Lo
atractivo de esta solución radica, principalmente, en su simplicidad.

Un esquema mejor y sólo ligeramente más complejo es predecir el salto


como no efectivo, permitiendo, sencillamente, que el hardware continúe
como si el salto no se ejecutase. Aquí hay que tener cuidado de no cambiar el
estado de la máquina hasta que no se conozca definitivamente el resultado
del salto. La dificultad que surge de esto puede hacernos reconsiderar la
solución más simple de limpiar (flushing) la segmentación.
Un esquema alternativo es predecir el salto como efectivo. Una vez que se
decodifica el salto y se calcula la dirección destino, suponemos que el salto
se va a realizar y comienza la búsqueda y ejecución en el destino.
Como en la segmentación de DLX no se conoce la dirección del destino
antes de que se conozca el resultado del salto, no hay ventaja en esta
aproximación. Sin embargo, en algunas máquinas el destino del salto se
conoce antes de que el resultado del salto, y este esquema tiene sentido.
Algunas máquinas han utilizado otra técnica denominada salto retardado,
que se ha utilizado en muchas unidades de control microprogramadas. En un
salto retardado, el ciclo de ejecución con un retardo de salto de longitud n
es:
instrucción de salto
succesor secuencial,
succesor secuencial,
………..
succesor secuencial,
destino de salto si efectivo
Planificación del hueco de
retardo de los saltos. El cuadro
de cada pareja muestra el código
antes de la planificación y el
cuadro inferior muestra el
código planificado.
En (a) el hueco de retardo se
planifica con una instrucción
independiente anterior al salto.
Esta es la mejor elección.
Las estrategias (b) y (c) se
utilizan cuando no es posible (a).
En las secuencias de código para
(b) y (c), el uso de R1 en la
condición de salto impide que la
instrucción ADD (cuyo destino
es R1) sea transferida después
del salto
En (b) el hueco de retardo de salto se planifica
con el destino de salto; habitualmente, la
instrucción del destino necesitará ser copiada
porque puede ser alcanzada por otro camino.
La estrategia (b) se prefiere cuando el salto se
realiza con alta probabilidad, como, por ejemplo,
un salto de bucle. Finalmente, el salto puede ser
planificado con la instrucción siguiente,
secuencialmente, como en (c).
Para hacer esta optimización legal para (b) o (c),
debe ser «OK» ejecutar la instrucción SUB
cuando el salto vaya en la dirección no esperada.
Por «OK» significamos que el trabajo se
desperdicia, pero el programa todavía se
ejecutará correctamente.
Los sucesores secuenciales están en huecos de retardo del salto (branch-delay slots). Como con los
huecos de retardo de carga, la tarea del software es hacer las instrucciones sucesoras válidas y útiles

Las limitaciones principales en la planificación de saltos retardados surgen de las restricciones sobre
las instrucciones que se planifican en los huecos de retardo y de nuestra posibilidad para predecir en
tiempo de compilación la probabilidad con que un salto va a ser efectivo.
Cuando el planificador de la Figura no pueda utilizar la estrategia (a) -transferir una instrucción
anterior al salto para rellenar el hueco de retardo del salto- solo utiliza la estrategia (b) -moviendo
una instrucción del destino. (Por razones de simplicidad, el planificador no utiliza la estrategia
(c).)
CONCLUSIÓN
• La implementación del modelo de cauce segmentado es una gran
herramienta que nos ayuda a optimizar los recursos computacionales
con los que contamos, aprovechando su uso de formas en que se
desperdiciarían siguiendo un modelo de ciclo único.
• Es una solución basada en la intuición cotidiana que ha sido adaptada la
rama de la arquitectura computacional.
CONCLUSIÓN
• Implementar el cauce segmentado conlleva implicaciones que deben ser
de mucho cuidado, pues debe haber una planeación teniendo en cuenta
escenarios para evitar problemas que puedan ocasionar perdida de
información, cálculos incorrectos, hacer que incluso los sistemas
pudiesen colapsar por errores lógicos, todo esto pudiéndose evitar con
un buen trabajo de diseño de instrucciones.
Fuentes
• Patterson. Computer Organization And Design:
https://ict.iitk.ac.in/wp-content/uploads/CS422-Computer-Architec
ture-ComputerOrganizationAndDesign5thEdition2014.pdf
• Hennessy, J. (2014). Computer Organization and Design The
Hardware / Software Interface. United States of America: ELSEVIER
• Hennessy , J. (1993). ARQUITECTURA DE COMPUTADORES. UN
ENFOQUE CUANTITATIVO . España: McGraw-Hill

También podría gustarte