Puertos y Registros en Procesadores Superescalares
Puertos y Registros en Procesadores Superescalares
1 (Ejercicios de clase)
Suponiendo que en cada ciclo sólo se puede hacer una lectura/escritura de/en los registros, indique
el número mínimo de puertos de lectura y escritura que harían falta en el banco de registros de un
procesador superescalar capaz de ejecutar hasta dos instrucciones por ciclo.
Solución.
Si se pueden emitir 2 instrucciones por ciclo, y como cada instrucción tiene dos operandos, se
necesitarían cuatro lecturas. Es decir, haría falta cuatro puertos de lectura en el banco de registros o
en el búfer de reordenamiento
Si se pueden retirar 2 instrucciones por ciclo, como cada instrucción podría tener que escribir un
resultado, se necesitarían dos puertos de escritura.
Por tanto haría falta que los bancos de registros tuvieran 6 puertos como mínimo (cuatro de lectura
y dos de escritura)
2 (Ejercicios de clase)
Indique el número de bits de las líneas de las estaciones de reserva en un procesador superescalar en
el que cada unidad funcional tiene una estación de reserva propia, y que implementa una
arquitectura con 64 instrucciones de dos operandos, tamaño de palabra de 32 bits, banco de 32
registros, y búfer de reordenamiento de 32 registros suponiendo:
¿Y si cada estación de reserva estuviese compartida por cuatro unidades funcionales que ejecutan
operaciónes de distinto código de operación?.
Solución.
En la tabla, se muestran las respuestas para la cuestión (a) y (b).
1 lw r1,0x1ac
2 lw r2,0xc1f
3 add r3,r0,r0
4 mul r4,r2,r1
5 add r3,r3,r4
6 add r5,r0,0x1ac
7 add r6,r0,0xc1f
8 sub r5,r5,#4
9 sub r6,r6,#4
10 sw (r5),r3
11 sw (r6),r4
y suponiendo que se pueden captar cuatro instrucciones por ciclo y emitir cuatro instrucciones por
ciclo, indique el orden en que se emitirán las instrucciones para cada uno de los siguientes casos:
Nota: considere que hay una unidad funcional para la carga (2 ciclos), otra para el almacenamiento
(1 ciclo), tres para la suma/resta(1 ciclo), y una para la multiplicación (6 ciclos).
Solución.
En las tablas se muestra la evolución de las instrucciones en cada etapa y situación.
Ordenada
En el caso de la emisión alineada, hasta que no se han emitido todas las instrucciones que entraron
en la ventana al decodificarse no se introducen nuevas instrucciones en la ventana que puedan ser
emitidas. Esta situación se puede observar en la columna ID, donde se indica el ciclo en el que las
instrucciones se terminarían de decodificar y pasarían a la ventana de instrucciones (cuando ésta se
ha quedado vacía).
P1.b Ventana Centralizada. Emisión alineada y desordenada
Emisión Desordenada
4 (Ejercicios de clase)
En un procesador superescalar con renombrado de registros en el que se utilizan registros
específicos para implementar el renombrado, y acceso indexado a esos registros a través de una
tabla de mapeo. Indique como evolucionarían los registros de renombrado al ejecutar las
instrucciones:
1 mul r2,r0,r1
2 add r3,r1,r2
3 sub r2,r0,r1
Solución.
En las figuras siguientes se muestra como evolucionarían los búferes de renombrado.
Reg Entrada Índice Valor Válido
Válida Buffer
0 1 2
1 1 4 10 1
2 1 6
3 15 1
mul r2,r0,r1
Se pueden leer r0 y r1 que se han asignado a los bufferes 2 y 4.
El valor de r2 se asigna al registro 6 y se indica como no válido
(hasta que no esté el resultado)
add r3,r1,r2
Como r2 no está disponible, se indica que el operando de add
correspondiente a r2 se toma del registro 6.
A r3 se le asigna el registro 5, que se indica como no válido
hasta que no se genere el resultado
sub r2,r0,r1 0
5 (Ejercicios de clase)
Suponga que las cuatro instrucciones siguientes
se introducen una tras otra (en los ciclos indicados entre paréntesis) en un búfer de renombrado con
acceso asociativo. Indique (a) cómo evoluciona el búfer de renombrado (registros del búfer de
renombrado que se van asignando, los registros de donde tomarían los datos y donde escribirían los
resultados las instrucciones, etc.) para esas instrucciones; (b) en qué momento empieza y termina la
ejecución de las instrucciones; y (c) cuáles son los valores que quedan en los registros de la
arquitectura al terminar, si inicialmente f1=2.0 y f2=3.0.
(NOTA: la multiplicación tarda 6 ciclos, y la suma y la resta 2 ciclos, y hay suficientes unidades
funcionales como para que no afecten los riesgos estructurales)
Solución.
(a) A continuación se muestra la evolución del búfer de renombrado con acceso asociativo
(Ciclo 3)
# Entrada Registro Valor Valor Válido Bit de
Valida Último
0 1 f1 2.0 1 1
1 1 f2 3.0 1 1
2 1 f3 0 1
Se inicia la multiplicación en el ciclo 4, puesto que tiene los valores disponibles. Terminará en el
ciclo 9 (dura 6 ciclos).
En el búfer de renombrado se observa que el registro 2 asignado a f3 no tiene un valor válido y que
los tres bits de último de los registros asignados están a 1 porque son las últimas asignaciones
realizadas para f1, f2, y f3.
(Ciclo 4)
# Entrada Registro Valor Valor Válido Bit de
Valida Último
0 1 f1 2.0 1 1
1 1 f2 3.0 1 0
2 1 f3 0 1
3 1 f2 0 1
Como se hace una asignación nueva a f2, el bit de último del registro r1 se hace 0, indicando que si
una instrucción posterior necesitase tomar el valor de f2 lo debe tomar del registro 3. El bit de Valor
Válido del nuevo registro asignado debe estar a 0. La operación de suma de addd f2,f3,f1 no puede
ejecutarse antes del ciclo 10 (cuando termina la multiplicación), y tomará el valor de f3 del registro
2 del búfer de renombrado. Termina en el ciclo 11, y el resultado se escribirá en el registro 3 del
búfer.
(Ciclo 5)
# Entrada Registro Valor Valor Válido Bit de
Valida Último
0 1 f1 2.0 1 1
1 1 f2 3.0 1 0
2 1 f3 0 0
3 1 f2 0 1
4 1 f3 0 1
5 1 f5 0 1
Se asigna el registro 4 a f3, por lo que el bit de último del registro 2 del búfer se pone a 0. También
se asigna el registro 5 del búfer a f5.
La instrucción subd f3,f3,f1 tomará el valor de f1 del registro1 del búfer (su valor es 2.0) y tomará
el valor de f3 que necesita del registro 2 del búfer. Esta operación empezará a ejecutarse en el ciclo
10 y terminará en el ciclo 11 escribiendo el resultado en el registro 4.
La instrucción addd f5,f1,f2 tomará el valor de f1 del registro1 del búfer (su valor es 2.0) y tomará
el valor de f2 que necesita del registro 3 del búfer. Esta operación empezará a ejecutarse en el ciclo
12 y terminará en el ciclo 13.
(b) Las instrucciones empiezan a ejecutarse según se indica en la siguiente tabla, donde se indican
también los resultados que obtienen.
(c) A partir de los resultados que se muestran en la última columna de la tabla anterior se tiene que
al final, los valores de los registros son:
se introducen una tras otra (en los ciclos indicados entre paréntesis) en un búfer de renombrado con
acceso asociativo. Indique (a) cómo evoluciona el búfer de renombrado para esas instrucciones
(registros del búfer de renombrado que se van asignando, los registros de donde tomarían los datos
y donde escribirían los resultados las instrucciones, etc.); (b) en qué momento empieza y termina la
ejecución de las instrucciones suponiendo que en el procesador hay una unidad de multiplicación y
otra de suma/resta, y se utiliza emisión desordenada; y (c) indique el número más pequeño de
unidades de multiplicación y de suma/resta que habría que añadir para minimizar el tiempo de
ejecución de las instrucciones.
Solución.
Suponemos que inicialmente el búfer de renombrado está vacío y que el primer renombrado se
produce en el ciclo 3, tal y como dice el enunciado. También suponemos que todos los valores con
los que se va a operar están preparados en el banco de registros del computador, de forma que sólo
tendremos en cuanta las dependencias entre las 5 instrucciones del problema.
En el ciclo 3 se introduciría en el búfer de renombrado la instrucción (1), que tomaría sus operandos
del banco de registros y podría pasar a ejecutarse. El búfer de renombrado quedaría así:
En el ciclo 4 se introducirían en el búfer de renombrado las instrucciones (2) y (3). Como ambas
operan con los mismos operandos, las dos tomarían el operando f1 del banco de registros y
marcarían al segundo operando en la estación de reserva como pendiente y esperando a que se
calcule y se almacene en la entrada 1 del búfer de renombrado. Como la instrucción (3) vuelve a
escribir en f3, se marca como último el renombrado de la entrada 3 del búfer de renombrado. El
búfer de renombrado quedaría así:
En el ciclo 5 se introduciría en el búfer de renombrado la instrucción (4), que tiene sus dos
operandos disponibles en el banco de registros, con lo que se renombraría al registro f5 en la
siguiente entrada del búfer de renombrado y podría pasar a ejecutarse. El búfer de renombrado
quedaría así:
Las instrucciones escribirían sus resultados en los campos Valor de sus entradas del búfer de
renombrado. En el momento de escribir el valor, se cambiaría el campo ok de 0 a 1 y cualquier
instrucción que estuviera esperando el dato escrito podría pasar a ejecutarse. Teniendo en cuanta las
dependencias de datos, las latencias de las unidades de ejecución, y que solamente hay un sumador
y un multiplicador, las escrituras se realizarían en la etapa FIN del cauce, en el siguiente orden:
3 4 5 6 7 8 9 10 11 12 13 14 15
(1) ID/ISS EX FIN
(2) ID/ISS EX FIN
(3) ID/ISS EX FIN
(4) ID/ISS EX FIN
(5) ID/ISS EX FIN
7 (Ejercicios de clase)
Suponga que las cuatro instrucciones siguientes
se han decodificado en los ciclos indicados entre paréntesis, introduciéndose en una estación de
reserva común para todas las unidades funcionales de coma flotante. Teniendo en cuenta que el
procesador superescalar dispone de un ROB para implementar la finalización ordenada, y que la
emisión es desordenada y no alineada. Indique (a) cómo evolucionaría el ROB para esas
instrucciones; (b) en qué momento empieza y termina la ejecución de las instrucciones; y (c) cuáles
son los valores que quedan en los registros de la arquitectura al terminar, si inicialmente f1=3.0 y
f2=2.0.
(NOTA: la multiplicación tarda 4 ciclos, y la suma y la resta 2 ciclos; hay tantas unidades
funcionales como sea necesario para que no haya riesgos estructurales; y se pueden enviar, retirar,
etc. dos instrucciones por ciclo como máximo)
Solución.
Para resolver el problema se parte de la tabla siguiente, donde se indican los ciclos en los que (1) las
instrucciones se terminan de decodificar (ID) y han pasado a la estación de reserva, (2) comienza y
termina la ejecución de la operación correspondiente a la instrucción (EX), (3) el resultado de
operación se ha almacenado en el ROB, y (4) el momento en que después de retirar la instrucción
del ROB, los resultados se han almacenado en el banco de registros de la arquitectura:
Instrucción ID EX ROB WB
1 multd f3,f1,f2 2 3-6 7 8
2 addd f2,f3,f1 2 7-8 9 10
3 subd f3,f3,f1 3 7-8 9 10
4 addd f4,f1,f2 3 9 - 10 11 12
La tabla anterior constituye la respuesta al apartado (b) del problema. Las instrucciones segunda y
tercera deben esperar que termine la ejecución de la primera, y la cuarta instrucción espera que
termine la segunda. A partir de esta tabla también se puede determinar la evolución del ROB.
(b) El ROB empieza a llenarse al final del ciclo 2, después de haberse decodificado las dos primeras
instrucciones.
(Final de 2)
# Instrucción Reg.Dest. Valor OK Unidad Flush
0 1 f3 - 0 - 0
1 2 f2 - 0 - 0
Al finalizar el tercer ciclo se introducen en el ROB las dos instrucciones restantes, y también habrá
empezado la multiplicación.
(Final de 3)
# Instrucción Reg.Dest. Valor OK Unidad Flush
0 1 f3 - 0 mult 0
1 2 f2 - 0 - 0
2 3 f3 - 0 - 0
3 4 f4 - 0 - 0
Hasta el final del ciclo 7 no ocurre nada en el ROB (en relación con las instrucciones que indica el
problema). Como se muestra a continuación, se habrá terminado la multiplcación, y el resultado
estará almacenado en el campo de valor del registro 0 del búfer, el bit de OK estará a 1, y también
se ha iniciado la ejecución de las instrucciones 2, y 3. En el siguiente ciclo (ciclo 8) se retirará la
instrucción 1 del ROB.
(Final de 7)
# Instrucción Reg.Dest. Valor OK Unidad Flush
0 1 f3 6.0 1 Mult 0
1 2 f2 - 0 Add 0
2 3 f3 - 0 Sub 0
3 4 f4 - 0 - 0
Al final del ciclo 9 la instrucción 1 ya no está en el ROB, habrá terminado la ejecución de las
instrucciones 2 y 3 y sus resultados estarán almacenador en los registros 2 y 3 el ROB, y habrá
empezado la ejecución de la instrucción 4.
(Final de 9)
# Instrucción Reg.Dest. Valor OK Unidad Flush
1 2 f2 9.0 1 Add 0
2 3 f3 3.0 1 Sub 0
3 4 f4 - 0 Add 0
Al final del ciclo siguiente se habrán retirado las instrucciones 2 y 3 y se escribirán sus resultados
en los registros f2 y f3.
(Final de 10)
# Instrucción Reg.Dest. Valor OK Unidad Flush
3 4 f4 - 0 Add 0
(Final de 11)
# Instrucción Reg.Dest. Valor OK Unidad Flush
3 4 f4 12.0 1 Add 0
(NOTA: La multiplicación tarda 6 ciclos; la suma y la resta 2 ciclos; se retiran dos instrucciones por
ciclo como máximo; y el envío es desordenado y no alineado pudiéndose enviar dos instrucciones
por ciclo como máximo)
El procesador es capaz de emitir dos instrucciones por ciclo, las estaciones de reserva pueden
realizar envíos no alineados y desordenados a las unidades de ejecución, y se pueden retirar hasta
dos instrucciones por ciclo.
y los registros f1 y f2 tienen inicialmente los valores 10 y 5, ¿qué valores y en qué ciclos se
escribirá en los registros de la arquitectura?
Solución.
El esquema del cauce del procesador propuesto en el problema es el siguiente:
ADD/
DISP SUB 1
RS1
ADD/
ISS DISP SUB 2
COLA F
CACHE I INSTR. I
F N
ISS DISP MUL
ISS RS2
DISP DIV
ROB
RET
REGS
En el enunciado se nos dice que las instrucciones ya están en la cola de instrucciones y que e
procesador es capaz de emitir y retirar dos instrucciones por ciclo, así que asumiendo que nos
encontramos en el ciclo 1 vamos a ir emitiendo las instrucciones tal y como se muestra en la
siguiente tabla.
La instrucción (2) también se emite en el ciclo 1 a RS1, pero como tiene una dependencia
RAW con la instrucción (1) en f3, debe esperar a que f3 se haya calculado en el ciclo 4 para
poder ejecutarse. En cuanto tiene disponible f3 (ciclo 4) pasa a ejecutarse al sumador 1 y
finaliza en el ciclo 6 (los sumadores tienen una latencia de 2 ciclos). En el siguiente ciclo
(ciclo 7) se retirará del ROB y almacenará en el registro f2 el valor 20.
La instrucción (3) se emite en el ciclo 2 a la estación de reserva RS2, ya que las dos
primeras se emitieron en el ciclo 1 y solo se pueden emitir dos instrucciones por ciclo. Esta
instrucción no podrá ejecutarse hasta el ciclo 6, ya que tiene dependencias RAW con las
instrucciones (1) y (2) en los registros f3 y f2 respectivamente, y finalizará en el ciclo 11
porque el multiplicador tiene una latencia de 5 ciclos. En el ciclo 12 se retirará del ROB
escribiendo en el registro f4 el valor 300.
La instrucción (4) se emite también a RS2 en el ciclo 2 pero no podrá ejecutarse hasta el
ciclo 6 debido a la dependencia RAW con las instrucción (2) en f2. Como las divisiones
tienen una latencia de 40 ciclos, esta instrucción estará ejecutándose desde el ciclo 6 hasta el
45. En el ciclo 46 escribirá el resultado en el ROB y en el ciclo 47 se retirará escribiendo
en el registro f5 el valor 2.
La instrucción (5) se emitirá en el ciclo 3 a RS1, ya que las dos anteriores se emitieron en
el ciclo anterior, y en el ciclo 4, como ya tiene disponible el valor de f3 que produce la
instrucción (1), podrá pasar a ejecutarse a uno de los sumadores. En el ciclo 6 finalizará y
almacenará el resultado en el ROB, pero no podrá retirarse hasta el ciclo 47, que es cuando
se retira la instrucción (4), ya que la retirada debe ser ordenada, así que como pueden
retirarse dos instrucciones por ciclo, en el ciclo 47 se retirará y escribirá en el registro f2
el valor 5.
10 (Ejercicios de clase)
Considere que el fragmento de código siguiente:
1 lw r3,0x10a
2 addi r2,r0,#128
3 add r1,r0,0x0a
4 lw r4,0(r1)
5 lw r5,-8(r1)
6 mult r6,r5,r3
7 add r5,r6,r3
8 add r6,r4,r3
9 sw 0(r1),r6
10 sw -8(r1),r5
11 sub r2,r2,#16
(Nota: Considere que tiene una unidad funcional de carga (2), una de almacenamiento(1), tres
unidades de suma/resta(1), y una de multiplicación (6)- y que no hay limitaciones para el número de
líneas de la cola de instrucciones, ventana de instrucciones, búfer de reordenamiento, puertos de
lectura/escritura etc.).
Solución.
La forma en que las instrucciones van pasando por las distintas etapas del cauce se muestra en las
tablas que se proporcionan a continuación. En las tablas también se marcan las dependencias RAW
que existen entre las instrucciones.
En la emisión ordenada (Tabla P2.a) los instantes en los que las instrucciones empiezan a ejecutarse
(columna EX) deben estar ordenados de menor a mayor, a diferencia de lo que ocurre en la emisión
desordenada (Tabla P2.b)
Otro aspecto que debe tenerse en cuenta es que en las columnas ID, EX, ROB, y WB no deben
existir más de dos instantes de tiempo iguales ya que se decodifican, emiten, escriben en el ROB, o
retiran, dos instrucciones por ciclo como máximo. Por ello, por ejemplo, la instrucción (11) en la
tabla P2.b se termina (escribe el resultado en el ROB) en el ciclo 10, y no en el 9.
Ordenado
P2.b Emisión Desordenada / Finalización Ordenada
Desordenado Ordenado
A partir de las tablas correspondientes a cada situación se comprueba que el tiempo que tarda la
secuencia de instrucciones es el mismo tanto para la emisión ordenada como para la desordenada.
Esto se debe, fundamentalmente, a las dependencias existentes entre las instrucciones,
concretamente entre la multiplicación (6) y el almacenamiento (10) y al tiempo de la multiplicación,
que hace que se tenga que retrasar la instrucción de almacenamiento (6). De hecho, si se
considerase que las instrucciones finalizan cuando terminan (no deben esperar en el ROB a que les
toque el turno para ser retiradas), para el caso (a) se tendrían 19 ciclos, y para el (b) 18 ciclos (se
supone que la instrucción (11) ha escrito sus resultados en el ciclo 11).
11 (Ejercicios de clase)
En el problema anterior, (a) indique qué mejoras realizaría en el procesador para reducir el tiempo
de ejecución en la mejor de las opciones sin cambiar el diseño de las unidades funcionales
(multiplicador, sumador, etc.) y sin cambiar el tipo de memorias ni la interfaz entre procesador y
memoria (no varía el número de instrucciones captadas por ciclo. (b) ¿Qué pasaría si se reduce el
tiempo de multiplicación a la mitad?
Solución.
P3.a Instrucciones decodificadas por ciclo (4) y retiradas por ciclo (3);
Unidades de acceso a memoria (2); no hay límite en la emisión
Intrucción Inst# IF ID EX ROB WB Comentarios
lw r3,0x10a (1) 1 2 3 5 6 Se pueden retirar tres
instrucciones por ciclo
addi r2,r0,#128 (2) 1 2 3 4 6 Termina antes que la (1) pero
se retira al mismo tiempo
add r1,r0,0x0a (3) 1 2 3 4 6 Se pueden emitir más de 2
instrucciones/ciclo
lw r4,0(r1) (4) 1 2 4 6 7
lw r5,-8(r1) (5) 2 3 4 6 7 No hay colisión en el load
Desordenado Ordenado
P3.b Instrucciones decodificadas por ciclo (4) y retiradas por ciclo (3);
Unidades de acceso a memoria (2); no hay límite en la emisión
Intrucción Inst# IF ID EX ROB WB Comentarios
lw r3,0x10a (1) 1 2 3 5 6 Se pueden retirar tres
instrucciones por ciclo
addi r2,r0,#128 (2) 1 2 3 4 6 Termina antes que la (1) pero
se retira al mismo tiempo
add r1,r0,0x0a (3) 1 2 3 4 6 Se pueden emitir más de 2
instrucciones/ciclo
lw r4,0(r1) (4) 1 2 4 6 7
lw r5,-8(r1) (5) 2 3 4 6 7 No hay colisión en el load
Desordenado Ordenado
En las Tablas P3.a y P3.b se muestra la forma en que las instrucciones pasan por el cauce
superescalar para las cuestiones (a) y (b) planteadas en el problema.
Para resolver la cuestión (a), inicialmente se considera que se decodifica el mismo número de
instrucciones que se capta, ya que no existen limitaciones impuestas por las instrucciones al ritmo
de decodificación (éste viene determinado por las posibilidades de los circuitos de descodificación y
la capacidad para almacenar las instrucciones decodificadas hasta que se emitan). También se
considera que no existen limitaciones para el número de instrucciones por ciclo que se emiten,
escriben el ROB, y se retiran. Por último, se consideran que están disponibles todas las unidades
funcionales que se necesiten para que no haya colisiones (riesgos estructurales).
Una vez encontrada la distribución temporal de las instrucciones en las distintas etapas, tal y como
se muestra en la Tabla P3.a, se observa que, las mejoras necesarias (sin modificar los tiempos de
procesamiento de las unidades funcionales) para reducir el tiempo al mínimo que permiten las
dependencias RAW entre las instrucciones han sido: decodificar 4 instrucciones por ciclo, emitir,
escribir en el ROB, y retirar hasta tres instrucciones por ciclo, y añadir una unidad de carga de
memoria más.
Si se tiene en cuenta que la secuencia consta de 11 instrucciones, que el tiempo mínimo que tarda la
primera instrucción en salir son 6 ciclos (lo tomamos como tiempo de latencia de inicio del cauce),
y que el tiempo total de ejecución en este caso es de 12 ciclos, se puede escribir:
con lo que, si se despeja, se tiene que el procesador superescalar presenta una media de 0.6 ciclos
por instrucción, o lo que es lo mismo, ejecuta 1.67 (1/0.6) instrucciones por ciclo.
12 (Ejercicios de clase)
En el caso descrito en el problema 2, suponga que se utiliza un búfer de reordenamiento para
permitir la ejecución desordenada y la finalización ordenada. Indique cómo evolucionaría dicho
búfer de reordenamiento en el mejor de los casos.
Solución.
A continuación se muestra la evolución del búfer de reordenamiento (ROB) del procesador
superescalar descrito en el problema 2. Entre los dos casos que se plantean en el problema indicado
se considerado el caso de emisión desordenada.
Se muestra el estado del ROB al final del ciclo indicado. En el ROB que se ha utilizado se considera
que existe espacio para almacenar los resultados de las instrucciones correspondientes y, por tanto,
implementa también el renombrado de registros.
Al final del ciclo 2 se han introducido las instrucciones (1) y (2) que escribirán sus resultados en r3
y r2, respectivamente (no tienen valores válidos en el ROB, y por ello sus bits de ok están a 0). Al
final del ciclo 3, se han introducido las instrucciones (3) y (4) y se han emitido las instrucciones (1)
y (2). Por eso se escribe la unidad en la que se están ejecutando en la columna Unidad (última
columna) del ROB).
Ciclo 2
1 1 lw r3 - 0
2 2 addi r2 - 0
Ciclo 3
1 1 lw r3 - 0 load
2 2 addi r2 - 0 add
3 3 add r1 - 0
4 4 lw r4 - 0
Al final del ciclo 4 han entrado en el ROB las instrucciones (5) y (6), se ha terminado la instrucción
(2), y por eso su bit OK está a 1, y se ha emitido la instrucción 3.
Ciclo 4
1 1 lw r3 - 0 load
3 3 add r1 - 0 add
4 4 lw r4 - 0
5 5 lw r5 - 0
6 6 mult r6 - 0
Al final del ciclo 5 se han introducido las instrucciones 7 y 8, y se han terminado de ejecutar las
instrucciones (1) y (3). También se ha emitido la instrucción 4.
Ciclo 5
1 1 lw r3 [0x10a] 1 load
4 4 lw r4 - 0 load
5 5 lw r5 - 0
6 6 mult r6 - 0
7 7 add r5 - 0
8 8 add r6 - 0
Al terminar el ciclo 6 se habrán retirado las instrucciones (1) y (2). La instrucción (3) no se puede
retirar ya que como máximo se pueden retirar dos instrucciones por ciclo (condiciones del problema
2). También se han introducido las instrucciones (9) y (10) en el ROB.
Ciclo 6
Al final del ciclo 7 se habrá introducido la instrucción (11) en el ROB y se habrá retirado la
instrucción (3). La instrucción (4) ha terminado su ejecución, y se han emitido las instrucciones (5)
y (8).
Ciclo 7
Ciclo 9
Desde el ciclo 10 al ciclo 15, el ROB no sufre ningún cambio (se supone que no hay más
instrucciones que se van introduciendo en el mismo). Al final del ciclo 15 ha terminado la
multiplicación, y se ha emitido la instrucción (7), que dependía de ella.
Ciclo 15
Al final del ciclo 16 se habrá retirado la instrucción (6) de multiplicación, termina la ejecución de la
(7), y se emite la instrucción (10), que termina en el ciclo siguiente. Así, finalmente, al finalizar el
ciclo 17 se habrán retirado las instrucciones (7) y (8), al final del 18, la (9) y la (10), y al finalizar el
ciclo 19 se habrá retirado la instrucción (11) y habrá concluido el procesamiento de la secuencia de
instrucciones.
Ciclo 16
Termina en 17
Ciclos en los
que salen
13 (Ejercicios de clase)
Considere que el fragmento de código siguiente:
Nota: El procesador dispone de 2 unidades de suma/resta (de 2 ciclos), una de multiplicación (de 4
ciclos), y que no hay limitaciones en el número de líneas de la cola de instrucciones, búfer de
reordenamiento, puertos de lectura/escritura, etc.
Solución.
La distribución de etapas del procesador superescalar descrito se muestra en la figura siguiente,
donde no se han representado las estructuras de almacenamiento entre etapas (colas, búferes, etc.).
EX
Suma/Resta
IF ID ROB WB
Suma/Resta
3 ins/ciclo 3 ins/ciclo 2 ins/ciclo
3 ins/ciclo
Multiplicación
(a) En la Tabla siguiente se muestra la evolución temporal del conjunto de instrucciones indicado
para emisión ordenada (no alineada).
Instrucción IF ID EX ROB WB
(1) subd f2,f2,f1 1 2 3-4 5 6
(2) addd f4,f2,f3 1 2 5-6 7 8
(3) subd f5,f2,f3 1 2 5-6 7 8
(4) multd f6,f2,f3 2 3 5-8 9 10
(5) subd f2,f2,f5 2 3 7-8 9 10
(6) subd f7,f4,f6 2 3 9 - 10 11 12
Las instrucciones 2, 3, y 4 han de esperar a que termine de ejecutarse la instrucción 1 para disponer
de su operando f2. La instrucción 5 también tiene que esperar al operando f2, pero como también
necesita f5 que es producida por la instrucción 3 no puede esperar hasta que hasta que ha terminado
ésta. Por otra parte, tampoco podría enviarse dado que no se puede enviar más de tres instrucciones
por ciclo, y se envían las instrucciones 2, 3, y 4 en el ciclo 5. Por otra parte, la instrucción 6 debe
esperar que termine la 4, dado que necesita f6 (también necesita f4, pero la instrucción 2 que lo
produce termina su ejecución antes que la instrucción 4).
Si la emisión es desordenada no se ganaría nada para las instrucciones indicadas ya que lo que
limita su emisión son las dependencias RAW entre ellas. Ninguna instrucción posterior a la
instrucción 1 se puede lanzarse antes del ciclo 5 (la instrucción 1 produce f2 que necesitan las
instrucciones 2, 3, 4, y 5). La instrucción 5 no se puede lanzar antes del ciclo 7 ya que necesita el
valor de f5 que produce la instrucción 3. La instrucción 6 no puede lanzarse antes del ciclo 9 dado
que necesita el valor de f6, que se tiene en el ciclo 8, obtenido por la instrucción 4.
(b) En la figura siguiente se muestra un esquema del uso de los recursos del procesador.
Ciclo 1 2 3 4 5 6 7 8 9 10 11 12
Suma/Resta 1 1 2 2 5 5
1
Suma/Resta 3 3 6 6
1
Producto 4 4 4 4
En ningún momento se retrasa la emisión de una instrucción porque estén ocupadas todas las
unidades funcionales (suma/resta y multiplicación), son las dependencias RAW las que determinan
los tiempos de espera de las instrucciones. Por lo tanto, añadir más unidades funcionales al cauce no
va a afectar al tiempo de ejecución.
Instrucción IF ID EX ROB WB
(1) subd f2,f2,f1 1 2 3 4 5
(2) addd f4,f2,f3 1 2 4 5 6
(3) subd f5,f2,f3 1 2 4 5 6
(4) multd f6,f2,f3 2 3 4–6 7 8
(5) subd f2,f2,f5 2 3 5 6 8
(6) subd f7,f4,f6 2 3 7 8 9
Por lo tanto, el diseño de unidades funcionales más rápidas es la mejor opción para este trozo de
código.
Indique las dependencias entre las instrucciones, los ciclos en los que se emiten para su ejecución y
cómo evolucionaría en búfer de reordenamiento hasta que se hayan retirado todas las instrucciones
de la siguiente secuencia almacenada en la cola de instrucciones captadas:
Nota: La suma y la resta consumen 1 ciclo de reloj y la multiplicación tres ciclos. Considere que no
hay limitaciones en la capacidad de los búferes ni en el número de unidades funcionales. Se supone
que f1, f2 y f5 tienen valores previos.
Solución.
Ya que el procesador no dispone de estaciones de reserva, la lógica de emisión tiene que esperar a
que los operandos le sean facilitados por la lógica de bypass, por tanto, las dependencias RAW
afectarán al orden de emisión de las instrucciones. Existen las siguientes dependencias RAW:
Instrucción / Ciclo 1 2 3 4 5 6 7 8
(1) multd f1, f1, f5 ID ISS EX EX EX WB
(2) addd f2, f2, f5 ID ISS EX WB
(3) addd f4, f1, f2 ID ISS EX WB
(4) addd f6, f1, f5 ID ISS EX WB
(5) multd f5, f2, f2 ID ISS EX EX EX WB
(6) subd f6, f1, f2 ID ISS EX WB
Para la calcular la velocidad pico, como sólo se pueden retirar dos instrucciones por ciclo,
suponiendo que no hubiera atascos en el cauce se podrían ejecutar 2 instrucciones por ciclo
NOTA: La suma y la resta consumen un ciclo de reloj y la multiplicación cuatro ciclos. Considere
que no hay limitaciones en la capacidad de los búferes, y en el número de unidades funcionales. Se
supone que f1, f2, y f4 tienen valores válidos previos.
Solución.
Ya que el procesador no dispone de estaciones de reserva, la lógica de emisión tiene que esperar a
que los operandos le sean facilitados por la lógica de bypass, por tanto, las dependencias RAW
afectarán al orden de emisión de las instrucciones. En concreto, las instrucciones (2), (3) y (4)
dependen del valor de f1 producido por la instrucción (1) y la instrucción (4) depende del valor de
f6 producido por la instrucción (3)
Para la calcular la velocidad pico, como sólo se pueden retirar dos instrucciones por ciclo,
suponiendo que no hubiera atascos en el cauce se podrían ejecutar 3 instrucciones por ciclo
Nota: La suma y la resta consumen 1 ciclo de reloj, la multiplicación tres ciclos y la división cuatro
ciclos. Considere que sólo hay un multiplicador, un divisor, y dos unidades para sumar/restar, y que
no hay limitaciones en la capacidad de los búferes. Se supone que f1, f2 y f5 tienen valores previos.
Solución.
Para estimar el tiempo de ejecución del programa, hacemos el siguiente diagrama:
Instrucción 1 2 3 4 5 6 7 8 9 10 11 12
multd f1, f1, f5 IF ID EX EX EX ROB WB
addd f2, f2, f5 IF ID EX ROB WB
divd f4, f1, f2 IF ID EX EX EX EX ROB WB
addd f6, f1, f5 IF ID EX ROB WB
multd f5, f2, f2 IF ID EX EX EX ROB WB
subd f6, f2, f1 IF ID EX ROB WB
Como muestra el diagrama anterior, la emisión de las instrucciones (2) y (3) se debe retrasar hasta que se ejecute la
instrucción (1) porque ambas instrucciones dependen del valor de f1, la emisión de la instrucción (5) se debe retrasar un
ciclo porque sólo hay un multiplicador, y la emisión de la instrucción (6) se debe retrasar un ciclo porque sólo se pueden
emitir tres instrucciones por ciclo.
A continuación se describe cómo evolucionaría el búfer de reordenamiento:
Suponiendo una frecuencia del procesador de 2GHz, el tiempo de ejecución de este fragmento de
código sería:
12 ciclos
T 6 10 9 s 6 ns
2 109 ciclos/s
Teniendo en cuenta que el procesador sólo puede retirar dos instrucciones por ciclo, la velocidad
pico del procesador es:
Indique las dependencias entre instrucciones, los ciclos en los que se emiten las instrucciones para
su ejecución y cómo evolucionaría el búfer de reordenamiento hasta que se hayan retirado todas las
instrucciones de la siguiente secuencia de instrucciones almacenadas en la cola de instrucciones
captadas:
Suponiendo una frecuencia de 3.0 GHz, ¿cuánto tarda en procesarse la secuencia de instrucciones?
¿Cuál es la velocidad pico del procesador?
Nota: La suma y la resta consumen dos ciclos de reloj y la multiplicación cuatro ciclos. Considere
que no hay limitaciones en la capacidad de los búferes, pero sólo tiene un multiplicador y dos
sumadores/restadores. Se supone que f1, f2, y f3 tienen valores válidos previos.
Solución.
Ya que el procesador no dispone de estaciones de reserva, la lógica de emisión tiene que esperar a
que los operandos le sean facilitados por la lógica de bypass, por tanto, las dependencias RAW
afectarán al orden de emisión de las instrucciones. Por otro lado, como se pueden decodificar hasta
dos instrucciones por ciclo y emitir hasta tres, suponemos que cada una de estas tareas se realizarán
en etapas diferentes del cauce. Es decir, que la etapas serán IF para captar instrucciones, ID para
decodificarlas, ISS para emitirlas, EX para ejecutarlas, ROB para escribir los resultados en el ROB
y WB para retirar las instrucciones del cauce. Las dependencias entre instrucciones y los momentos
de emisión de las mismas se muestran en la siguiente figura:
Instrucción / Ciclo 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
multd f1, f1, f2 IF ID ISS EX EX EX EX ROB WB
addd f3, f3, f2 IF ID ISS EX EX ROB WB
multd f4, f1, f3 IF ID ISS EX EX EX EX ROB WB
addd f5, f4, f2 IF ID ISS EX EX ROB WB
addd f3, f1, f3 IF ID ISS EX EX ROB WB
subd f5, f2, f1 IF ID ISS EX EX ROB WB
Para la calcular la velocidad pico, como sólo se pueden retirar dos instrucciones por ciclo,
suponiendo que no hubiera atascos en el cauce se podrían ejecutar 3 instrucciones por ciclo
Indique las dependencias entre instrucciones, los ciclos en los que se emiten las instrucciones para
su ejecución y cómo evolucionaría el búfer de reordenamiento hasta que se hayan retirado todas las
instrucciones de la siguiente secuencia de instrucciones almacenadas en la cola de instrucciones
captadas:
Suponiendo una frecuencia de 3.0 GHz, ¿cuánto tarda en procesarse la secuencia de instrucciones?
¿Cuál es la velocidad pico del procesador?
Nota: La suma y la resta consumen dos ciclos de reloj y la multiplicación cuatro ciclos. Considere
que no hay limitaciones en la capacidad de los búferes, pero sólo tiene un multiplicador y dos
sumadores/restadores. Se supone que f1, f2, y f3 tienen valores válidos previos.
Solución.
Ya que el procesador no dispone de estaciones de reserva, la lógica de emisión tiene que esperar a
que los operandos le sean facilitados por la lógica de bypass, por tanto, las dependencias RAW
afectarán al orden de emisión de las instrucciones. Existen las siguientes dependencias RAW:
Instrucción / Ciclo 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
(1) multd f1, f1, f2 ID ISS EX EX EX EX ROB WB
(2) addd f3, f3, f2 ID ISS EX EX ROB WB
(3) addd f4, f1, f3 ID ISS EX EX EX EX ROB WB
(4) addd f6, f4, f2 ID ISS EX EX ROB WB
(5) multd f3, f1, f3 ID ISS EX EX ROB WB
(6) subd f6, f2, f1 ID ISS EX EX ROB WB
Para la calcular la velocidad pico, como sólo se pueden retirar dos instrucciones por ciclo,
suponiendo que no hubiera atascos en el cauce se podrían ejecutar 2 instrucciones por ciclo
NOTA: Considere que, conectadas a la estación de reserva para el acceso a memoria, tiene una
unidad funcional de carga con un retardo de dos ciclos y una de almacenamiento con retardo de un
ciclo; conectadas a la estación de reserva para enteros tiene dos ALUs con retardo de un ciclo; y,
conectadas a la estación de reserva para coma flotante tiene una unidad de multiplicación con cinco
ciclos de retardo y dos unidades de suma con dos ciclos de retardo. No hay límite en el número de
líneas de la cola de instrucciones y del ROB).
Solución.
Suponiendo un envío desordenado para todas las estaciones de reserva, el código tardaría 28 ciclos
en ejecutarse, tal y como se muestra en el siguiente diagrama:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
(1) lf f3, 0(r1) IF ID EX EX ROB WB
(2) lf f2, 8(r1) IF ID X X EX EX ROB WB
(3) addf f4, f2, f3 IF ID EX EX ROB WB
(4) sf 16(r1), f4 IF ID EX WB
(5) lf f5, 16(r2) IF ID EX EX ROB WB
(6) addf f6, f5, f2 IF ID EX EX ROB WB
(7) multf f6, f6, f4 IF ID EX EX EX EX EX ROB WB
(8) sf 8(r2), f6 IF X X ID EX WB
(9) addi r3, r2, #32 IF X ID EX ROB WB
(10) lf f7, 0(r3) IF X X X X X ID EX EX ROB WB
(11) multf f8, f7, f3 IF X X X X X ID EX EX EX EX EX ROB WB
(12) sf 0(r3), f8 IF X X X X X X ID EX WB
En el enunciado se especifica que las cargas podrán adelantar a los almacenamientos siempre que
no sean especulativas, es decir cuando se sepa que va a acceder a direcciones de memoria
diferentes. Las instrucciones (5) y (4), acceden a memoria con el mismo desplazamiento y dos
registros índice diferentes (r2 y r1), con lo que si r2 tuviera un valor diferente al de r1, la
instrucción (5) podría adelantar a la (4). Como no sabemos los valores de estos registros, se ha
supuesto el peor caso, que es la coincidencia de r1 y r2, lo que obliga a que la instrucción (5)
tenga que esperar a la (4). Por otro lado, las instrucciones (10) y (8) acceden a posiciones de
memoria diferentes, ya que la instrucción (8) almacena en la posición 8+r2 y la instrucción (10) lee
de la posición 0+r3 = 32+r2. Como suponemos que las direcciones efectivas se calculan en el
primer ciclo de la etapa de ejecución de las instrucciones de acceso a memoria, aunque las
direcciones finales sean diferentes, este hecho no se puede comprobar por la lógica de envío de la
estación de reserva, lo que obliga a enviar primero el almacenamiento y luego la carga. Estas dos
dependencias están marcadas en el diagrama mediante flechas de color amarillo.
Las colisiones que se producen en el cauce están marcadas con el símbolo X. Estas colisiones
pueden ser bien en las estaciones de reserva o en las unidades de ejecución. Como las estaciones de
reserva tienen sólo tres entradas cada una, cuando alguna se llena no permite que se puedan emitir
más instrucciones hacia ella hasta que envíe alguna instrucción y deje algún hueco. Este fenómeno
se puede apreciar en la instrucción (8), que no puede entrar hasta que se envía la instrucción (2) y se
quedan en la estación de reserva las instrucciones (4) y (5). También se crea un cuello de botella en
la estación de reserva de acceso a memoria con la instrucción (10), que no puede emitirse hasta que
se envía la instrucción (4), y que retrasa la emisión de la instrucción (11), ya que la emisión es
ordenada. Por último, la instrucción (12) se bloqueará en la cola de instrucciones hasta que se envíe
a ejecutar la instrucción (5).
En cuanto a las colisiones en las unidades de ejecución, la instrucción (2) debe esperar a que la (1)
libere la unidad de carga, y lo mismo ocurre entre las instrucciones (11) y (7) por el multiplicador y
entre las instrucciones (10) y (5) al acceder a memoria.
Por último, los riesgos de datos adelantados por los caminos de bypass están marcados mediante
flechas negras en el diagrama.
En el caso de que el envío fuese desordenado sólo para la estación de reserva de acceso a memoria,
el resultado sería exactamente el mismo, ya que debido a los riesgos del programa, todas las
instrucciones se han enviado ordenadamente.
Nota: La penalización por saltos incorrectamente predichos es de 5 ciclos y para los saltos
correctamente predichos es 0 ciclos.
Solución.
En el primer caso, con predicción fija, se predecirá siempre que se va a producir el salto, por lo que
se sufrirá una penalización en aquellas ocasiones que las que no se produzca el salto. Para la
secuencia de saltos del enunciado tenemos:
Predicción S S S S S S S S S S S S S S S S S S S S S S S S
Secuencia S S S S N S S S S N S S N S S N S S S N N N N N
Penalización P P P P P P P P P
En el caso de usar un predictor estático, como el salto es hacia atrás, el predictor estimará que
siempre se va a producir el salto, con lo que el resultado es exactamente igual al anterior,
produciéndose una penalización de 45 ciclos.
En el último caso se utiliza un predictor dinámico de 2 bits inicializado al valor 11 (saltar). Para la
secuencia anterior tenemos las siguientes predicciones:
Estado 11 11 11 11 11 10 11 11 11 11 10 11 11 10 11 11 10 11 11 11 10 01 00 00
Predicción S S S S S S S S S S S S S S S S S S S S S N N N
Secuencia S S S S N S S S S N S S N S S N S S S N N N N N
Penalización P P P P P P
SSNNNSSNSNSNSSSSSN
Nota: La penalización por saltos incorrectamente predichos es de 5 ciclos y para los saltos
correctamente predichos es 0 ciclos.
Solución.
A continuación se van a ir considerando cada uno de los esquemas de predicción indicados:
(a) Predicción Fija. En el esquema de predicción fija considerado hay penalización cuando se
produce el salto. Es decir en el caso de S (marcadas en negrita):
SSNNNSSNSNSNSSSSSN
(b) Predicción Estática. Teniendo en cuenta que se predice salto si éste es hacia direcciones
menores, como es el caso que aquí se considera, habrá penalización cuando no se produzca el salto:
N en la secuencia considerada (marcadas en negrita).
SSNNNSSNSNSNSSSSSN
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
S S N N N S S N S N S N S S S S S N
P P P P P P P P P P P
S S S S N N N S N S N S N S S S S S
3 4,8,10,12 5
NS NS NS
S 11 (S) 10 (S) 01 (NS) 00 (NS)
S S S
1,2,15 14 7,9,11,13 6
Situación
Inicial
La justificación de esas penalizaciones (tercera fila) se obtiene a partir del diagrama de estados del
esquema de predicción dinámica con dos bits, en el que se han marcado las transiciones ocasionadas
por cada ejecución de la instrucción de salto (1, 2,...., 18).
Como hay error de predicción en 11 casos, se tiene que la penalización es igual a 11* 5 =55 ciclos.
Así, se puede indicar que la eficacia de un esquema de salto depende del perfil de saltos a que de
lugar la correspondiente instrucción de salto condicional. En la práctica, los esquemas de predicción
dinámica suelen funcionar mejor que los de predicción estática porque las instrucciones de salto
suelen repetir el comportamiento de su ejecución previa. En ese sentido, la secuencia utilizada en
este problema es bastante atípica.
teniendo en cuenta que S significa que la instrucción dará lugar a un salto, N que no dará lugar a un
salto y cada subíndice, 1, 2, 3 hace referencia a una instrucción de salto distinta?
Solución.
Se deben considerar cada una de las instrucciones de salto por separado.
En la siguiente tabla se muestran los resultados para esta instrucción de salto (hacia atrás):
con lo que la secuencia de saltos y no saltos para esta instrucción es SNSS, y en la tabla siguiente se
muestran los resultados para esta instrucción de salto hacia delante.
Puntero de 3 Contador de Se predice Se produce Penalización
bits 2 bits (al que
apunta el
puntero de 3
bits)
000 00 N S P
100 00 N N -
010 00 N S P
100 00 N S P
con lo que la secuencia de saltos y no saltos para esta instrucción es NSNN, y en la tabla siguiente
se muestran los resultados para esta instrucción de salto hacia delante.
De esta forma el número de fallos de predicción es 7. Teniendo en cuenata que cada uno de ellos
supone una penalización de cuatro ciclos, el número de ciclos de penalización total es 7*4=28
ciclos.
Solución.
Una vez traducido el código a ensamblador tendría un aspecto similar a este:
bucle: …
…
saltar a etiqueta ;S
…
…
saltar a bucle ; SB
etiqueta: …
…
En este código hay dos saltos, que a partir de ahora notaremos como S y S B (si saltan) o N y N B (si
no saltan). Para valores de d tales que 1 < d < 8 el patrón de saltos del código es:
(NSB)8 – d S
es decir, que el salto del bucle siempre se va a tomar y el salto hacia delante no se tomará nunca
excepto la última vez, en la que se saldrá del bucle y continuará hacia delante. Como tenemos un
predictor dinámico de dos niveles, para cada salto habrá un conjunto de 8 contadores de dos bits,
que se inicializarán a 00 para el salto hacia delante y a 11 para el salto hacia atrás, y se seleccionará
uno de estos 8 contadores para hacer la predicción en función del los 3 bits de historia (según el
comportamiento del salto en las últimas tres iteraciones).
Según estas tablas, en la última iteración el salto del bucle no se llega a ejecutar, ya que se sale del
bucle por el salto hacia delante. Los predictores aciertan en el comportamiento del salto hacia atrás,
que se toma todas las veces, en todas las ejecuciones del salto hacia delante menos en la última, por
lo que sólo se equivocan una vez. Por tanto, la penalización total es de:
En el caso de que el mecanismo de predicción fuera estático, se usaría el mismo predictor para
todos los saltos. Este predictor, según el enunciado del problema, realizaría la siguiente predicción:
(NSB)8 – d N
(NSB)8 – d S
se equivocaría en el último salto, con lo que volvemos a obtener una penalización de
24 (Ejercicios de clase)
Considere el bucle:
for (i=1;i<=10;i++)
{
b[i]=a[i]*c;
c=c+1;
if (c>10) then goto etiqueta;
}
etiqueta:......
Indique cuál es la penalización efectiva debida a los saltos, en función del valor inicial de c (número
entero), considerando que el procesador utiliza:
Nota: La penalización por saltos incorrectamente predichos es de 4 ciclos y para los saltos
correctamente predichos es 0 ciclos.
Solución.
El perfil de saltos que se produce en el bucle depende del valor inicial de la variable c. Se pueden
distinguir tres casos:
N Sb N Sb N Sb ...... N Sb N Nb = (N Sb)9 N Nb
donde el índice b se utiliza para designar a la instrucción que controla las iteraciones del bucle (una
instrucción de salto condicional hacia atrás) y distinguirla de la instrucción de salto condicional que
hay dentro del bucle (salto hacia delante, para la que no se utiliza índice). En este caso, se ejecutan
todas las iteraciones del bucle.
(2) 1 ≤ c < 10 :
Si c = 9 N Sb S
Si c = 8 N Sb N Sb S
............................................
Es decir, que se tiene
(N Sb) (10-c) S
b) Predicción Estática (Se predice salto en los saltos a direcciones menores y no saltar a las
mayores.
Por consiguiente, para cualquier valor de c, este esquema de predicción siempre da lugar a 4
ciclos de penalización.
1 0
Salta (Saltar) (NoSaltar)
No Salta
1. (N Sb) 9 N Nb ocasiona una penalización debida al primer N y al último Nb, por lo que
hay 4 + 4 = 8 ciclos de penalización (un fallo por cada instrucción).
2. (N Sb) (10-c) S ocasiona una penalización debida al primer N y al último S, por lo que hay
4 +4 = 8 ciclos de penalización (las dos asociadas a la instrucción que hay dentro del
bucle).
3. Este último caso no da lugar a penalización porque la predicción inicial para toda
instrucción de salto es, precisamente, que se produce el salto.
25 (Ejercicios de clase)
En la situación descrita en el problema anterior. ¿Cuál de los tres esquemas es más eficaz por
término medio si hay un 25% de probabilidades de que c sea menor o igual a 0, un 30% de que sea
mayor o igual a 10; y un 45% de que sea cualquier número entre 1 y 9, siendo todos equiprobables?
Solución.
Para resolver el problema se tendrán en cuenta los valores de las penalizaciones para cada valor de
la variable c, y las probabilidades de cada uno de esos valores.
(a) Predicción fija (se tiene en cuenta que todos los valores de c entre 1 y 9 son equiprobables):
0 .4 5
P 4 4 * 0 .2 5
c 1 ,., 9
4 * (1 0 c ) * (
9
) 11 9 20
(b) Predicción estática: La penalización es igual a 4 ciclos dado que toma este valor para todo c.
Como se puede ver, para este bucle, y para la distribución de probabilidad de los valores de c, el
esquema de predicción más eficiente corresponde a la predicción estática. No obstante, como se ha
visto, esta situación depende de las probabilidades de los distintos valores de c. Si, por ejemplo, la
probabilidad de que c esté entre 1 y 9 es de 0.15, la penalización para la predicción dinámica con 1
bit de historia sería de 8*0.4=3.2 ciclos, mientras que la predicción estática seguiría presentando
una penalización de 4 ciclos.
addi r1,r0,#6 ; r1 = 6
add r4,r0,r1 ; r4 = r1
lw r2,dato ; r2 = dato
inicio: subi r3,r1,r2 ; r3 = r1 – r2
beqz r3, final ; si r3=0 saltar a final
addf f3,f2,f1 ; f3 = f2 + f1
addi r2,r2,#1 ; r2 = r2 + 1
subi r4,r4,#1 ; r4 = r4 – 1
bnez r4,inicio ; saltar a inicio si r4 es distinto de 0
final:
Indique cuál es la penalización efectiva debida a los saltos, en función del valor inicial de dato
(número entero mayor o igual que cero), considerando:
a) Que el procesador utiliza predicción estática (si el salto es hacia atrás predice saltar y si es
hacia delante no saltar).
b) Que el procesador utiliza predicción dinámica con un bit, suponiendo que el estado inicial es
1 (es decir, predice saltar) si el salto es hacia atrás, y 0 (es decir, predice no saltar) si el salto
es hacia adelante.
c) Que el procesador utiliza predicción dinámica con dos bits, suponiendo que el estado inicial
es 11 (es decir, predice saltar) si el salto es hacia atrás, y 00 (es decir, predice no saltar) si el
salto es hacia adelante.
d) ¿Cuál es la penalización media en cada uno de los casos anteriores si la probabilidad de que
dato sea menor que 5 es un 70%?
Nota: La penalización por saltos incorrectamente predichos es de 4 ciclos y para los saltos
correctamente predichos es 0 ciclos.
Solución.
En el trozo de código del enunciado aparecen dos saltos, el primero hacia delante, que notaremos
como S o N, dependiendo de si salta o no, y el segundo, que es el salto de control del bucle, que
notaremos como SB o NB. Lo primero que hay que hacer es encontrar los patrones que describen el
comportamiento de los saltos en función del valor que tenga la variable dato:
Una vez que tenemos el comportamiento que tendrán los saltos, solo nos queda ver cómo le afectan
los distintos predictores:
(a) El predictor estático predice los saltos hacia delante como no tomados y los saltos hacia atrás
como tomados, así las predicciones serían:
El predictor se equivoca sólo en el último salto, por tanto, la penalización será de:
El predictor se equivoca sólo en el último salto, por tanto, la penalización será de:
(b) Los predictores dinámicos de un bit están inicializados a 0 (no saltar hacia delante) para el
primer salto y 1 (saltar hacia atrás), por tanto las predicciones serían:
El predictor se equivoca sólo en el último salto, por tanto, la penalización será de:
El predictor se equivoca sólo en el último salto, por tanto, la penalización será de:
El predictor se equivoca sólo en el último salto, por tanto, la penalización será de:
El predictor se equivoca sólo en el último salto, por tanto, la penalización será de:
(d) Según los resultados obtenidos, la penalizazión media será de 4 ciclos, independientemente del
valor de la variable dato y del predictor usado.
addi r1,r0,#4 ; r1 = 4
add r4,r0,r1 ; r4 = r1
lw r2,dato ; r2 = dato
add r5,r2,r0 ; r5 = dato
inicio: subi r3,r1,r2 ; r3 = r1 – r2
beqz r3, final ; si r3=0 saltar a final
addf f3,f2,f1 ; f3 = f2 + f1
beqz r5,final ; si r5=0 saltar a final
addf f3,f2,f1 ; f3 = f2 + f1
addi r2,r2,#1 ; r2 = r2 + 1
subi r5,r5,#1 ; r5 = r5 - 1
subi r4,r4,#1 ; r4 = r4 – 1
bnez r4,inicio ; saltar a inicio si r4 es distinto de 0
final:
Indique cuál es la penalización efectiva debida a los saltos, en función del valor inicial de dato
(número entero mayor o igual que cero), considerando que el procesador utiliza predicción
dinámica con dos bits. ¿Cuál es la penalización media si la probabilidad de que dato sea menor que
5 es un 80%?
Nota: La penalización por saltos incorrectamente predichos es de 4 ciclos y para los saltos
correctamente predichos es 0 ciclos. Para hacer la predicción en la primera ejecución de la
instrucción de salto se utiliza un esquema de predicción estática (salta si el salto es hacia atrás y no
salta si el salto es hacia adelante) y el estado inicial es 00 si se ha predicho no saltar y 11 si se ha
predicho saltar.
Solución.
En la secuencia de instrucciones del problema aparecen tres saltos, que a partir de ahora notaremos
coma S1, S2 y S3 como se muestra a continuación:
addi r1,r0,#4 ; r1 = 4
add r4,r0,r1 ; r4 = r1
lw r2,dato ; r2 = dato
add r5,r2,r0 ; r5 = dato
inicio: subi r3,r1,r2 ; r3 = r1 – r2
beqz r3, final ; si r3=0 saltar a final S1
addf f3,f2,f1 ; f3 = f2 + f1
beqz r5,final ; si r5=0 saltar a final S2
addf f3,f2,f1 ; f3 = f2 + f1
addi r2,r2,#1 ; r2 = r2 + 1
subi r5,r5,#1 ; r5 = r5 - 1
subi r4,r4,#1 ; r4 = r4 – 1
bnez r4,inicio ; saltar a inicio si r4 es distinto de 0 S3
final:
el salto S1 controla el contador ascendente r2, que se inicializa con el valor dato y que
provoca la salida del bucle cuando r2 alcanza el valor 4 (siempre que dato haya sido
inicializado a un valor menor o igual que 4)
el salto S2 controla el contador descendente r5, que se inicializa con el valor dato y que
provoca la salida del bucle cuando r5 alcanza el valor 0
el salto S3 controla el contador descendente r4, que se inicializa con el valor inmediato 4 y
que permite la iteración del bucle un máximo de 4 veces, ya que deja de saltar hacia incio
cuando r4 vale 0
dato 0 1 2 3 4 >4
S1 N N N N N S N S S N N N N
S2 S N S N N – N – – N N N N
S3 – S – S S – S – – S S S N
Si dato < 2, el predictor estático acertará la primera vez para cada uno de los tres saltos,
inicializando los predictores dinámicos de S1 a 00, de S2 a 00 y de S3 a 11. Como después
de esta inicialización todos los saltos repiten su comportamiento hasta el final excepto S2,
que es el que provoca la salida del bucle, todos los saltos serán bien predichos a excepción
del último salto de S2, con lo que la penalización total de de 1 fallo, es decir, 4 ciclos.
Si 2 ≤ dato ≤ 4, el predictor estático acertará la primera vez para cada uno de los tres saltos,
como pasaba en el caso anterior. Como después de esta inicialización todos los saltos repiten
su comportamiento hasta el final excepto S1, que es el que provoca la salida del bucle, todos
los saltos serán bien predichos a excepción del último salto de S1, con lo que la penalización
total de de 1 fallo, es decir, 4 ciclos.
Si dato > 4, el predictor estático también acertará la primera vez para cada uno de los tres
saltos. Como después de esta inicialización todos los saltos repiten su comportamiento hasta
el final excepto S3, que es el que provoca la salida del bucle, todos los saltos serán bien
predichos a excepción del último salto de S3, con lo que la penalización total de de 1 fallo,
es decir, 4 ciclos.
Como conclusión podemos decir que independientemente del valor de la variable dato, la secuencia
de instrucciones tiene una penalización de 4 ciclos debida a los saltos.
Suponiendo que el procesador que ejecutará este código tiene un predictor estático que predice
como tomados los saltos hacia atrás y como no tomados los saltos hacia delante, y que la
penalización en caso de errar la predicción es de 5 ciclos, ¿qué penalización media se obtendrá si
solo el 10% de los elementos del vector a son positivos?
Se han añadido a este procesador nuevas instrucciones de salto condicional para invertir el
comportamiento del predictor de saltos. Estas nuevas instrucciones añaden el sufijo “n” a las ya
existentes y predicen como tomados los saltos hacia delante y como no tomados los saltos hacia
atrás. Conociendo que solo el 10% de los elementos del vector a son positivos, modifique el
programa con estas nuevas instrucciones para minimizar la penalización media debida a los saltos
mal predichos. ¿Qué penalización media debida a los saltos tiene esta nueva versión del programa?
Solución.
En la secuencia de instrucciones del problema aparecen tres saltos, que a partir de ahora notaremos
coma S1, S2 y S3 como se muestra a continuación:
Teniendo en cuenta el comportamiento del predictor estático descrito en el enunciado y que solo el
10% de los valores del vector a son positivos, podemos descubrir que:
el salto S2 saltará hacia delante el 90% de las iteraciones (siempre que se ejecute y no se
haya saltado en S1), y cuando salte incurrirá en una penalización de 5 ciclos
el salto S3 controla el bucle, con lo que saltará hacia atrás en todas las iteraciones excepto en
la última, provocando una penalización de 5 ciclos
Por tanto, para un vector a de tamaño n, la penalización debida a los saltos mal predichos será:
Tras esto podemos darnos cuenta de que el salto S2 está mal predicho todas las veces que se ejecuta
(90% de las iteraciones), así que haciendo uso de las nuevas instrucciones de salto para cambiar la
predicción, deberíamos sustituirlo por la siguiente instrucción:
Esta instrucción cambia el comportamiento del predictor estático y hace que no se equivoque nunca,
con lo que con esta mejora la penalización se reduce a:
Con este resultado podemos concluir que este cambio nos reduce la penalización debida saltos mal
predichos en casi un 90%.
(1) lw r1, N
(2) add r2, r0, r0
(3) bucle: lw r3, X(r2)
(4) sgt r4, r3, r0
(5) bnz r4, mayor
(6) sub r3, r0, r3
(7) mayor: sw X(r2), r3
(8) add r2, r2, #4
(9) sub r1, r1, #1
(10) bnz r1, bucle
Si el procesador usa predictores dinámicos de dos bits que se inicializan con un predictor estático
que predice como tomados los saltos hacia atrás y como no tomados los saltos hacia delante, y que
la penalización en caso de errar la predicción es de 5 ciclos, ¿qué penalización se obtendrá si X (0)
= 1 y X (i+1) = 1 – X (i)? ¿Qué penalización se obtendría si se optimizara el código usando
sentencias de ejecución condicional?
Solución.
El programa del enunciado calcula el valor absoluto de los elementos del vector X. Va
procesándolos de uno en uno y les cambia el signo si no son positivos. Consta de dos saltos, el
primero de ellos, notado como S1 en el código de más abajo, sirve para detectar si los números son
positivos y el segundo, notado como S2, se emplea para volver a ejecutar el código mientras queden
elementos por procesar en el vector X.
(1) lw r1, N
(2) add r2, r0, r0
(3) bucle: lw r3, X(r2)
(4) sgt r4, r3, r0
(5) bnz r4, mayor S1
(6) sub r3, r0, r3
(7) mayor: sw X(r2), r3
(8) add r2, r2, #4
(9) sub r1, r1, #1
(10) bnz r1, bucle S2
Para mejorar las prestaciones en la ejecución de los saltos, el computador que se describe en el
enunciado usa un predictor dinámico de dos bits para cada uno de los saltos que se encuentre en el
programa. El esquema de este tipo de predictores es el siguiente:
N N N
S 1 1 0 0 N
1 0 1 0
S S S
Saltar Saltar No saltar No saltar
fuerte débil débil fuerte
Para cada salto, su predictor dinámico se inicializará según el predictor estático del computador, que
predice como tomados los saltos hacia atrás. Por tanto, el predictor dinámico para S1 se iniciará al
valor 00 (no saltar fuerte), ya que es un salto hacia delante, y el predictor dinámico para S2 se
iniciará al valor 11 (saltar fuerte) porque salta hacia atrás.
Una vez inicializados los predoctores dinámicos, la penalización que introduzca cada uno de ellos
dependerá del comportamiento de cada salto. En el caso de S1, su comportamiento está determinado
por el valor de cada elemento del vector X. S1 Saltará siempre que X(i) sea mayor que cero, y según
el enunciado, el vector X es de la forma X = {1, 0, 1, 0, 1, 0,…}, por lo que S1 saltará una vez sí y
otra no hasta que se termine de procesar el vector X. Por tanto, el comportamiento del predictor
dinámico para S1 viene explicado según la siguiente tabla:
Iteración 1 2 3 4 6 7 8 …
Valor de X 1 0 1 0 1 0 1 …
Estado actual 00 01 00 01 00 01 00 …
Predicción N N N N N N N …
Ejecución S N S N S N S …
Penalización P P P P …
Estado siguiente 01 00 01 00 01 00 01 …
N
PS1 5 ciclos
2
El salto S2 saltará tantas veces como elementos tenga el vector X, es decir N veces, ya que el
programa se dedica a procesar dicho vector. Teniendo esto en cuenta, el comportamiento del
predictor dinámico para S2 viene explicado según la siguiente tabla:
El comportamiento de este salto es muy fácil de predecir, ya que salta siempre excepto en la última
iteración del bucle, por lo que introduce una penalización de:
PS2 5 ciclos
Por tanto, teniendo en cuenta los dos predictores, la penalización total es de:
N
Ptotal 5 1 ciclos
2
Está claro que el comportamiento S1 no puede ser aprendido por el predictor dinámico, por lo que
nos va a ocasionar muchas faltas, así que sería interesante cambiarlo por una sentencia de ejecución
condicional, tal y como muestra el siguiente código:
(1) lw r1, N
(2) add r2, r0, r0
(3) bucle: lw r3, X(r2)
(4) sub r4, r0, r3
(5) cmov.gt r4, r3, r3
(7) sw X(r2), r4
(8) add r2, r2, #4
(9) sub r1, r1, #1
(10) bnz r1, bucle S2
En esta versión mantenemos el mismo número de instrucciones para ejecutar el algoritmo, y además
evitamos el salto S1, que depende del valor de cada componente de X, por lo que la penalización
total del programa es de:
El procesador utiliza un predictor de saltos dinámico de dos bits que se consulta en el momento de
captar las instrucciones, de forma que si la dirección de memoria de la que se está captando una
instrucción se encuentra en el BTB, y la predicción es saltar, guarda el contenido actual de PC y se
cambia por la dirección de destino del salto para que se empiece a captar desde ahí en el siguiente
ciclo. Cuando la instrucción de salto entra en el búfer de reordenamiento tras la decodificación, se
marca con un bit PRED=1 si el predictor decidió tomar el salto o PRED=0 en caso contrario.
Posteriormente, cuando se resuelve la condición del salto en la etapa de ejecución, se comprueba si
la predicción se realizó con éxito, y en caso contrario, se marcan con FLUSH=1 todas aquellas
instrucciones que se han introducido en el cauce de forma especulativa para que no actualicen los
registros al ser retiradas, y se fija PC al valor guardado en el momento de la predicción para
continuar con la siguiente instrucción en el siguiente ciclo. La primera vez que se capta un salto,
obviamente no se encuentra en el BTB, por lo que no se podrá predecir su comportamiento hasta la
etapa de decodificación, en la que se emplea un predictor estático que predice como tomados todos
los saltos hacia atrás y crea una entrada en el BTB para los saltos encontrados.
(a) Realice una traza de la ejecución del programa en el procesador. ¿Cuántos ciclos tarda en
ejecutarse el programa? (b) Estime la penalización (en ciclos) que se produce en el procesamiento
del salto tanto si acierta como si falla cada uno de los predictores (estático y dinámico) del
procesador. (c) ¿Cuántos ciclos de penalización en total se sufrirían si n1 fuera igual a 100 y n2
igual a 200?
(NOTA: Suponga que hay tantas unidades de ejecución y de acceso a memoria como sea necesario)
Solución.
A continuación se muestra una traza de ejecución del programa:
Instrucción 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
lw r1, n1 IF ID ISS EX EX ROB WB
lw r2, n2 IF ID ISS EX EX ROB WB
add r3, r0, r0 IF ID ISS EX ROB WB
add r3, r3, r2 IF ID ISS EX ROB WB
subi r1, r1, #1 IF ID ISS EX ROB WB
bnez r1, bucle IF ID ISS EX ROB WB
sw r3, n3 IF Flush Flush Flush Flush Flush WB*
trap #0 IF Flush Flush Flush Flush Flush WB*
add r3, r3, r2 IF ID ISS EX ROB WB
subi r1, r1, #1 IF ID ISS EX ROB WB
bnez r1, bucle IF ID ISS EX ROB WB
sw r3, n3 IF Flush Flush Flush Flush Flush WB*
add r3, r3, r2 IF ID ISS Flush Flush Flush WB*
subi r1, r1, #1 IF ID ISS Flush Flush Flush WB
bnez r1, bucle IF ID Flush Flush Flush Flush WB*
sw r3, n3 IF Flush Flush Flush Flush Flush WB*
add r3, r3, r2 IF Flush Flush Flush Flush Flush WB*
subi r1, r1, #1 IF Flush Flush Flush Flush Flush WB*
sw r3, n3 IF ID ISS EX ROB WB
trap #0 IF ID ISS EX ROB WB
Penalizaciones P P P P
En esta traza se muestran con flechas de color negro las dependencias de datos RAW que son
adelantadas por la lógica de bypass de procesador, con flechas verdes las predicciones hechas por
los predictores estático o dinámico, y con flechas rojas las correcciones de las predicciones falladas.
La primera vez que se capta el salto se usa el predictor estático, que no puede realizar la predicción
hasta que se decodifica la instrucción. Por tanto, se introduce una penalización de un ciclo, ya que
mientras que se decodifica el salto entran en el cauce las instrucciones sw y trap que se deben anular
en el momento en el que se predice que el salto se va a realizar (cuando se retiren en la etapa WB no
se modificarán los registros de la arquitectura, por eso se ha marcado esta etapa con un asterisco).
En la etapa de ejecución del salto se comprueba que la predicción ha sido correcta y se procede a la
inicialización del predictor dinámico creando una entrada en el BTB para estas instrucción de salto
con el estado 11 (saltar).
A partir de ahora, todas las veces que se capte el salto, se captará junto con la instrucción siguiente
(sw), ya que las instrucciones se captan de dos en dos. En la etapa de captación se consultará el
BTB y se descubrirá que la instrucción captada es un salto con una predicción de saltar, así que se
anulará la instrucción sw y se comenzará a captar en el ciclo siguiente por la instrucción de destino
del salto. En la mayoría de los casos, esta predicción acertaría, ya que se supone que un bucle va a
iterar bastantes veces. Sin embargo, en este problema el bucle sólo tiene que iterar n1=2 veces, así
que el predictor dinámico fallará. El procesador no se da cuenta del fallo de la predicción hasta que
el salto termina la etapa EX, en la que se calcula la condición del salto. En este momento se anulan
todas las instrucciones captadas especulativamente y se fija el contenido de PC a la instrucción del
camino secuencial. En total se pierden 3 ciclos.
Tras introducir las instrucciones sw y trap en el cauce, se sigue su ejecución hasta que se retiran en
el ciclo 16, momento en el que finaliza la ejecución del programa.
Por tanto, como el bucle itera n1 veces, la expresión general para calcular su penalización sería:
ya que la primera iteración se predice con el predictor estático y el resto con el dinámico, y los
predoctores acertarán en todas sus predicciones excepto en la última iteración, en la que el
productor dinámico predecirá saltar y fallará. En el caso que nos ocupa, como n1 = 2, obtenemos
una penalización de:
que coincide con la que se ha obtenido en la traza, y para el caso en el que n1 = 100, obtendríamos
exactamente la misma penalización, ya que en las iteraciones intermedias el predictor dinámico va a
acertar y no nos va a costar ningún ciclo:
Suponiendo una frecuencia de 2 GHz, que el cauce se encuentra inicialmente vacío, y que inicialmente
r2=100000, para la siguiente secuencia de instrucciones:
NOTAS:
La suma y la resta en coma flotante consumen dos ciclos de reloj y la multiplicación en coma
flotante cuatro ciclos. Considere que no hay limitaciones en la capacidad de los búferes y en el
número de unidades funcionales. Se supone que todos los registros tienen valores válidos previos.
La instrucción loop decrementa el registro y salta si el valor del registro es distinto de cero.
Solución.
Para responder al primer apartado es necesario tener en cuenta que el programa se ejecutará en un
procesador superescalar en el que se solaparán las iteraciones del bucle. Por tanto, una vez terminada
la primera iteración tras un tiempo TLI, el resto de iteraciones irán terminando cada MLM ciclos.
Para determinar estos dos parámetros es necesario desarrollar una traza de la ejecución del programa
en la que se tengan en cuenta las características del procesador. A continuación se simula la
ejecución del bucle haciendo tres iteraciones.
Instrucción 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
R
IS E E W
addd f1, f1, f6 IF ID O
S X X B
B
R
IS E E E E W
multd f6, f2, f5 IF ID O
S X X X X B
B
R
E E W
subd f5, f1, f3 IF ID O
X X B
B
R
IS E W
loop r2, bucle IF ID O
S X B
B
W
addd f7, f1, f5 IF X X X X X X
B
W
Sig. instrucción IF X X X X X X X
B
R
IS E E W
addd f1, f1, f6 IF ID O
S X X B
B
R
IS E E E E W
multd f6, f2, f5 IF ID O
S X X X X B
B
R
IS E E W
subd f5, f1, f3 IF ID O
S X X B
B
R
IS E W
loop r2, bucle IF ID O
S X B
B
R
IS E E W
addd f1, f1, f6 IF ID O
S X X B
B
R
IS E E E E W
multd f6, f2, f5 IF ID O
S X X X X B
B
R
IS E E W
subd f5, f1, f3 IF ID O
S X X B
B
R
IS E W
loop r2, bucle IF ID O
S X B
B
IS W
addd f1, f1, f6 IF ID X X X X X X X
S B
W
multd f6, f2, f5 IF ID X X X X X X X X
B
W
subd f5, f1, f3 IF ID X X X X X X X X
B
W
loop r2, bucle IF ID X X X X X X X X X
B
W
addd f1, f1, f6 IF X X X X X X X X X
B
W
multd f6, f2, f5 IF X X X X X X X X X X
B
R
IS E E W
addd f7, f1, f5 IF ID O
S X X B
B
10 4 4 3
A la hora de realizar esta traza tenemos que tener cuidado con los riesgos que ocurrirán en la ejecución del
programa:
Riesgos RAW entre datos dentro de una iteración y también entre iteraciones consecutivas (marcados
con flechas rojas),
Riesgos estructurales (marcados con flechas azules),
Riesgos de control al procesar el salto del bucle (marcados con flechas verdes).
La primera vez que se capta el salto no se puede usar el predictor dinámico porque no existe
ninguna entrada en el BTB del procesador para él. Por tanto, en la etapa de decodificación, una vez
que se identifique el salto, se incluirá una entrada en el BTB para que la siguiente vez que se capte
se pueda usar el predictor dinámico, se usará un predictor estático que predecirá saltar (el salto es
hacia atrás), y se anularán las dos instrucciones que se captaron erróneamente tras el salto. Teniendo
en cuenta las etapas del cauce, el predictor estático tendrá una penalización de 1 ciclo para los saltos
acertados.
A partir de la segunda iteración, cada vez que se capta el salto se usa el predictor dinámico, por lo
que no hay penalización en caso de acertar. Esto ocurrirá en el resto de iteraciones menos en la
última, en la que el predictor fallará y tendremos una penalización de 3 ciclos hasta captar la
siguiente instrucción al salto, ya que es en la etapa de ejecución en la que se comprueba la
corrección de la predicción. Una vez que se comprueba que falló la predicción, se anulan todas las
instrucciones captadas especulativamente y se comienza a captar desde la dirección correcta para
terminar la ejecución del programa.
Si nos fijamos en el instante de tiempo en el que se retira la última instrucción del bucle en cada
iteración, podemos comprobar que la primera iteración tarda en concluir un tiempo TLI = 10 ciclos,
que el resto de iteraciones terminan cada MLM = 4 ciclos, y que la última instrucción termina 3
ciclos después de la última iteración del bucle, por tanto para un bucle de n iteraciones tenemos:
Teniendo en cuenta que el registro r2 = 100000 y que la frecuencia de reloj es de 2 GHz, el tiempo
de ejecución es de:
4 105 9ciclos
)
T(100000 200microsegun
dos
2 109 cicloss
Y como el procesador puede completar hasta 2 instrucciones por ciclo, su velocidad pico es de:
9 ciclos 9
Rpico 2 instruccio
nes
ciclo 2 10 s 4 10
instruccio
nes
s
Solución.
Para responder a la primera pregunta es necesario entender el funcionamiento del programa, que
básicamente consiste en lo siguiente:
r3(i) = r3(i – 1) + X
r4(i) = 2 × r3(i)
r3(i) = i × X
r4(i) = 2 × i × X
Como el número de iteraciones del programa está controlado por el registro r1, que inicialmente se
fija al valor de la variable N, el valor final para R es de:
R = r4(N) = 2 × N × X
Teniendo en cuenta que las variables N y X están inicializadas al valor 3, podemos concluir que:
R = 2 × 3 × 3 = 18
Para responder a la siguiente cuestión es necesario realizar una traza de la ejecución del programa:
Instrucción 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
lw r1,N IF ID ISS EX EX ROB WB
lw r2,X IF ID ISS EX EX ROB WB
add r3,r0,r0 IF ID ISS EX ROB WB
add r3,r3,r2 IF ID ISS EX ROB WB
add r4,r3,r3 IF ID ISS EX ROB WB
subi r1,r1,#1 IF ID ISS EX ROB WB
bnez r1,bucle IF ID ISS EX ROB WB
sw R,r4 IF ID X X X X X X
trap #0 IF X X X X X X
Sig. instrucción IF X X X X X X
Sig. instrucción IF X X X X X X
Sig. instrucción IF X X X X X X
add r3,r3,r2 IF ID ISS EX ROB WB
add r4,r3,r3 IF ID ISS EX ROB WB
subi r1,r1,#1 IF ID ISS EX ROB WB
bnez r1,bucle IF ID ISS EX ROB WB
add r3,r3,r2 IF ID ISS EX ROB WB
add r4,r3,r3 IF ID ISS EX ROB WB
subi r1,r1,#1 IF ID ISS EX ROB WB
bnez r1,bucle IF ID ISS EX ROB WB
add r3,r3,r2 IF ID ISS EX X X
add r4,r3,r3 IF ID ISS X X
subi r1,r1,#1 IF ID ISS EX X X
bnez r1,bucle IF ID ISS X X
add r3,r3,r2 IF ID ISS X X
add r4,r3,r3 IF ID X X
subi r1,r1,#1 IF ID ISS X X
bnez r1,bucle IF ID X X
add r3,r3,r2 IF ID X X
add r4,r3,r3 IF ID X X
subi r1,r1,#1 IF ID X X
bnez r1,bucle IF ID X X
add r3,r3,r2 IF X X
add r4,r3,r3 IF X X
subi r1,r1,#1 IF X X
bnez r1,bucle IF X X
sw R,r4 IF ID ISS EX EX ROB WB
trap #0 IF ID ISS EX ROB WB
Penalización P P P P P
Por último, para calcular el tiempo de ejecución para N iteraciones hay que tener en cuenta que
transcurren 9 ciclos hasta que se termina la primera iteración, que cada iteración termina un ciclo
después de la anterior, y que tras la última iteración hay que añadir 5 ciclos para almacenar el
resultado final, es decir, que el tiempo para ejecutar N iteraciones se puede calcular mediante las
expresión:
T(N) = 9 + (N – 1) + 5 = 13 + N
Por tanto, para ejecutar N = 500 iteraciones serían necesarios 513 ciclos.
Al intentar cargar la variable X, se produce un fallo de página porque dicha variable no se encuentra
ni en la cache ni en memoria principal. Dicho fallo se detecta en el ciclo 2 de la ejecución de la
instrucción ld, cuando se consulta la tabla de páginas de SO. En ese momento, se genera una
excepción para indicar el problema.
Solución.
Hasta que se produce la excepción, el cauce va evolucionando normalmente, de forma que en el
momento en el que no se encuentra la página está en el siguiente estado:
Instrucción / ciclo 1 2 3 4
multd f4, f1, f2 IF ID/ISS EX EX
ld f5, X(r3) IF ID/ISS EX EX
addd f2, f3, f1 IF ID/ISS EX
Excepción
addd f3, f4, f2 IF ID/ISS
subd f2, f3, f5 IF ID/ISS
En el ciclo 4 se han emitido todas las instrucciones, pero no ha finalizado ninguna, por tanto, el
búfer de reordenamiento tendrá el siguiente contenido:
# codop Nº Inst. Reg. Dest. Unidad Resultado ok marca ‘ready’ excep flush
1 MULT 1 4 float_mult - 0 x 7 0 0
2 LD 2 5 load - 0 x 6 1 1
3 ADD 3 2 float_add - 0 x 5 0 1
4 ADD 4 3 float_add - 0 i 0 1
5 SUB 5 2 float_add - 0 i 0 1
Al producirse la excepción, se marca la instrucción load y se anula junto con todas las posteriores,
ya que en un cauce secuencial no deberían haberse introducido en el procesador hasta que se
hubiera ejecutado la rutina de servicio de interrupción que debe traer a memoria la página que
contiene el dato que la instrucción load necesita. En este momento se dejan de captar instrucciones
y se continúa la ejecución de las instrucciones que hay en el cauce hasta que la instrucción que ha
provocado la excepción alcance el tope del búfer de reordenamiento. En el ciclo 9, tras retirar esta
instrucción, se salvará la dirección de la instrucción load para poder reiniciar la ejecución del
programa una vez se haya traído la página a memoria, y se comenzará a captar instrucciones de la
Rutina de Servicio de Interrupción (RSI), suponiendo que no hay ningún retardo para obtener la su
dirección:
Instrucción / ciclo 1 2 3 4 5 6 7 8 9 10
multd f4, f1, f2 IF ID/ISS EX EX EX EX ROB WB
ld f5, X(r3) IF ID/ISS EX EX WB
addd f2, f3, f1 IF ID/ISS EX WB
addd f3, f4, f2 IF ID/ISS WB
subd f2, f3, f5 IF ID/ISS WB
1ª instr. RSI IF ID/ISS
2ª instr. RSI IF ID/ISS
3ª instr. RSI IF
4ª instr. RSI IF
Las instrucciones descartadas dejan de ejecutarse y se retiran en cuanto alcanzan el tope del búfer
de reordenamiento sin modificar los registros de la máquina. Como la RSI tarda 237 ciclos, habrá
terminado en el ciclo 245. Su última instrucción será un retorno de interrupción, que modifica el
registro PC con la dirección previamente guardada, así que en el ciclo 246 se volverá a captar a
partir de la instrucción load, que ahora no cometerá la excepción porque el dato que quiere leer ya
está en memoria.
Instrucción / ciclo 246 247 248 249 250 251 252 253
ld f5, X(r3) IF ID/ISS EX EX EX ROB WB
addd f2, f3, f1 IF ID/ISS EX ROB WB
addd f3, f4, f2 IF ID/ISS EX ROB WB
subd f2, f3, f5 IF ID/ISS EX ROB WB
Al final, el programa tarda en ejecutarse 253 ciclos.
Solución.
Para obtener el contenido del ROB en el instante de la excepción, tendremos que simular la
ejecución del programa hasta dicho momento, sabiendo que las instrucciones se introducen en el
ROB en su emisión, que se actualizan sus resultados cuando la unidad de ejecución finaliza, y que
se retiran del ROB ordenadamente. La traza de ejecución del programa es la siguiente:
Instrucción 1 2 3 4 5 6 7 8 9 10 11 12 13
addi r2, r0, r0 IF ID/ISS EX ROB WB
lw r3, n IF ID/ISS EX EX ROB WB
slli r4, r3, #2 IF ID/ISS EX ROB WB
lf f0, x(r2) IF ID/ISS EX EX ROB WB
lf f1, y(r2) IF ID/ISS EX EX ROB WB
divf f2, f0, f1 IF ID/ISS EX EX EX EX ROB WB
sf f2, z(r2) IF ID/ISS EX ROB WB
addui r2, r2, #4 IF ID/ISS EX ROB WB
sub r5, r4, r2 IF ID/ISS EX ROB
bnez r5, inicio IF ID/ISS EX ROB
trap #0 IF ID/ISS XXX
Sig. instrucción IF ID/ISS XXX
Sig. instrucción IF ID/ISS XXX
Sig. instrucción IF ID/ISS XXX
Sig. instrucción IF XXX
Sig. instrucción IF XXX
lf f0, x(r2) IF ID/ISS EX EX ROB
lf f1, y(r2) IF ID/ISS EX EX ROB
divf f2, f0, f1 IF ID/ISS EX
sf f2, z(r2) IF ID/ISS
addui r2, r2, #4 IF ID/ISS
sub r5, r4, r2 IF ID/ISS
bnez r5, inicio IF ID/ISS
trap #0 IF ID/ISS
Sig. instrucción IF
Sig. instrucción IF
Esta gráfica muestra que la excepción de división por cero se produciría en el ciclo 13. También se
puede apreciar cómo tras el salto se introducen en el cauce seis instrucciones de forma errónea (el
predictor se equivoca). Como no sabemos qué instrucciones puede haber tras la instrucción trap, ni
sus operandos, lo único que podemos asegurar es que se van a captar y a decodificar/emitir, pero no
sabemos si llegarán a ejecutarse o se quedarán en las estaciones de reserva, ya que no conocemos
sus operandos. Hemos supuesto que no se llegan a enviar a las unidades de ejecución, en cualquier
caso, una vez resuelto el salto en el ciclo 9, se abortan y se comienza a captar a partir de la dirección
de inicio del bucle.
En el ciclo 13 ya se han retirado las primeras 8 instrucciones del programa, así que el contenido del
ROB es el siguiente:
Se puede comprobar cómo las instrucciones que fueron captadas erróneamente tras el salto se han
marcado con flush = 1 para ser descartadas, al igual que la instrucción DIV y las siguientes, que se
deben descartar porque se ha producido una excepción. A partir del ciclo 14 se comenzarán a captar
instrucciones de la rutina de servicio de la interrupción mientras se van retirando las instrucciones
que quedan en el ROB. Las únicas instrucciones que modificarán el estado de la máquina (de
manera ordenada) serán la resta y el salto (instrucciones 9 y 10), y los dos loads (instrucciones 4 y
5).