Está en la página 1de 8

Arquitectura e Ingenierı́a de Computadores - 3er Curso. Sol.

del Examen 1er parcial 7/11/2022


Responde cada pregunta en una hoja distinta. Tiempo disponible: 2h30m

1. (2,5 puntos) La máxima aceleración alcanzable en un sistema que ejecuta un programa parcialmente
paralelizable es 5. El código del programa que no puede ejecutarse en paralelo, se ejecuta de manera
secuencial.

a) ¿Cuál es la fracción del tiempo de ejecución del programa que el sistema ejecuta código paraleliza-
ble? Expresa la fracción de tiempo solicitada como un porcentaje.
b) ¿Cuál será la aceleración que el sistema alcanzará cuando disponga de 4 núcleos y la ejecución del
código paralelizable se distribuya homogéneamente entre todos los núcleos disponibles? Asume que
el sistema integraba originalmente un procesador mono-núcleo y expresa la aceleración resultante
en porcentaje.
c) Cuando el sistema dispone de 4 núcleos, el programa considerado se ejecuta en 20 minutos. ¿Cuánto
tardará en ejecutarse cuando sólo disponga de un sólo núcleo de caracterı́sticas similares?
d) ¿Cuál será la fracción del tiempo de ejecución que el sistema con 4 núcleos empleará el código
paralelizable del programa?
e) El programa dedica la mitad del tiempo de ejecución de su código secuencial a ejecutar instruc-
ciones que un compilador alternativo puede llegar a optimizar utilizando planificación estática de
instrucciones. Si el sistema con 4 núcleos incrementa su frecuencia en un 5 % y el compilador alter-
nativo logra reducir el tiempo de ejecución del código secuencial optimizable en un 20 % , ¿cuál
es el máximo incremento del precio de estas dos modificaciones (frecuencia y compilador) con
respecto al sistema con 4 núcleos, desde una perspectiva de coste-prestaciones?

Justifica tu respuesta en todas las preguntas.

Solución:

a) ¿Cuál es la fracción del tiempo de ejecución del programa que el sistema ejecuta código
paralelizable? Expresa la fracción de tiempo solicitada como un porcentaje.
1
5 = 1−F → F = 0,8 → 80 %
b) ¿Cuál será la aceleración que el sistema alcanzará cuando disponga de 4 núcleos y la
ejecución del código paralelizable se distribuya homogéneamente entre todos los núcleos
disponibles? Asume que el sistema integraba originalmente un procesador mono-núcleo
y expresa la aceleración resultante en porcentaje.
S = 0,2+1 0,8 = 2,5 → S = 150 %
4

c) Cuando el sistema dispone de 4 núcleos, el programa considerado se ejecuta en 20 minu-


tos. ¿Cuánto tardará en ejecutarse cuando sólo disponga de un sólo núcleo de caracterı́sti-
cas similares?
Tex = 20 ∗ 2,5 = 50min.
d) ¿Cuál será la fracción del tiempo de ejecución que el sistema con 4 núcleos empleará el
código paralelizable del programa?
El 80 % se convierte en 20 % cuando utilizamos 4 núcleos. Un 20 % adicional es la frac-
ción del tiempo dedicado a la ejecución de código secuencial, el cual no se ve afectado
por la mejora. Como resultado:
20 %
F4−nucleos = 20 %+20 %
= 50 %
El 50 % es la fracción del tiempo de ejecución del programa dedicado a la ejecución de
código paralelo en el procesador con 4 núcleos.
e) El programa dedica la mitad del tiempo de ejecución de su código secuencial a ejecutar
instrucciones que un compilador alternativo puede llegar a optimizar utilizando planifi-
cación estática de instrucciones. Si el sistema con 4 núcleos incrementa su frecuencia en
un 5 % y el compilador alternativo logra reducir el tiempo de ejecución del código se-
cuencial optimizable en un 20 % , ¿cuál es el máximo incremento del precio de estas dos
modificaciones (frecuencia y compilador) con respecto al sistema con 4 núcleos, desde
una perspectiva de coste-prestaciones?
Respecto al procesador con 4 núcleos, la aceleración local es Sf req = 1,05, que afecta a
todas las fracciones de ejecución, y Scompiler = 1,25, afecta solamente al 50 % del tiempo
que el procesador ejecuta código secuencial. Relacionando las fracciones de tiempo de
ejecución Fseq = 0,5, Fpar = 0,5, la fracción del tiempo mejorado por el compilador
será 50 % del 50 %, p.ej. Fseqoptimized = 0,25. Por tanto, el incremento máximo del cos-
te que interesa pagar estará directamente relacionado con la aceleración obtenida en el
procesador por las dos mejoras:
1
Smodif −wrt−4cores = 0,25 + 0,25 + 0,5
= 1,1052 → 10,52 %
1,05 1,25∗1,05 1,05

******************************
Otra forma de resolver el ejercicio es calcular la aceleración del procesador con respecto
al original. En este caso, la aceleración local es Sf req = 1,05 que afecta a todas las
fracciones de ejecución, y Scompiler = 1,25 que afecta solamenta al 50 % del tiempo
que el procesador ejecuta código secuencial, y Scores = 4 que afecta a la fracción del
tiempo de ejecución dedicado a código paralelo. Las fracciones de tiempo en este caso
son: Fpar = 0,8 y Fseq = 0,2, donde Fseqoptimized = 0,1 y Fseqnon−optimized = 0,1. Por lo
tanto:
Smodif −wrt−1core = 0,1 + 0,11 + 0,8 = 2,7632
1,05 1,05∗1,25 1,05∗4

Teniendo en cuenta:
Smodif −wrt−1core = S4cores−wrt−1core ∗ Smodif −wrt−4cores
y teniendo en cuenta S4cores−wrt−1core = 2,5, tenemos:
Smodif −wrt−1core
Smodif −wrt−4cores = S4cores−wrt−1core = 2,7632
2,5
= 1,1052 → 10,52 %

2. (2,5 puntos) Disponemos de un sistema con un procesador MIPS que funciona a 2 GHz, segmentado
en 5 etapas (IF,ID,EX,ME,WB). Los riesgos de datos se resuelven mediante cortocircuitos, insertando
ciclos de parada en la fase ID en caso necesario, mientras que los de control se resuelven mediante
predict-not-taken, calculando la condición, la dirección y escribiendo el PC en la fase ID.
Las estadı́sticas de los tipos de instrucciones al ejecutar un programa P son las siguientes:

Operación %
ALU 50 %
Carga 20 %
Almacenamiento 10 %
Saltos 20 %

El programa P ejecuta 100 × 106 instrucciones con un CPI de 1 salvo por los ciclos de parada. Durante
su ejecución, un 20 % de las instrucciones ALU y un 30 % de las instrucciones de salto necesitan que se
inserte un ciclo de parada para resolver los riesgos de datos con una instrucción anterior. Las estadı́sticas
obtenidas también indican que el 70 % de los saltos son efectivos.
Se pretende evaluar la conveniencia de añadir una nueva instrucción de salto LOOP para el control de
bucles. Dichas instrucciones de salto permitirı́an al compilador sustituir el siguiente tipo de secuencias:
loop: loop:
... ...

DADD R1, R1, -1


BNEZ R1, loop --> LOOP r1, loop
Analizando el programa P se determina que, de todas las instrucciones de salto, un total del 30 % forman
parte de una secuencia que se puede sustituir por una de las nuevas instrucciones LOOP.
Sin embargo, la nueva ruta de datos calcula la condición de todas las instrucciones de salto condicional
(incluyendo las nuevas instrucciones LOOP) y escribe el PC en la fase EX, aumentando ası́ su latencia al
aplicar la técnica de predict-not-taken. En cambio, en la nueva versión del programa P, sólo el 12 % de
las instrucciones de salto convencionales (las no sustituidas) introducirán un ciclo de parada por riesgos
de datos, mientras que las nuevas instrucciones de salto LOOP no introducen ciclos de parada por riesgos
de datos. Los saltos siguen siendo efectivos en el 70 % de los casos.
Se solicita, justificando la respuesta con el máximo detalle:

a) Calcular el CPI y el tiempo de ejecución (en segundos) en el MIPS original para el programa P.
b) Calcular el nuevo número de instrucciones, con respecto a las instrucciones originales, que ejecutará
el programa P si se utilizan las nuevas instrucciones LOOP.
c) Calcular la nueva distribución de instrucciones del programa P al incorporar las instrucciones LOOP.
d) Considerando que el porcentaje de instrucciones ALU que introducen un ciclo de parada por riesgos
de datos aumenta a un 25 % de los casos, calcular el nuevo CPI del programa P.
e) Calcular el tiempo de ejecución (en segundos) del programa P al utilizar las nuevas instrucciones
de control de bucles LOOP. ¿Es interesante la modificación propuesta?

Solución:

a) Calcular el CPI y el tiempo de ejecución (en segundos) en el MIPS original para el pro-
grama P.

CP I = 1 + c.p.datos + c.p.control

CP I = 1 + 0,5 × 0,2 × 1 + 0,2 × 0,3 × 1 + 0,2 × 0,7 × 1


| {z } | {z } | {z }
c.p. datos ALU c.p. datos saltos c.p. control pnt

CP I = 1 + 0,1 + 0,06 + 0,14 = 1,3 ciclos/instr


Siendo I = 100 × 106 instr y fcpu = 2 GHz → T = 0,5 ns/ciclo:

Tej = I × CP I × T = 100 × 106 × 1,3 × 0,5 ns = 65 ms


b) Calcular el nuevo número de instrucciones, con respecto a las instrucciones originales,
que ejecutará el programa P si se utilizan las nuevas instrucciones LOOP.

I 0 = I × (1 − 0,2 × 0,3 × 1 ) = I × (1 − 0,06) = 0,94 × I


| {z }
dadd + bnez → loop

c) Calcula la nueva distribución de instrucciones del programa P al incorporar las instruc-


ciones de control de bucles.
Operación #
ALU 0,5 − 0,2 × 0,3 × 1 = 0,5 − 0,06 0,44
Carga 0,2
Almacenamiento 0,1
Saltos 0,2 × 0,7 0,14
Loop 0,2 × 0,3 0,06
0,94
d) Considerando que el porcentaje de instrucciones ALU que introducen un ciclo de parada
por riesgos de datos aumenta a un 25 % de los casos, calcular el nuevo CPI del programa
P.
c.p. datos ALU c.p. datos saltos normales c.p. control
z }| { z }| { z }| {
0,44 × 0,25 × 1 + 0,14 × 0,12 × 1 + 0,2 × 0,7 × 2
CP I 0 = 1 +
0,94
0,11 + 0,0168 + 0,28
CP I 0 = 1 +
0,94
0,4068 0,94 + 0,4068 1,3468
CP I 0 = 1 + = = = 1,4328
0,94 0,94 0,94
e) Calcular el tiempo de ejecución (en segundos) del programa P al utilizar las nuevas ins-
trucciones de control de bucles. ¿Es interesante la modificación propuesta?
1,3468
Tej0 = I 0 × CP I 0 × T = 0,94 × 100 × 106 × × 0,5 ns = 67,34 ms
0,94
La modificación no resulta interesante.

3. (3 puntos) Disponemos de un procesador MIPS con los siguientes operadores multiciclo segmentados:

Operador de Suma/Resta en coma flotante, con latencia L = 3


Operador de multiplicación en coma flotante, con latencia L = 5
Operador de conversión de tipos de datos, con latencia L = 3

El procesador ejecuta el siguiente código, obteniendo el diagrama instrucciones/ciclo mostrado al final


del examen, incluyendo la parte inicial del código y la primera iteración del bucle:

.data
A: .double 4.1
B: .dword 2, 4, 5, -1, -3, 0, 4, -1
R: .double 0.0
N: .word 8

.text
1) l.d $f0, A($gp)
2) dadd $t1, $gp, B
3) lw $t2, N($gp)
4) l.d $f6, R($gp)
5) loop: l.d $f2, 0($t1)
6) cvt.d.w $f2, $f2 ; $f2 = conv_word_a_double($f2)
7) mul.d $f4, $f2, $f0
8) mul.d $f4, $f4, $f4
9) add.d $f6, $f6, $f4
10) daddi $t1, $t1, 8
11) daddi $t2, $t2, -1
12) bnez $t2, loop
13) s.d $f6, R($gp)
.end
Responde a las siguientes preguntas:

a) Identifica todos los cortocircuitos que se aplican en el diagrama, indicando para cada uno de ellos
el ciclo en el que se aplica, las instrucciones implicadas, las etapas del procesador (nombre del
cortocircuito) asi como el registro involucrado.
b) Calcula el CPI de una iteración intermedia del bucle.
c) Indica la técnica de resolución de conflictos de control utilizada en el procesador y la latencia de
salto. Justifica tu respuesta.
d) Indica porqué en el ciclo 25 pueden haber dos instrucciones accediendo a la etapa WB. Justifica tu
respuesta.
e) Si utilizamos la técnica de loop unrolling, indica cuantas iteraciones mı́nimas del bucle hay que
desenrollar para eliminar todos los conflictos de datos. Justifica tu respuesta.
f) Indica en cuantos ciclos se reducirı́a la ejecución de una iteración intermedia si sustituimos el ope-
rador de multiplicación por un nuevo operador no segmentado con latencia L = 2. Justifica tu
respuesta.

Solución:

a) Identifica todos los cortocircuitos que se aplican en el diagrama, indicando para cada uno
de ellos el ciclo en el que se aplica, las instrucciones implicadas, las etapas del procesador
(nombre del cortocircuito) asi como el registro involucrado.
Ciclo 9, etapas WB y C1, entre instrucciones 5 y 6 por el registro $f2
Ciclo 12, etapas WB y M1, entre instrucciones 6 y 7 por el registro $f2
Ciclo 17, etapas WB y M1, entre instrucciones 7 y 8 por el registro $f4
Ciclo 22, etapas WB y A1, entre instrucciones 8 y 9 por el registro $f4
Ciclo 25, etapas ME e ID, entre instrucciones 11 y 12 por el registro $t2
b) Calcula el CPI de una iteración intermedia del bucle. Una iteración intermedia se inicia
en el diagrama en el ciclo 5 y termina en el ciclo 25, por tanto, tiene una duración de
21 ciclos. En dicha iteración se ejecutan 8 instrucciones. Por tanto, el CPI lo podemos
calcular como: CP I = 21 8
= 2,625
c) Indica la técnica de resolución de conflictos de control utilizada en el procesador y la
latencia de salto. Justifica tu respuesta.
Resolución de conflictos de control mediante predict-not-taken, con latencia de salto 1.
En el diagrama vemos claramente que la siguiente instrucción a la instrucción de salto
se ha leido y posteriormente se cancela. Por tanto, se ha utilizado un predictor de saltos
estático not-taken. La latencia de salto es 1 ya que solamente se cancela una instrucción.
Alternativamente podemos asumir la utilización de un predictor dinámico BPB o BTB
donde se realiza la predicción de no salto.
d) Indica porqué en el ciclo 25 pueden haber dos instrucciones accediendo a la etapa WB.
Justifica tu respuesta.
Las dos instrucciones escriben en bancos de registros distintos (la instrucción 9 en el
banco de registros de coma flotante y la instrucción 10 en el banco de registros de enteros).
Por tanto, al ser dos estructuras distintas no existe conflicto estructural.
e) Si utilizamos la técnica de loop unrolling, indica cuál es el mı́nimo número de iteraciones
del bucle a desenrollar para eliminar todos los conflictos de datos. Justifica tu respuesta.
Debemos desenrollar cinco iteraciones para poder eliminar todos los conflictos de datos,
debido a que tenemos cuatro ciclos de parada entre la instrucción 8 y 9. Debemos interca-
lar cuatro instrucciones entre ambas instrucciones y esto lo obtenemos al desenrollar en
un factor de 5.
f) Indica en cuantos ciclos se reducirı́a la ejecución de una iteración intermedia si sustitui-
mos el operador de multiplicación por un nuevo operador segmentado con latencia L = 2.
Justifica tu respuesta.
Al reducir la latencia del operador de 5 a 2 ciclos, reducimos los ciclos de parada entre
las instrucciones 7 y 8 de 4 ciclos a 1 ciclo, ası́ como reducimos ciclos de parada entre las
instrucciones 8 y 9 de 4 ciclos a 1 ciclo. Por tanto, ahorramos 6 ciclos por iteración. El
tiempo de ejecución de una iteración es ahora de 15 ciclos.
Instrucción 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
1) l.d $f0, A($gp) IF ID EX ME WB
2) dadd $t1, $gp, B IF ID EX ME WB
3) lw $t2, N($gp) IF ID EX ME WB
4) l.d $f6, R($gp) IF ID EX ME WB
5)loop: l.d $f2, 0($t1) IF ID EX ME WB
6) cvt d.w $f2, $f2 IF id ID C1 C2 C3 WB
7) mul.d $f4, $f2, $f0 if IF id id ID M1 M2 WB
8) mul.d $f4, $f4, $f4 if IF id ID M1 M2 WB
9) add.d $f6, $f6, $f4 if IF id ID A1 A2 A3 WB
10) daddi $t1, $t1, 8 if IF ID EX ME WB
11) daddi $t2, $t2, -1 IF ID EX ME WB
12) bnez $t2, loop IF id ID EX ME WB
13) s.d $f6, R($gp) if IF X
6)loop: l.d $f2, 0($t1) IF ID EX ME WB

4. (2,0 puntos) Un procesador implementa un predictor BPB de 3 bits con saturación. En dicho procesador
se ejecuta un código que incluye dos bucles anidados; la instrucción de salto del bucle externo con PC=
0x0100 144C que se repite 100 veces y controlado por la variable j, y la instrucción de salto del interno
con PC 0x0100 044C que se repite 1000 veces y se encuentra controlado por la variable i. La tabla del
predictor consta de 1024 entradas de 3 bits.
Se pide:

a) Dibuja la máquina de estados del predictor. Para dibujarla SOLO puedes utilizar cı́rculos para
representar los estados y flechas para las transiciones. Dentro del cı́rculo deberá incluirse un valor
binario de tres bits para indicar el valor del estado (o contador binario). Las flechas solo pueden
etiquetarse con T (salta) o NT (no salta) según corresponda.
b) ¿Qué bits del PC (31 − 0) utilizarı́as para indexar la tabla y porqué sabiendo que las dirección de
las instrucciones en el MIPS 32 es siempre múltiplo de 4 y los bits de menor peso son cero?
c) En caso de que las dos instrucciones de salto compartan entrada (aliasing) en la tabla del predictor,
¿cuál deberı́a ser el número mı́nimo de entradas de la tabla para evitar el aliasing? ¿qué bits del PC
utilizarı́as para indexar la nueva tabla del predictor? Justifica tu respuesta.
d) Asumiendo que las dos instrucciones de salto comparten entrada en la tabla y su estado antes de
empezar el bucle es 000, cuando se ejecuta por segunda vez la instrucción de salto del bucle externo
(j=2):
1) ¿Qué valor (estado) encontrará en la tabla la instrucción de salto externo, cuál será el valor de
la predicción, y qué valor dejará?
2) Tras ello, y para j=2, ¿cuáles serán los valores encontrará la instrucción de salto interno cuando
acceda a la tabla para realizar la predicción durante todas sus iteraciones desde la i=1 hasta
i=1000?
3) Desde el punto de vista de la precisión al predecir la instrucción de salto del bucle externo,
razona si perjudica o beneficia el hecho de que los dos saltos compartan entrada.

Solución:

a) Dibuja la máquina de estados del predictor.


b) ¿Qué bits del PC (31 − 0) utilizarı́as?
Hacen falta 10 bits, como el 0 y el 1 son siempre cero, deben utilizarse del 2 al 11.
c) Las dos instrucciones de salto comparten entrada en la tabla, puesto que los bits del 2 al
11 coinciden en ambos PCs. El bit 12 ya cambia, es 1 para el predictor externo y 0 para
el interno. Deberı́an utilizarse 11 bits, del 2 al 12 para evitar los alias, por lo que la tabla
serı́a de 2048 entradas de 3 bits.
d) Asumiendo que las dos instrucciones de salto comparten entrada en la tabla y su estado
antes de empezar el bucle es 000, cuando se ejecuta por segunda vez la instrucción de
salto del bucle externo (j=2):
1) ¿Qué valor (estado) encontrará en la tabla la instrucción de salto externo, cuál será el
valor de la predicción, y qué valor dejará?
El predictor externo ve un 6 ya que la última vez que se ejecuta el salto interno
falla y lo decrementa de 7 a 6. Como ve un 6, la predicción es saltar. Como acierta,
incrementa el contador y lo deja en 7.
2) Tras ello, y para j=2, ¿cuáles serán los valores encontrará la instrucción de salto in-
terno cuando acceda a la tabla para realizar la predicción durante todas sus iteraciones
desde la i=1 hasta i=1000?
Como el predictor externo lo ha dejado en 7, y el salto interno siempre salta, excepto
en su última iteración, siempre acierta en su predicción. Al acertar, se queda en el
estado 7 (saturación), y siempre verá un 7. Como consecuencia de fallar en la última
iteración, decrementa el valor de 7 a 6, y se sale del bucle.
3) Razona si perjudica o beneficia el hecho de compartir entrada.
Beneficia, puesto que si no se comparte entrada, las 4 primeras iteraciones (en las que el
salto es efectivo) se predicen incorrectamente, puesto que el valor del estado va aumen-
tando progresivamente, pasando por 0,1,2,3 (en los que la predicción es ”no salta”). A
partir del valor 4 ya se predice correctamente como ”salta”.
Diagrama de instrucciones/ciclo del enunciado de la pregunta 3:

Instrucción 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 29 30
1) l.d $f0, A($gp) IF ID EX ME WB
2) dadd $t1, $gp, B IF ID EX ME WB
3) lw $t2, N($gp) IF ID EX ME WB
4) l.d $f6, R($gp) IF ID EX ME WB
5)loop: l.d $f2, 0($t1) IF ID EX ME WB
6) cvt d.w $f2, $f2 IF id ID C1 C2 C3 WB
7) mul.d $f4, $f2, $f0 if IF id id ID M1 M2 M3 M4 M5 WB
8) mul.d $f4, $f4, $f4 if IF id id id id ID M1 M2 M3 M4 M5 WB
9) add.d $f6, $f6, $f4 if if if if IF id id id id ID A1 A2 A3 WB
10) daddi $t1, $t1, 8 if if if if IF ID EX ME WB
11) daddi $t2, $t2, -1 IF ID EX ME WB
12) bnez $t2, loop IF id ID EX ME WB
13) s.d $f6, R($gp) if IF X
6)loop: l.d $f2, 0($t1) IF ID EX ME WB

También podría gustarte