Planificación dinámica

Transcripción

Planificación dinámica
Hasta ahora hemos visto que los procesadores en pipeline ejecutan varias instrucciones
simultáneamente pero manteniendo el mismo orden del programa, es decir, dadas dos
instrucciones i y j de un programa cuyo orden lógico es primero i y después j, al ejecutarlo en el
pipeline, primero se arranca i y después se arranca j.
También hemos visto que algunas unidades funcionales pueden requerir múltiples ciclos para su
etapa de ejecución (operaciones multiciclo), dando lugar a que las instrucciones puedan terminar
fuera de orden. No obstante, la emisión de las instrucciones siempre se ha hecho en orden.
Como hemos podido ver, esta ejecución “ordenada” de las instrucciones puede dar lugar a
riesgos o peligros debidos a dependencias de datos o a problemas estructurales, los cuales
pueden acabar generando paradas del pipeline con la consiguiente pérdida de rendimiento. Para
aliviar esta pérdida de prestaciones, el compilador puede tratar de planificar el orden de las
instrucciones de tal manera que se minimicen los riesgos o dependencias de datos. Esto se
conoce como planificación estática.
En este capítulo vamos a abordar otra vía para minimizar las paradas debidas a las
dependencias de datos: ejecutando las instrucciones fuera de orden, esto es, mediante
planificación dinámica de instrucciones, según la cual, las instrucciones pueden arrancarse
fuera del orden del programa establecido por el compilador.
Así, ahora vamos a ver dos nuevos modelos de ejecución de las instrucciones (distintos del
pipeline simple que hemos visto hasta ahora) que implementan planificación dinámica
mediante dos técnicas: el Algoritmo del Marcador (scoreboard) y su evolución, el Algoritmo de
Tomasulo.
Arquitectura de Computadores
Planificación Dinámica - 1
Como hemos visto hasta hora, para que un procesador pueda ejecutar varias instrucciones
simultáneamente, tiene que tener una arquitectura segmentada (en pipeline), disponer de
múltiples unidades funcionales, o ambas cosas. Nosotros trataremos con procesadores
segmentados y con varias unidades funcionales.
Veamos el fragmento de código de arriba. La instrucción SUB no puede arrancar su ejecución
puesto que la dependencia que tiene la instrucción ADD respecto a DIV causa la parada del
cauce, aunque SUB no tiene ninguna dependencia de datos de ninguna instrucción en el cauce.
Cuando no hay múltiples unidades funcionales, la instrucción SUB no tiene más remedio que
esperar. Por otra parte, si tenemos múltiples unidades funcionales (para sumas, divisiones, etc.),
la parada del cauce puede hacer que algunas de las unidades funcionales queden ociosas,
cuando hay instrucciones que sí podrían ejecutarse en ellas, pero que el orden de ejecución lo
impide.
Esta limitación a una ejecución eficiente puede eliminarse si no se requiere la ejecución en orden.
Obviamente, no se puede alterar alegremente el orden de ejecución de cualquier grupo de
instrucciones del programa, pero anteriormente ya hemos visto situaciones en las que sí se
puede modificar el orden de ejecución de algunas instrucciones sin modificar la semántica del
programa.
Arquitectura de Computadores
Planificación Dinámica - 2
Para permitir la ejecución fuera de orden vamos a tener que modificar nuestro cauce clásico.
Para empezar, la etapa F (Fetch) se encargará, como ya sabemos, de ir extrayendo
instrucciones, pero en lugar de entregárselas directamente a la siguiente etapa, las dejará en un
buffer o cola de instrucciones.
La etapa D se ocupaba de la decodificación de la instrucción, comprobación de riesgos
estructurales y de datos, y alimentación de operandos. Ahora la vamos a descomponer en dos
etapas consecutivas:
• Emisión: Toma una instrucción del buffer de instrucciones, la decodifica y se comprueban los
riesgos estructurales (por ej. que la unidad funcional que se necesita, está disponible).
• Lectura de operandos: Se espera hasta que no haya riesgos de datos y, a continuación, se
leen los operandos. La instrucción queda lista para pasar a la unidad funcional que le
corresponda.
En este nuevo pipeline, todas las instrucciones entran en orden en la etapa de Emisión, pero una
instrucción puede detenerse en esta etapa si hay riesgos estructurales, o puede adelantar a otra
instrucción parada en Emisión, y pasar a la etapa de Lectura de Operandos, por lo que entraría
en la etapa de Ejecución ¡fuera de orden!.
Arquitectura de Computadores
Planificación Dinámica - 3
Los procesadores con planificación dinámica presentan estas ventajas:
•  Permite la gestión de ciertos casos en los que no es fácil conocer las dependencias en tiempo
de compilación, como, por ejemplo, cuando se hace referencia a datos que no están en
registros, sino en direcciones de memoria, lo cual, además, simplifica el diseño del compilador.
•  Aprovechan los retardos imprevistos, como los debidos a los fallos de caché (el dato no está
en la caché y hay que ir a buscarlo a memoria principal), ejecutando otras instrucciones
mientras espera el dato de la memoria.
•  Distintos procesadores de la misma familia pueden compartir la arquitectura, pero también
pueden ofrecer distintas configuraciones de su cauce, es decir, más o menos unidades
funcionales o estaciones de reserva. Con la planificación dinámica se permite aprovechar
eficientemente las características del pipeline concreto sobre el que se ejecuta el programa
compilado para una arquitectura genérica (sin especificar las peculiaridades de cada
procesador de la familia).
Por el contrario, también tienen ciertos inconvenientes:
•  Para ofrecer todas las ventajas anteriores, hay que complicar notablemente el hardware,
haciéndolo más caro.
•  La planificación dinámica trae consigo la ejecución fuera de orden, lo que también implica
terminación fuera de orden, y esto significa la aparición de riesgos de datos de tipo WAR y
WAW.
•  Complica mucho el tratamiento de los riesgos de control, en especial, el tratamiento de las
interrupciones.
Arquitectura de Computadores
Planificación Dinámica - 4
Vamos a ver aquí dos técnicas para la implementación de la planificación dinámica.
Comenzaremos con el llamado Método del Marcador y, posteriormente, un refinamiento de éste,
denominado Algoritmo de Tomasulo.
Aunque en estos dos modelos, las instrucciones también se van a ejecutar en varias etapas o
pasos, no se va a seguir el mismo modelo del cauce segmentado convencional en el que en
cada etapa (de cada unidad funcional) solamente hay una instrucción en un momento dado, ya
que ahora en cada etapa podrán intervenir varias instrucciones.
Arquitectura de Computadores
Planificación Dinámica - 5
El método del marcador fue implementado antiguamente por el supercomputador CDC 6600 con
el nombre de Scoreboard, cuyo objetivo era obtener el rendimiento óptimo de una instrucción por
ciclo, por lo que simplemente intenta ejecutar una instrucción lo antes posible (siempre que no
hubiera riesgos estructurales). Así, cuando la siguiente instrucción para ejecutar está detenida,
otras instrucciones pueden ser “emitidas” y ejecutadas si no dependen de ninguna instrucción
activa o detenida.
El módulo denominado “Marcador” se encarga de controlar la emisión, la ejecución de las
instrucciones y la detección de riesgos.
Para conseguir la ejecución “fuera de orden” se requiere que múltiples instrucciones estén en su
etapa de Ejecución simultáneamente, para lo cual se necesitan múltiples unidades funcionales
simples, segmentadas, o ambas cosas. Nosotros supondremos que disponemos de dos
multiplicadores, dos sumadores, una unidad de división y una unidad de aritmética entera (para
referencias a memoria, bifurcaciones y operaciones con enteros).
Todas las instrucciones pasan por el Marcador, donde se construye un registro con las
dependencias de datos y se comprueba si se pueden leer los operandos y arrancar la ejecución.
Si no se puede arrancar la ejecución, el Marcador se queda comprobando cada cambio en el
cauce hasta que se pueda arrancar la ejecución. Para evitar riesgos de tipo WAR y WAW, el
Marcador también controla cuándo una instrucción puede escribir su resultado.
Arquitectura de Computadores
Planificación Dinámica - 6
El método del Marcador se sirve de un pipeline de 4 etapas o pasos más unas estructuras de
datos en las que se registran las dependencias de datos que pueda haber entre los operandos de
las instrucciones que han entrado en el cauce.
Cada instrucción debe pasar por cuatro etapas (aquí no vamos a considerar el acceso a
memoria).
Las cuatro etapas que veremos a continuación en detalle son:
• Emisión
• Lectura de Operandos
• Ejecución
• Escritura del resultado
Arquitectura de Computadores
Planificación Dinámica - 7
En la etapa de Emisión se comprueba que la unidad funcional que necesita la instrucción está
libre y que ninguna otra instrucción activa tiene el mismo registro de destino. Si es así, el
Marcador emite la instrucción y actualiza su estructura interna de datos.
Al comprobar que ninguna otra instrucción activa tiene el mismo registro de destino, se garantiza
que no hay riesgos WAW.
Si hay un riesgo estructural (no está disponible la unidad funcional necesaria) o riesgo de datos
WAW, se detiene la emisión de la instrucción ¡y no se emiten más instrucciones hasta que
desaparezcan tales riesgos! Esto quiere decir que la emisión de instrucciones se realiza de
una en una y en orden.
Cuando una instrucción se detiene en esta etapa, puede dar lugar a que el buffer de
instrucciones se llene, dependiendo de si el buffer es de una única entrada (en cuyo caso la
alimentación de instrucciones se detiene inmediatamente), o se trata de una cola con capacidad
para múltiples instrucciones.
Arquitectura de Computadores
Planificación Dinámica - 8
En la Lectura de Operandos el Marcador comprueba la disponibilidad de los operandos de
entrada. Un operando está disponible si no hay ninguna instrucción activa ya emitida que vaya a
escribir en él. Si alguna instrucción activa tiene que escribir en alguno de los operandos fuente de
nuestra instrucción, se espera a que esto ocurra.
Cuando los operandos están disponibles, el Marcador le indica a la unidad funcional que lea los
operandos de los registros correspondientes y que comience la ejecución.
En esta etapa, el Marcador resuelve los riesgos RAW dinámicamente, y las instrucciones pueden
enviarse a ejecución fuera de orden.
Obsérvese que puede haber varias instrucciones (que no tengan conflictos) en cada una de las
etapas de Lectura, Ejecución y Escritura. El número de instrucciones que haya en un momento
dado dependerá del número de buses de acceso a los registros y del número de unidades
funcionales disponibles. Igualmente, el que las etapas de lectura y escritura en un mismo registro
puedan solaparse en el mismo ciclo (con dos subciclos distintos) dependerá también de la
implementación concreta. Aquí supondremos que las lecturas y escrituras se realizan en
subciclos distintos, por lo que pueden solaparse.
Arquitectura de Computadores
Planificación Dinámica - 9
La unidad funcional recibe los operandos y arranca la ejecución.
Cuando la ejecución ha finalizado, se le notifica al Marcador que el resultado está disponible.
Téngase en cuenta que esta etapa puede requerir múltiples ciclos de reloj para ciertas
operaciones en coma flotante.
Arquitectura de Computadores
Planificación Dinámica - 10
Cuando el Marcador sabe que la unidad funcional asignada a la instrucción ha finalizado la
operación, comprueba que no haya riesgos WAR y, en caso necesario, detiene la escritura del
resultado hasta que desaparezca el riesgo.
En general, la escritura del resultado de una instrucción j no se permite cuando hay una
instrucción i que la precede que no ha leído sus operandos y que uno de ellos está en el mismo
registro en el que se escribe el resultado de la instrucción j. Por ejemplo:
dadd R1,R2,R3
dmul R2,R7,R8
Cuando ya no hay riesgo WAR, el Marcador le indica a la etapa de Escritura que escriba el
resultado en el registro de destino.
Arquitectura de Computadores
Planificación Dinámica - 11
El Marcador utiliza tres estructuras de datos en las que se mantienen el estado de los objetos que
controla. Las tres estructuras son:
• Estado de las instrucciones
• Estado de las unidades funcionales
• Estado de los registros
Veamos en detalle cada una de estas estructuras.
Arquitectura de Computadores
Planificación Dinámica - 12
La tabla de Estado de las Instrucciones indica la etapa en la que se encuentra cada una de las
instrucciones activas, es decir, que han entrado en el cauce.
Arquitectura de Computadores
Planificación Dinámica - 13
La tabla de las Unidades Funcionales indica el estado en que se encuentran éstas, utilizando
para ello nueve campos:
• Busy
Indica si la unidad funcional está ocupada o no.
• Op
Es la operación a ejecutar en esa unidad funcional (suma, resta...).
• Fi
• Fj , Fk
Es el registro de destino de la operación (en el que se escribirá el resultado).
Son los registros que contienen los operandos (registros de entrada).
• Qj , Qk
Son las unidades funcionales que producirán los resultados de los registros Fj y Fk.
• Rj , Rk
Flags indicando si los registros de entrada Fj y Fk están o no están preparados. Se
ponen a NO después de leer los operandos.
Arquitectura de Computadores
Planificación Dinámica - 14
Esta tabla del Estado de los Registros de Resultado indica la unidad funcional que escribirá en
cada registro que sea destino de alguna instrucción activa.
Si una entrada no indica ninguna unidad funcional (por ejemplo, con el valor cero), es que su
valor está actualizado.
Arquitectura de Computadores
Planificación Dinámica - 15
En las siguientes páginas vamos a ver cómo se irían procesando las instrucciones del fragmento
de código que se muestra arriba, al ejecutar el programa sobre un procesador segmentado con
planificación dinámica que utiliza el Método del Marcador.
Téngase en cuenta que lo que se va a ir mostrando es cómo fluyen las instrucciones a través de
las etapas y cómo van ocupándose las unidades funcionales, no se trata de estructuras de datos
propias del Marcador.
Arquitectura de Computadores
Planificación Dinámica - 16
Para cada instrucción indicaremos los ciclos en que se ejecutará cada una de las etapas por las
que atraviesa el pipeline, y considerando que todas las instrucciones se van extrayendo de una
cola de instrucciones.
Así, la primera instrucción, la división, se emite en el 1er. ciclo y se leen sus operandos en el 2º.
Su ejecución, que dura 20 ciclos, tiene lugar de los ciclos 3 a 22. La escritura se efectúa en el
ciclo 23, pero los riesgos estructurales se comprueban en la etapa de emisión (ciclo1), y si la
unidad funcional requerida está libre, queda reservada desde el ciclo 1, liberándose cuando
finaliza la operación en ella, que, en este caso, es al término del ciclo 22.
Arquitectura de Computadores
Planificación Dinámica - 17
La segunda instrucción, la suma, se emite en el 2º ciclo.
Esta instrucción tiene una dependencia de datos de la instrucción anterior (por F1), lo que supone
un riesgo de datos de tipo RAW.
Por esto, la instrucción de suma no puede leer F1 hasta que finaliza la escritura de la instrucción
anterior (la división), por lo que queda detenida en la etapa de Lectura de Operandos hasta que
la instrucción anterior escriba su resultado en F1, lo que tiene lugar en el primer subciclo del ciclo
23, por lo que el registro de entrada F1 se lee en el segundo subciclo del ciclo 23.
A continuación, se ejecuta en la unidad funcional de la suma, que lo hace en dos ciclos (24 y 25).
Por último, escribe el resultado en F4, en el ciclo 26.
En la parte inferior de la figura vemos que la segunda instrucción tiene reservada y ocupada
unidad funcional de suma desde el ciclo 2 al 25. Esto que se muestra es una descripción, a
posteriori, de lo sucedido. No quiere decir que en el ciclo 2 se reserve la unidad funcional hasta el
25, pues, obviamente, no puede saber a priori cuándo va a quedar libre. Simplemente indica que
esa unidad funcional de suma estuvo ocupada desde el ciclo 2 hasta el 25.
Arquitectura de Computadores
Planificación Dinámica - 18
La tercera instrucción (división) se puede emitir en el ciclo 3, y leer sus operandos en el ciclo 4,
pues no tiene dependencias de datos.
A continuación se ejecuta en la otra unidad funcional de división durante 20 ciclos (5-24).
Por último, se escribe el resultado en F5 en la etapa de Escritura (ciclo 25).
Como se puede ver, esta instrucción no tiene ningún riesgo estructural ni de datos, por lo que se
puede ejecutar sin producir ninguna detención ¡y termina antes que la instrucción 2!
Arquitectura de Computadores
Planificación Dinámica - 19
En el ciclo siguiente (el 4) se puede emitir la siguiente instrucción (la suma de la instrucción 4),
pues al estar disponible la segunda unidad funcional de sumas, no hay riesgo estructural.
Sus operandos de entrada son F8 y F9, que no se utilizan en ninguna otra instrucción activa,
luego tampoco hay riesgos de datos RAW, por lo que se leen en el ciclo 5.
La instrucción ya puede pasar a ejecutarse en la unidad funcional de sumas durante dos ciclos (6
y 7).
En el ciclo 8, se podría proceder a escribir el resultado en el registro F3, pero la instrucción 2 está
detenida en su etapa de Lectura de Operandos, esperando para poder leer F1 (resultado de la
instrucción 1), por lo que tenemos un riesgo WAR, pues si en el ciclo 8, la instrucción 4 escribe en
F3, la instrucción 2 no leería el valor adecuado de F3 en el ciclo 23, que es cuando queda libre
del riesgo RAW por F1, y puede leer los operandos.
Así, la escritura del resultado de la instrucción 4 en F3, debe detenerse hasta el ciclo 24, después
de que la instrucción 2, haya leído F3 en el ciclo 23.
Aunque la instrucción 1 también lee F3, lo hace en el ciclo 2, por lo que no hay riesgo WAR con
las instrucción 4.
Arquitectura de Computadores
Planificación Dinámica - 20
Ciclo 5. Preparados para emitir la instrucción 5, una división, pero las dos unidades funcionales
de división están todavía ocupadas. Una realiza la división en los ciclos 3-22; la otra, en los ciclos
5-24.
La primera unidad funcional de división finaliza la instrucción 1 en el ciclo 22, luego la división de
la instrucción 5 debe esperar su emisión hasta el ciclo 23 para que desaparezca el riesgo
estructural.
En el ciclo siguiente (24), esta instrucción 5 debe leer sus operandos (F3 y F10). Observemos
que el registro F3 lo escribe, como resultado, la instrucción anterior, también en el ciclo 24, sin
embargo no hay ningún riesgo RAW, ya que la escritura se produce en el 1er. subciclo y la lectura
tiene lugar en el 2º subciclo.
Así, en el ciclo 25 puede iniciarse la ejecución en su unidad funcional, hasta el ciclo 44.
En el ciclo 45 se escribe el resultado en F7.
Arquitectura de Computadores
Planificación Dinámica - 21
Si en el ciclo 23 se emitió la instrucción 5, en el 24 se querría emitir la instrucción 6, pero hay un
riesgo WAW, por lo que la instrucción se detiene. Obsérvese que tanto esta instrucción como la
anterior escriben el resultado en el mismo registro, F7.
La instrucción 6 (la suma) queda detenida hasta que la instrucción 5 escribe su resultado en el
ciclo 45, por lo que la instrucción 6 se emite en el ciclo 46.
En el siguiente ciclo (47) se pueden leer sus operandos (F11 y F12), ya que no dependen de
ninguna otra instrucción.
En los ciclos 48 y 49 se ejecuta en una unidad funcional de suma, pues las dos están libres. Y en
el ciclo 50 se escribe el resultado en F7.
Como ya habíamos comentado, los riesgos WAW suelen ser fruto de una programación extraña,
pues como puede verse, la división de la instrucción 5 no tiene sentido, pues su resultado no es
transmitido a ninguna otra instrucción, por lo que podría haberse eliminado esta división sin
modificar la semántica del programa.
En la página A-70 del H&P (4th. ed.) puede verse otro ejemplo del Método del
Marcador en el que se muestra la evolución del contenido de las tres tablas de
estado.
Arquitectura de Computadores
Planificación Dinámica - 22
Robert Tomasulo inventó este esquema para el IBM 360/91, en el que se permitía una ejecución
fuera de orden con el fin de conseguir un rendimiento cercano al de una instrucción por ciclo.
Este mismo enfoque también se ha utilizado, posteriormente, con diversos procesadores.
Recordamos que aunque las instrucciones también se van a ejecutar en varias etapas o pasos,
no se va a seguir el mismo modelo del cauce segmentado convencional. ¡Es otro enfoque
distinto!
Arquitectura de Computadores
Planificación Dinámica - 23
Al contrario del Método del Marcador, en el que el control de la ejecución y eliminación de riesgos
está centralizada en el módulo Marcador, aquí estas tareas están distribuidas entre sus distintos
componentes.
Las instrucciones se emiten en orden desde la unidad de alimentación/decodificación a unas
Estaciones de Reserva (una o varias por cada unidad funcional). Aquí, y para evitar los riesgos
RAW, las instrucciones solo se envían a ejecución cuando están disponibles sus operandos. Los
riesgos WAR y WAW, que surgen de las dependencias de nombres, se eliminan mediante el
renombrado de registros.
Cuando las instrucciones finalizan la ejecución en su unidad funcional, pasan a la etapa de
escritura de resultados en los registros. La escritura se realiza en orden, es decir, en el orden de
la secuencia original de instrucciones, utilizando para ello un buffer de almacenamiento/
reordenamiento.
Para explicar el algoritmo, trasladaremos los conceptos al entorno de MIPS, centrándonos en las
unidades de coma flotante y de carga/almacenamiento en memoria.
En las páginas siguientes veremos la estructura básica y, seguidamente, las tablas de control
equivalentes a las descritas en el Método del Marcador.
Arquitectura de Computadores
Planificación Dinámica - 24
Aquí se muestra la estructura básica de las unidades de coma flotante y de acceso a memoria de
un procesador de tipo MIPS que utiliza el Algoritmo de Tomasulo. En la artimética de coma
flotante, se dispone de una unidad funcional para sumas/restas, y otra para multiplicaciones y
divisiones.
Las instrucciones se envían desde la unidad de Alimentación de Instrucciones a una cola de
instrucciones desde la que se van emitiendo en orden FIFO.
Las instrucciones pueden ser de dos tipos: de aritmética de coma flotante o de carga/
almacenamiento. Así, la cola de instrucciones alimenta tanto la Unidad de Direcciones como las
unidades funcionales de coma flotante.
Se dispone de 4 registros de coma flotante a disposición del programador. Las instrucciones de
coma flotante requieren hasta dos operandos de entrada, por lo que el banco de registros
alimenta dos operandos a los sumadores y también dos operandos a los multiplicadores.
Arquitectura de Computadores
Planificación Dinámica - 25
Con el Algoritmo de Tomasulo, las instrucciones no se dirigen directamente de la cola a la unidad funcional
correspondiente, sino que se llevan a las estaciones de reserva que, a su vez, alimentan a las unidades
funcionales.
Las estaciones de reserva disponen de un buffer para varias instrucciones, donde cada entrada del buffer
tiene 3 campos: uno para el código de operación, y dos más para los operandos de entrada.
La idea básica es que una estación de reserva guarda un operando para una instrucción tan pronto como
está disponible, por lo que en su unidad funcional correspondiente no es necesario alimentar los
operandos desde los registros. Además, cada instrucción pendiente en la estación de reserva indica, a su
vez, la estación de reserva que proporcionará sus datos de entrada pendientes.
Cuando sucesivas escrituras a un registro se producen fuera de orden, solamente se realiza realmente la
última de su orden lógico, evitando así los riesgos WAW.
A medida que se van emitiendo instrucciones a las estaciones de reserva, los especificadores de registro
para los operandos pendientes se renombran por los nombres de las estaciones de reserva que
proporcionan tales operandos (renombrado de registros), evitando así los riesgos WAR.
Como se puede observar, la detección de riesgos y el control de la ejecución están distribuidos, pues la
información mantenida en las estaciones de reserva de cada unidad funcional determina cuándo una
instrucción puede comenzar su ejecución. También se debe tener en cuenta que los resultados de las
operaciones se pasan directamente, por el CDB, a las unidades funcionales (a través de su estación de
reserva), en lugar de hacerlo a través de los registros (equivalente al data forwarding).
Por último, obsérvese que desde la cola de instrucciones, éstas se emiten en orden a las estaciones de
reserva, pero una vez aquí, las instrucciones pueden pasar a ejecutarse en la unidad funcional
correspondiente fuera de orden.
Arquitectura de Computadores
Planificación Dinámica - 26
El equivalente de las estaciones de reserva para las instrucciones de acceso a memoria (carga/
almacenamiento) son los Buffers de Carga y los Buffers de Almacenamiento.
Estos buffers mantienen las direcciones de los datos que vienen o van a la memoria y se comportan casi
exactamente igual que las estaciones de reserva.
Cada entrada de los buffers de almacenamiento tiene dos campos: la dirección de memoria y el dato a
almacenar.
Los buffers de carga solamente tienen un campo: la dirección de memoria de donde se debe traer un dato.
(El registro de carga figura en una estructura, que veremos más adelante, con información de los registros
que esperan por un dato). Cuando la memoria entrega el dato, éste viaja por el CDB bien hasta un registro
principal o bien hasta una estación de reserva que esté esperando por él.
La dirección efectiva se calcula mediante la suma del contenido de un registro base más un
desplazamiento 16 bits, lo que proporciona un rango de direcciones de ±215 respecto al registro base.
Los buffers de carga tienen tres funciones:
1.  Retener los componentes de la dirección efectiva de memoria hasta que se ha calculado.
2.  Llevar la cuenta de las cargas que están esperando un dato de la memoria.
3.  Mantener el resultado de la carga (el dato de memoria) hasta que el CDB está disponible.
De igual manera, los buffers de almacenamiento también tienen 3 funciones:
1.  Retener los componentes de la dirección efectiva de memoria hasta que ésta se calcula.
2.  Mantener las direcciones de destino de las instrucciones de almacenamiento que están esperando a
que el valor se almacene en memoria.
3.  Retener la dirección y el valor a almacenar hasta que la unidad de memoria está disponible.
Arquitectura de Computadores
Planificación Dinámica - 27
Todos los resultados de las unidades funcionales y de las instrucciones de carga van a parar al
Common Data Bus (CDB), que lleva los valores a varios destinos:
•  Por una parte, lleva el resultado de las unidades funcionales al banco de registros.
•  También lo lleva a la entrada de las estaciones de reserva que están esperando a que se
produzca un operando de entrada.
•  Por último, el resultado de una operación también puede ir a parar a los buffers de
almacenamiento, si es que alguna instrucción de almacenamiento está esperando para
almacenar un valor tan pronto como se produzca.
Obsérvese que esta forma de llevar los resultados directamente a las unidades funcionales (a sus
estaciones de reserva) es un sistema equivalente al data forwarding visto anteriormente para
abreviar la entrega de los datos a las etapas o unidades funcionales que esperan por ellos.
Arquitectura de Computadores
Planificación Dinámica - 28
En esta arquitectura las instrucciones se ejecutan en tres pasos o etapas, aunque cada una de
ellas puede requerir un número arbitrario de ciclos de reloj.
Veámoslas en detalle.
Arquitectura de Computadores
Planificación Dinámica - 29
En esta etapa se comienza por extraer una instrucción de la cola de instrucciones, lo cual se
hace en orden FIFO, para asegurar el flujo de datos correcto.
Si hay una estación de reserva libre (de las que le corresponden al tipo de operación) o buffer de
carga/almacenamiento, se envía la instrucción, junto con los valores de los operandos si se
encuentran disponibles en sus registros. (Obsérvese que al final de esta etapa la instrucción ya
queda en la estación de reserva).
Si no hay una estación de reserva libre, se produce un riesgo estructural, y se detiene la
instrucción hasta que queda libre una estación o buffer de carga/almacenamiento.
Si los operandos actualizados no se encuentran en los registros, se indica en una estructura de
datos cuáles son las unidades funcionales que producirán los operandos.
Al poner los operandos en las estaciones de reserva, y ya no depender de los valores que
puedan tomar los registros originales donde estaban los operandos (equivalente al “renombrado
de registros”) se eliminan los riesgos WAR y WAW.
Arquitectura de Computadores
Planificación Dinámica - 30
SI algún operando no está disponible, se monitoriza el CDB mientras se espera a que se calcule.
Cuando un operando está disponible se dirige a la estación de reserva que espera por él. Cuando
todos los operandos de la instrucción están disponibles, la operación se ejecuta en la unidad
funcional correspondiente.
Retrasando la ejecución hasta que los operandos están disponibles, se evitan los riesgos RAW.
Nótese que varias instrucciones podrían quedar preparadas (todos sus operandos disponibles)
para la misma unidad funcional en el mismo ciclo de reloj. Si las instrucciones son de coma
flotante y hay varias unidades funcionales independientes libres, no hay ningún problema; pero si
solamente hay una unidad funcional disponible, ésta tendría que elegir una instrucción de manera
arbitraria.
Sin embargo, si la operación es de carga/almacenamiento, se debe ejecutar en dos pasos:
1.  La dirección efectiva se calcula en cuanto el registro base está disponible. Una vez calculada,
se pone en el buffer de carga/almacenamiento.
2.  Las cargas se ejecutan tan pronto como la unidad de memoria está disponible. Las
instrucciones de almacenamientos deben esperar en el Buffer de Almacenamiento hasta que el
valor a ser almacenado en memoria también está disponible.
Las cargas y los almacenamientos se mantienen en el orden del programa hasta el cálculo de la
dirección efectiva, lo que ayuda a evitar riesgos con la memoria.
Arquitectura de Computadores
Planificación Dinámica - 31
Cuando el resultado de una instrucción ya está disponible, se escribe en el CDB, y de ahí, a los
registros generales y a las estaciones de reserva o buffers de almacenamiento que estén
esperando por dicho resultado.
Recordemos que en el caso de las instrucciones de almacenamiento, éstas quedan retenidas en
los buffers de almacenamiento hasta que tanto el valor a almacenar como la dirección efectiva
están disponibles. Cuando es así, el resultado (valor a almacenar) se escribe en cuanto la unidad
de memoria está libre.
Arquitectura de Computadores
Planificación Dinámica - 32
Las estructuras de datos que detectan y eliminan los riesgos están asociadas a las estaciones de
reserva, al banco de registros y a los buffers de carga y almacenamiento.
La información que se mantiene en estas estructuras de datos son esencialmente etiquetas o
nombres de un conjunto virtual de registros utilizado en el “renombrado”. En realidad, estas
etiquetas describen la estación de reserva en la que está la instrucción que producirá un
resultado necesitado como un operando de entrada en otra instrucción.
Una vez que una instrucción ha sido emitida y está esperando en una estación de reserva por un
operando u operandos fuente, a estos operandos fuente se les referencia por el número de la
estación de reserva en la que está la instrucción que producirá dichos operandos. Si el número
de la estación de reserva es cero, significa que el operando está disponible en el registro general
indicado en la instrucción.
Cuando una instrucción está en su estación de reserva esperando a que esté disponible un
operando de entrada que es el resultado que produce una unidad funcional o buffer de carga,
dicho resultado se escribirá (además de su registro general de destino) directamente en la
estación de reserva de la instrucción que espera por él, y no se toma del registro general que se
indicaba como operando fuente. Esto se comporta como un “mecanismo de renombramiento”,
por lo que se evitan los riesgos WAW y WAR.
Arquitectura de Computadores
Planificación Dinámica - 33
(Supondremos que en cada estación de reserva solamente puede haber una instrucción, es decir,
que no es un buffer de instrucciones).
Cada estación de reserva tiene una entrada en esta tabla, en la que hay los siguientes campos
por cada entrada:
Busy
Indica que esta estación de reserva y su correspondiente unidad funcional están
ocupadas.
Op
Vj, Vk
Es la operación a ejecutar sobre los operandos S1 y S2.
Son los valores de los dos operandos. En las operaciones de carga y almacenamiento,
Vj contiene el registro base, y Vk, el desplazamiento.
Qj, Qk
Son las estaciones de reserva que producirán los respectivos operandos de entrada. El
valor cero indica que el operando está disponible en Vj o Vk, o no se utiliza.
A
Se utiliza en las instrucciones de carga y almacenamiento. Contiene el resultado del
cálculo de la dirección efectiva.
Dir. efectiva = [Reg base] + desplazamiento
Arquitectura de Computadores
Planificación Dinámica - 34
La tabla del banco de registros tiene un único campo por cada registro:
Qi
Es el número de la estación de reserva o buffer de carga donde está la instrucción que
generará el valor que deberá almacenarse en ese registro. Si el valor de este campo es
cero, indica que no hay ninguna instrucción activa que esté calculando un resultado
para guardarse en ese registro, lo que significa que el valor del operando, si lo necesita
alguna instrucción, ya está en el propio registro.
Arquitectura de Computadores
Planificación Dinámica - 35
Esta tabla contiene una entrada por cada buffer de carga, y cada entrada tiene dos campos:
Busy
Indica si el buffer está libre u ocupado.
A
Contiene el resultado del cálculo de la dirección efectiva de acceso a memoria.
Arquitectura de Computadores
Planificación Dinámica - 36
Esta tabla contiene una entrada por cada buffer de almacenamiento, y cada entrada tiene los
siguientes campos:
Busy
Indica si el buffer está libre u ocupado.
A
Contiene el resultado del cálculo de la dirección efectiva de escritura en memoria.
Vi
Qi
Es el valor a almacenar
Es la estación de reserva que generará el operando Vi. Si es cero, indica que el valor ya
está en Vi.
Arquitectura de Computadores
Planificación Dinámica - 37
Ahora vamos a ver un ejemplo de cómo se ejecutaría el fragmento de un programa en un
procesador segmentado con planificación dinámica utilizando el Algoritmo de Tomasulo.
Al igual que hicimos con el Método del Marcador (Scorebord), iremos viendo durante qué ciclos
tiene lugar cada una de las etapas por los que debe atravesar cada una de las instrucciones del
fragmento de programa arriba mostrado.
Arquitectura de Computadores
Planificación Dinámica - 38
La primera instrucción del programa se emite en el ciclo 1 a la Estación de Reserva 1.
Ya que no hay ningún tipo de riesgos, se envía a la unidad funcional de sumas/restas, donde se
ejecuta durante los ciclos 2 y 3.
Realizada la operación, se escribe el resultado en el registro F1 durante el ciclo 4.
Arquitectura de Computadores
Planificación Dinámica - 39
La instrucción 2 se emite en el segundo ciclo a la Estación de Reserva 2 de la unidad funcional
de sumas/restas.
Ahora se producen 2 tipos de riesgo: riesgo estructural (la unidad funcional no está disponible) y
riesgo de datos de tipo RAW, pues hay una dependencia de datos entre el registro de resultado
de la instrucción 1 (F1) y un operando de entrada de la instrucción 2. Por esto, la instrucción 2
permanece en la estación de reserva (ciclos 3 y 4) hasta que desaparecen los riesgos
mencionados.
Al final del ciclo 3, termina la ejecución de la instrucción 1 en la unidad funcional, y en el siguiente
ciclo se escribe el resultado en F1, desapareciendo el riesgo de datos, por lo que en el ciclo 5, la
instrucción 2 puede pasar a ejecución, durante los ciclos 5 y 6.
En el siguiente ciclo, el 7, se escribe el resultado de la suma en el registro F4.
Arquitectura de Computadores
Planificación Dinámica - 40
La tercera instrucción, una división, se emite en el ciclo 3 a la Estación de Reserva 3, de la
unidad funcional de multiplicación y división.
Ya que no hay dependencias de datos y la unidad funcional está libre, pasa a ejecución en el
ciclo 4, donde permanece hasta el ciclo 23, inclusive.
En el siguiente ciclo, el 24, se escribe el resultado de la división en el registro F5.
Arquitectura de Computadores
Planificación Dinámica - 41
La instrucción 4, una suma, se emite en el ciclo 4 hacia la Estación de Reserva 1, que es la que
está libre en la unidad funcional que le corresponde.
Ahora nos encontramos con un riesgo estructural. En el ciclo 5 podría enviarse a ejecución, pero
la unidad funcional de sumas/restas está ocupada con la instrucción 2, que precisamente va a
ocuparla durante los ciclos 5 y 6, por lo que se debe demorar la ejecución de la instrucción 4
hasta el ciclo 7.
Esta suma de la instrucción 4 se realiza, por tanto, durante los ciclos 7 y 8.
En el siguiente ciclo, el 9, se escribe el resultado de la suma en F3.
Arquitectura de Computadores
Planificación Dinámica - 42
En el ciclo 5 se emite la instrucción 5 (una división) hacia la Estación de Reserva 4, perteneciente
a la unidad funcional de la multiplicación/división.
Ahora nos encontramos con un doble riesgo: estructural y de datos RAW. Éste último se debe a
la dependencia del operando de entrada (F3) de la instrucción 5, pues en dicho registro es donde
se escribe el resultado de la instrucción de suma inmediatamente anterior.
En el ciclo 9, la instrucción 4 escribe su resultado en F3, con lo que desaparece el riesgo de
datos, no obstante, también hay un riesgo estructural pues la unidad funcional está ocupada por
la instrucción 3 (durante los ciclos 4 a 23). Así, nuestra instrucción 5 debe esperar en la estación
de reserva a que la instrucción 3 abandone la unidad funcional al término el ciclo 23.
Ahora la instrucción 5 ya puede pasar a ejecución en la unidad funcional de mult/división en el
ciclo 24, en la que permanece durante los 20 ciclos de reloj que requiere la operación (hasta el
ciclo 43).
Por último, en el ciclo 44 se escribe le resultado de la división de la instrucción 5 en el registro F7.
Arquitectura de Computadores
Planificación Dinámica - 43
En el ciclo 6 se emite la instrucción 6 hacia la Estación de Reserva 2, pues la Estación 1 está
ocupada con la suma de la instrucción 4, que está detenida en la Estación 1 por un riesgo
estructural.
Esta instrucción 6 también tiene un riesgo estructural, pues la unidad funcional de sumas/restas
está ocupada con la suma de la instrucción 4. Por esto, la instrucción 6 debe permanecer en la
estación de reserva hasta que finaliza la ejecución de la instrucción 4, lo que tiene lugar al
término del ciclo 8.
En el ciclo 9, la instrucción 6 puede pasar a ejecutarse durante los ciclos 9 y 10.
En el ciclo 11 escribe el resultado de la suma en F7.
Arquitectura de Computadores
Planificación Dinámica - 44
¡Pero la instrucción 5 también debe escribir su resultado en F7, y puesto que su ejecución
terminará en el ciclo 43, lo escribirá en el ciclo 44, después de la escritura que hace la instrucción
6 en el mismo registro!
¡Luego parece que estamos en presencia de un riesgo WAW, pues el valor final de F7 no será el
escrito por la instrucción 6!
En realidad no hay riesgo WAW, puesto que según el Algoritmo de Tomasulo, cuando sucesivas
escrituras a un registro se producen fuera de orden, solamente se realiza realmente la última en
su orden lógico, evitando así los riesgos WAW.
Arquitectura de Computadores
Planificación Dinámica - 45
Vamos ahora con la instrucción 7, que se emite en el ciclo 7 hacia la Estación de Reserva 1. (La
ER 2 está ocupada con la instrucción 6 durante los ciclos 6 a 8).
Nos encontramos de nuevo con un riesgo RAW, pues esta instrucción 7 tiene un operando de
entrada (F7) que es el resultado de la instrucción anterior.
La instrucción 6 escribe su resultado en F7 en el ciclo 11, por lo que la ejecución de la instrucción
7 queda detenida en la estación de reserva hasta el ciclo 12, ejecutándose durante los ciclos 12 y
13.
El resultado de la instrucción 7 se escribe en F13 en el ciclo 14.
Arquitectura de Computadores
Planificación Dinámica - 46
Llegamos a la última instrucción de nuestro programa, la resta de la instrucción 8, que no se
puede emitir en el ciclo 8 por un riesgo estructural, ya que están ocupadas las dos estaciones de
reserva de la unidad funcional de sumas/restas.
En el ciclo 8, que es cuando se querría emitir la instrucción 8, la ER 2 está ocupada con la suma
de la instrucción 6 (ciclos 6 a 8, inclusive). La ER 1 está ocupada por la resta de la instrucción 7,
que se encuentra detenida en la estación de reserva hasta el ciclo 11, inclusive.
Al término del ciclo 8, la instrucción 6 pasa a ejecución, por lo que en el ciclo 9, la instrucción 8 se
emite hacia la ER 2.
No obstante, la unidad funcional de sumas/restas no queda libre hasta que la instrucción 6
finaliza su ejecución al término del ciclo 10.
Así, la instrucción 8 puede pasar a ejecución en el ciclo 11, se ejecuta durante los ciclos 11 y 12,
y escribe su resultado en el ciclo 13.
Pero ¡algo raro pasa con la ejecución de las instrucciones 7 y 8! Veámoslo a continuación.
Arquitectura de Computadores
Planificación Dinámica - 47
Acabamos de ver que la instrucción 8 ¡se ha adelantado a la instrucción 7! pues la 8 pasa a
ejecutarse en el ciclo 11 y, según estaba previsto, la instrucción 7 debería hacerlo en el ciclo 12.
En realidad, lo que sucederá es que la instrucción 8 pasa a ocupar la unidad funcional de sumas/
restas en el ciclo 11. La instrucción 7, que estaba detenida esperando a que se resolviera un
riesgo RAW con la instrucción 6 (por F7), se libera del riesgo en el ciclo 11, por lo que podría
comenzar su ejecución en el ciclo 12, pero se encuentra que la unidad funcional acaba de ser
ocupada por la instrucción 8 en el ciclo 11, donde se ejecuta hasta el ciclo 12.
Como vemos, la instrucción 7 ni pudo pasar a ejecución en el ciclo 12, ni pudo escribir su
resultado en el ciclo 14.
Arquitectura de Computadores
Planificación Dinámica - 48
Como la instrucción 8 se adelantó a la 7, ésta última pasó realmente a ejecución en el ciclo 13, se
ejecutó durante los ciclos 13 y 14, y, por último, escribió su resultado en el ciclo 15.
Por esto aparecen tachadas las ocupaciones de la ER 1 (7-11) y de la unidad funcional de
sumas/restas (12-13) que se habían previsto para la instrucción 7, y en su lugar, y al final, se han
incluido las ocupaciones reales que se hicieron con esta instrucción 7; esto es, la ER 1 la ocupó
realmente la instrucción 7 durante los ciclos 7 a 12, y la unidad funcional de sumas/restas,
durante los ciclos 13 y 14.
En el apartado 2.5 de H&P (4th. ed.) puede verse otro ejemplo del Algoritmo de
Tomasulo en el que se muestra la evolución del contenido de sus 4 tablas de estado.
En las siguientes direcciones se dispone de simuladores del Algoritmo de Tomasulo,
on line, que pueden ayudar a comprender su funcionamiento:
- http://www.ecs.umass.edu/ece/koren/architecture/Tomasulo/AppletTomasulo.html
- http://www.ecs.umass.edu/ece/koren/architecture/Tomasulo1/tomasulo.htm
Arquitectura de Computadores
Planificación Dinámica - 49

Documentos relacionados