490 likes | 612 Views
Scheduling dinámico. Algoritmo de Tomasulo. Introducción. Desarrollado por Robert Tomasulo para la super-computadora IBM 360/91. Registra cuando los operandos de las instrucciones están listos para eliminar peligros RAW.
E N D
Scheduling dinámico Algoritmo de Tomasulo
Introducción • Desarrollado por Robert Tomasulo para la super-computadora IBM 360/91. • Registra cuando los operandos de las instrucciones están listos para eliminar peligros RAW. • Permite la ejecución de una instrucción tan pronto estén listos sus operandos. • Renombra registros para eliminar peligros WAR y WAW. Arquitectura de Computadoras
Ejemplo • Renombrar registros elimina peligros WAR y WAW. • div.d f0, f2, f4 ; f0 = f2 / f4 • add.d f6, f0, f8 ; f6 = f0 + f8 • s.d f6, 0(r1) ; Mem[r1] = f6 • sub.d f8, f10, f14 ; f8 = f10 – f14 • mul.d f6, f10, f8 ; f6 = f10 * f8 Arquitectura de Computadoras
Ejemplo • Dependencias: • Antidependencias: 2 y 4. • Dependencia de salidas: 2 y 5. • Dependencias de datos: 1 y 2; 2 y 3; 4 y 5; • Peligros: • WAR: uso de f8 en 2 y 4. • WAW: uso de f6 en 2 y 5. • RAW: uso de f0 en 1 y 2; uso de f6 en 2 y 3; uso de f8 en 4 y 5. Arquitectura de Computadoras
Ejemplo • Renombrando f6 y f8 se eliminan las dependencias de nombre y los peligros. • f6 en 2 y 3 a S. • f8 en 4, 5 y subsecuentes a T. • div.d f0, f2, f4 ; f0 = f2 / f4 • add.d S, f0, f8 ; S = f0 + f8 • s.d S, 0(r1) ; Mem[r1] = S • sub.d T, f10, f14 ; T = f10 – f14 • mul.d f6, f10, T ; f6 = f10 * T Arquitectura de Computadoras
Estaciones de reserva • Reservation stations (RS). • Mecanismo para renombrar registros. • Guarda operandos tan pronto están disponibles. • Las instrucciones pendientes designan la RS de donde obtendrán sus operandos. • Cuando hay escrituras sucesivas a un registro, solo la última escritura se usa para actualizar el registro. • Conforme las instrucciones se emiten, los registros de los operandos pendientes son renombrados por una RS. • Generalmente, hay mas RS que registros físicos. Arquitectura de Computadoras
Unidad de punto flotante en MIPS usando el algoritmo de Tomasulo Arquitectura de Computadoras
Explicación • Las instrucciones llegan de la unidad de instrucciones y se almacenan en la cola de instrucciones de donde son emitidas en orden FIFO. • Las RS incluyen: • La operación y los operandos. • Información para detectar y resolver peligros. • Las RS y los buffers de load y store tienen funciones semejantes y en esta explicación solo se distinguen cuando sea necesario. Arquitectura de Computadoras
Explicación • Los buffers de load tienen 3 funciones: • Guarda los componentes de la dirección efectiva hasta que es calculada. • Registrar los loads que están esperando en la memoria. • Guardar los resultados de los loads que están esperando al CDB (bus común de datos). Arquitectura de Computadoras
Explicación • Los buffers de store tienen 3 funciones: • Guarda los componentes de la dirección efectiva hasta que es calculada. • Guarda las direcciones destino que están esperando al valor del dato que van a guardar. • Guardar la dirección y el valor a guardar hasta que la unidad de memoria está disponible. • Los resultados de las unidades FP o de la unidad de carga se ponen en el CDB que va al banco de registros, los buffers de store y las RS. Arquitectura de Computadoras
Algoritmo básico • Las instrucciones pasan por 3 pasos: • Emisión (issue). También llamado despachar (dispatch). • Ejecución. • Escribir resultados. • Cada paso toma un número arbitrario de ciclos. Arquitectura de Computadoras
Algoritmo básico • Emisión. • Obtiene la siguiente instrucción de la cola. • Si hay una RS del tipo deseado que esté vacía, se emite la instrucción a la RS que tenga los valores de los operandos, si ya están en los registros. • Si los operandos no están en los registros, se registra la unidad funcional que va a producirlos. • Si no hay una RS vacía, se produce un peligro estructural y la instrucción se retiene (stall) hasta que se libere una RS o buffer. • Renombra registros. Arquitectura de Computadoras
Algoritmo básico • Ejecución. • Si uno o mas operandos no están disponibles, el CDB se monitorea mientras se espera que los operandos sean calculados. • Cuando un operandos está disponible, se coloca en la RS correspondiente. • Cuando todos los operandos están disponibles, la instrucción se ejecuta en la unidad funcional. • Esta espera elimina peligros RAW. Arquitectura de Computadoras
Algoritmo básico • Si en una unidad funcional hay mas de una instrucción lista para ejecutarse, la selección puede ser arbitraria. • Los loads y stores se ejecutan en dos pasos: • La dirección efectiva se calcula cuando el registro base está listo y luego se guarda en el buffer correspondiente. • Los loads se ejecutan tan pronto la unidad de memoria esté lista. Los stores esperan al valor a guardar antes de enviarlo a la memoria. • Para evitar peligros los loads y stores se hacen en orden hasta el paso 1. Arquitectura de Computadoras
Algoritmo básico • Escribir resultado. • Cuando el resultado está listo se escribe en el CDB, y de ahí se manda a las RS y buffers de store que estén esperando el resultado. • Los stores, se quedan en el buffer de store hasta que el valor a guardar y la dirección de memoria están disponibles. • El valor se guarda tan pronto la unidad de memoria esté libre. Arquitectura de Computadoras
Estaciones de reserva • Cada RS tiene 7 campos: • Op – La operación a realizar en los operandos S1 y S2. • Qj, Qk – Las RS que producirán los operandos. Un 0 indica que los operandos ya están en Vj o Vk, o que son innecesarios. • Vj, Vk – El valor de los operandos. Para loads, Vk se usa para guardar el offset. • A – Guarda información de la dirección de memoria para un load o store. Inicialmente el campo inmediato se guarda aquí, después del cálculo de la dirección, la dirección efectiva se guarda en A. Arquitectura de Computadoras
Estaciones de reserva • Busy – Indica que la RS y la correspondiente unidad funcional están ocupadas. • Además, el banco de registros tiene 1 campo: • Qi – El número de RS que contiene la operación cuyo resultado va a ser guardado en este registro. Si Qi es 0, no hay ninguna instrucción activa que vaya a guardar algo en este registro. Arquitectura de Computadoras
Ejemplo • En un sistema hay 7 RS: 2 de para loads, 3 para sumas y 2 para multiplicaciones. • Mostrar el estado de las RS y del banco de registros después de que la instrucción 1 ha terminado y escrito su resultado. Arquitectura de Computadoras
Ejemplo • Código: • l.d f6, 32(r2) ; f6 = Mem[r2 + 32] • l.d f2, 44(r3) ; f2 = Mem[r3 + 44] • mul.d f0, f2, f4 ; f0 = f2 * f4 • sub.d f8, f2, f6 ; f8 = f2 – f6 • div.d f10, f0, f6 ; f10 = f0 / f6 • add.d f6, f8, f2 ; f6 = f8 + f2 Arquitectura de Computadoras
Peligros • RAW – Entre 1 y 4 y entre 1 y 5 por f6; entre 2 y 3, entre 2 y 4 y entre 2 y 6 por f2. • WAR – Entre 4 y 6 y entre 5 y 6 por f6. • WAW – Entre 1 y 6 por f6. Arquitectura de Computadoras
Estado de las instrucciones Arquitectura de Computadoras
Estaciones de reserva Arquitectura de Computadoras
Banco de registros Arquitectura de Computadoras
Solución de peligros • Los peligros RAW se eliminaron al hacer que una instrucción no se ejecute hasta que sus operandos están listos. • Los peligros WAR por f6 se eliminaron al copiar el resultado del load (instrucción 1) a las estaciones de reserva donde están el sub y el div (instrucciones 4 y 5). • Ahora el add (instrucción 6) puede escribir en f6 sin problema. • No hubo peligro WAW porque la instrucción 1 terminó antes que la 6. Arquitectura de Computadoras
Ejemplo • Mostrar el estado de las RS, después de que la instrucción 3 está lista para escribir su resultado y la 5 todavía está en ejecución. • l.d f6, 32(r2) ; f6 = Mem[r2 + 32] • l.d f2, 44(r3) ; f2 = Mem[r3 + 44] • mul.d f0, f2, f4 ; f0 = f2 * f4 • sub.d f8, f2, f6 ; f8 = f2 – f6 • div.d f10, f0, f6 ; f10 = f0 / f6 • add.d f6, f8, f2 ; f6 = f8 + f2 Arquitectura de Computadoras
Estado de las instrucciones Arquitectura de Computadoras
Estaciones de reserva Arquitectura de Computadoras
Banco de registros Arquitectura de Computadoras
Especulación • El algoritmo básico de Tomasulo se puede extender para soportar especulación por hardware. • La especulación permite ejecutar instrucciones antes de saber el resultado de un brinco. • La especulación por hardware combina 3 ideas: • Predicción dinámica de brincos. • Especulación para ejecutar instrucciones antes de que las dependencias de control sean resueltas y deshacer los efectos si la especulación fue incorrecta. Arquitectura de Computadoras
Especulación • Scheduling dinámico para seleccionar que instrucciones se ejecutan. • Se necesita pasar el resultado a otras instrucciones antes de que la instrucción termine. • Se introduce un nuevo paso llamado compromiso (commit). • Una instrucción se compromete cuando se sabe que no es especulada. • Sólo entonces se le permite escribir al banco de registros o a la memoria. Arquitectura de Computadoras
Especulación • Las instrucciones de ejecutan fuera de orden pero se comprometen en orden. • Para comprometer en orden se usa un ROB (reorder buffer). • El ROB mantiene el resultado de una instrucción desde que termina hasta que se compromete. • Como ni la memoria ni el banco de registros se actualizan hasta que la instrucción se compromete, el ROB provee operandos a otras instrucciones durante ese tiempo. Arquitectura de Computadoras
Especulación • El buffer de store se elimina porque su función la realiza el ROB. • Los stores se realizan todavía en 2 pasos, el segundo paso lo hace el ROB. Arquitectura de Computadoras
Algoritmo con especulación Arquitectura de Computadoras
Algoritmo con especulación • Las instrucciones pasan por 4 etapas: • Emisión (issue). • Ejecución. • Escribir resultados. • Compromiso. Arquitectura de Computadoras
Algoritmo con especulación • Emisión. • Obtiene una instrucción de la cola de instrucciones. • La instrucción se emite si hay una RS libre y espacio en el ROB donde poner el resultado. • Envía los operandos a la RS si están disponibles en el banco de registros o en el ROB. • Envía el número de la entrada en el ROB a la RS para que el resultado sea etiquetado al colocarse en el CDB. • Si todas las RS están ocupadas o el ROB está lleno, la instrucción se detiene. Arquitectura de Computadoras
Algoritmo con especulación • Ejecución. • Si uno o mas operandos no están disponibles, el CDB se monitorea mientras se espera que los operandos sean calculados. • Este paso checa los peligros RAW. • Cuando los operandos están disponibles en el RS, la instrucción se ejecuta. • Los loads requieren dos etapas igual que antes. • Los stores solo necesitan que el registro base esté libre porque solo calculan la dirección efectiva. Arquitectura de Computadoras
Algoritmo con especulación • Escribir resultados. • Cuando el resultado está disponible, se escribe en el CDB y de ahí al ROB y otras RS que lo requieran. • La RS se marca como libre. • Los stores necesitan atención especial: • Si el valor a guardar está libre, se escribe en el ROB. • Si no está disponible, el CDB se monitorea hasta que el valor aparezca y entonces se escribe en el ROB. Arquitectura de Computadoras
Algoritmo con especulación • Compromiso. • Una instrucción se compromete cuando llega al frente del ROB. • Las acciones dependen del tipo de instrucción. • Si es un store, la memoria se actualiza. • Si es otra instrucción (excepto un brinco), el banco de registros se actualiza. • Si es un brinco mal adivinado, el ROB se limpia y la ejecución comienza en el lugar correcto. • Si es un brinco bien adivinado no pasa nada. • En cualquier caso, la entrada del ROB se libera. Arquitectura de Computadoras
Ejemplo • Mostrar el status de las tablas cuando el mul.d está listo para comprometerse. • l.d f6, 32(r2) ; f6 = Mem[r2 + 32] • l.d f2, 44(r3) ; f2 = Mem[r3 + 44] • mul.d f0, f2, f4 ; f0 = f2 * f4 • sub.d f8, f2, f6 ; f8 = f2 – f6 • div.d f10, f0, f6 ; f10 = f0 / f6 • add.d f6, f8, f2 ; f6 = f8 + f2 Arquitectura de Computadoras
ROB Arquitectura de Computadoras
Estaciones de reserva Arquitectura de Computadoras
Banco de registros Arquitectura de Computadoras
Ejemplo • Mostrar la ejecución del siguiente código: • loop: l.d f0, 0(r1) ; f0 = Mem[r1] • mul.d f4, f0, f2 ; f4 = f0 * f2 • s.d f4, 0(r1) ; Mem[r1] = f4 • daddiu r1, r1, #-8 ; r1 = r1 – 8 • bne r1, r2, loop ; if r1 r2 goto loop Arquitectura de Computadoras
Ejemplo • Suponiendo que: • Se especula que el ciclo fue tomado. • Se han emitido las instrucciones en el ciclo 2 veces. • El l.d y mul.d de la primera iteración ya se comprometieron y las demás instrucciones terminaron de ejecutarse. Arquitectura de Computadoras
ROB Arquitectura de Computadoras
Banco de registros • Las RS no se muestran porque no hay instrucciones ejecutando. Arquitectura de Computadoras
Ejemplo • Suponer que el primer brinco no debió ser tomado. • Las instrucciones anteriores al brinco se comprometen. • Cuando el brinco llega al frente, el ROB se limpia y se comienzan a sacar instrucciones del camino correcto. • En la práctica, al momento de saber que se adivinó mal se limpia la parte del ROB que corresponde al camino equivocado. Arquitectura de Computadoras
Conclusiones • El algoritmo de Tomasulo no fue usado desde la IBM 360/91 (1960s) hasta principios de los 90s. • Ahora ha sido ampliamente adoptado en los procesadores de emisión múltiple. • Consigue un gran rendimiento sin requerir que el compilador sea adaptado para cada arquitectura. • Los peligros WAW y WAR se eliminan porque las instrucciones se comprometen en orden. • Los peligros RAW se eliminan al no permitir que una instrucción continúe hasta que sus operandos están listos. Arquitectura de Computadoras
Conclusiones • Los peligros RAW en la memoria se eliminan con: • Un load en ejecución no puede iniciar su segundo paso si en el ROB hay un store activo con la misma dirección. • Manteniendo el orden de programa para el cálculo de la dirección efectiva de un load con respecto a los stores anteriores. • El scheduling dinámico es la forma preferida de scheduling usada actualmente. Arquitectura de Computadoras