Memoria Práctica de Ingeniería de Computadores II
Memoria Práctica de Ingeniería de Computadores II
Memoria Práctica de Ingeniería de Computadores II
Apartado b
En la siguiente tabla se resumen algunos de los valores necesarios para la resolución de este apartado:
DETENCIONES CICLO
INSTRUCCIÓN Nº IF ID EX MEM WB INICIO FINAL TOTAL
Todo lo anterior y algunos datos más son recogidos de manera gráfica en la siguiente imagen capturada
del simulador WinDLX:
Apartado c
La programación de este apartado se encuentra en el listado del Apéndice B y en el fichero
BUCLE_C.S entregado junto a la práctica.
Como tamaño del problema, se ha elegido usar dos vectores de 99 elementos cada uno.
La siguiente tabla, resume parte de las estadísticas generadas por WinDLX para ambos códigos:
BUCLE.S BUCLE_C.S
CICLOS DE RELOJ DEL PROGRAMA 1592 1196
NUMERO DE INSTRUCCIONES 896 632
En ella se aprecia como el nuevo código desenrollado mejora significativamente al código original.
Esto es así porque el desenrollamiento ha permitido que el número de iteraciones necesarias para
recorrer el bucle se haya dividido por tres y el total de instrucciones ejecutadas sea inferior ya que se han
eliminado 8 instrucciones por cada iteración del bucle desenrollado:
La aceleración (speedUp), al introducir una mejora, viene dada por la siguiente ecuación:
Puesto que ambos programas se ejecutan sobre el mismo procesador, la ecuación fina queda como:
Por tanto, se propone la eliminación del máximo de dependencias que hubiese en el código del apartado
c, reordenando el código significativamente. Las dependencias a eliminar se pueden observar en la
siguiente imagen:
Esta reorganización da lugar a la creación del listado del Apéndice D y el fichero BUCLE_D_OP2.S.
Ahora se observa como esta nueva planificación es mucho más eficiente, consiguiendo una aceleración
de:
Es importante darse cuenta de que esta reorganización de código, se hace manteniendo la semántica
original del programa, es decir, el orden de las lecturas y las escrituras de los registros y la memoria. Para
demostrar esto se puede recurrir a ver el estado de la memoria una vez finalizado el programa y
compararla con la del programa original:
Por tanto, la siguiente tabla, resume los CPI medios que se obtienen en cada iteración del bucle en los
apartados (a), (c), (d) y otros datos relacionados que dan una idea global de todo el desarrollo anterior:
.data
.align 2
x: .double 1.00, 1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09
.double 1.10, 1.11, 1.12, 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19
.double 1.20, 1.21, 1.22, 1.23, 1.24, 1.25, 1.26, 1.27, 1.28, 1.29
.double 1.30, 1.31, 1.32, 1.33, 1.34, 1.35, 1.36, 1.37, 1.38, 1.39
.double 1.40, 1.41, 1.42, 1.43, 1.44, 1.45, 1.46, 1.47, 1.48, 1.49
.double 1.50, 1.51, 1.52, 1.53, 1.54, 1.55, 1.56, 1.57, 1.58, 1.59
.double 1.60, 1.61, 1.62, 1.63, 1.64, 1.65, 1.66, 1.67, 1.68, 1.69
.double 1.70, 1.71, 1.72, 1.73, 1.74, 1.75, 1.76, 1.77, 1.78, 1.79
.double 1.80, 1.81, 1.82, 1.83, 1.84, 1.85, 1.86, 1.87, 1.88, 1.89
.double 1.90, 1.91, 1.92, 1.93, 1.94, 1.95, 1.96, 1.97, 1.98
y: .double 2.00, 2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09
.double 2.10, 2.11, 2.12, 2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19
.double 2.20, 2.21, 2.22, 2.23, 2.24, 2.25, 2.26, 2.27, 2.28, 2.29
.double 2.30, 2.31, 2.32, 2.33, 2.34, 2.35, 2.36, 2.37, 2.38, 2.39
.double 2.40, 2.41, 2.42, 2.43, 2.44, 2.45, 2.46, 2.47, 2.48, 2.49
.double 2.50, 2.51, 2.52, 2.53, 2.54, 2.55, 2.56, 2.57, 2.58, 2.59
.double 2.60, 2.61, 2.62, 2.63, 2.64, 2.65, 2.66, 2.67, 2.68, 2.69
.double 2.70, 2.71, 2.72, 2.73, 2.74, 2.75, 2.76, 2.77, 2.78, 2.79
.double 2.80, 2.81, 2.82, 2.83, 2.84, 2.85, 2.86, 2.87, 2.88, 2.89
.double 2.90, 2.91, 2.92, 2.93, 2.94, 2.95, 2.96, 2.97, 2.98
a: .double 1.6180
.text
.global main
main:
add r1,r0,x ; R1 <= Dirección de comienzo de x
add r2,r0,y ; R2 <= Dirección de comienzo de y
ld f0,a ; F0 <= Valor de a
addi r4,r1, 784 ; R4 <= Última posición del vector x
inicio:
ld f2, 0(r1) ; carga X(i)
multd f4, f2, f0 ; multiplica a * X(i)
ld f6, 0(r2) ; carga Y(i)
addd f6,f4,f6 ; suma a * X(i) + Y(i)
sd 0(r2), f6 ; almacena Y(i)
addi r1, r1, 8 ; incrementa índice X
addi r2,r2, 8 ; incremente índice Y
sgt r3, r1, r4 ; test por si finalizado
beqz r3, inicio ; bucle si no finalizado
trap 0 ; Fin
x: .double 1.00, 1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09
.double 1.10, 1.11, 1.12, 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19
.double 1.20, 1.21, 1.22, 1.23, 1.24, 1.25, 1.26, 1.27, 1.28, 1.29
.double 1.30, 1.31, 1.32, 1.33, 1.34, 1.35, 1.36, 1.37, 1.38, 1.39
.double 1.40, 1.41, 1.42, 1.43, 1.44, 1.45, 1.46, 1.47, 1.48, 1.49
.double 1.50, 1.51, 1.52, 1.53, 1.54, 1.55, 1.56, 1.57, 1.58, 1.59
.double 1.60, 1.61, 1.62, 1.63, 1.64, 1.65, 1.66, 1.67, 1.68, 1.69
.double 1.70, 1.71, 1.72, 1.73, 1.74, 1.75, 1.76, 1.77, 1.78, 1.79
.double 1.80, 1.81, 1.82, 1.83, 1.84, 1.85, 1.86, 1.87, 1.88, 1.89
.double 1.90, 1.91, 1.92, 1.93, 1.94, 1.95, 1.96, 1.97, 1.98
y: .double 2.00, 2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09
.double 2.10, 2.11, 2.12, 2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19
.double 2.20, 2.21, 2.22, 2.23, 2.24, 2.25, 2.26, 2.27, 2.28, 2.29
.double 2.30, 2.31, 2.32, 2.33, 2.34, 2.35, 2.36, 2.37, 2.38, 2.39
.double 2.40, 2.41, 2.42, 2.43, 2.44, 2.45, 2.46, 2.47, 2.48, 2.49
.double 2.50, 2.51, 2.52, 2.53, 2.54, 2.55, 2.56, 2.57, 2.58, 2.59
.double 2.60, 2.61, 2.62, 2.63, 2.64, 2.65, 2.66, 2.67, 2.68, 2.69
.double 2.70, 2.71, 2.72, 2.73, 2.74, 2.75, 2.76, 2.77, 2.78, 2.79
.double 2.80, 2.81, 2.82, 2.83, 2.84, 2.85, 2.86, 2.87, 2.88, 2.89
.double 2.90, 2.91, 2.92, 2.93, 2.94, 2.95, 2.96, 2.97, 2.98
a: .double 1.6180
.text
.global main
main:
add r1,r0,x ; R1 <= Dirección de comienzo de x
add r2,r0,y ; R2 <= Dirección de comienzo de y
ld f0,a ; F0 <= Valor de a
addi r4,r1, 784 ; R4 <= Última posición del vector x
iter1:
ld f2, 0(r1) ; carga X(i)
multd f4, f2, f0 ; multiplica a * X(i)
ld f6, 0(r2) ; carga Y(i)
addd f6,f4,f6 ; suma a * X(i) + Y(i)
sd 0(r2), f6 ; almacena Y(i)
iter2:
ld f8, 8(r1) ; carga X(i)
multd f10, f8, f0 ; multiplica a * X(i)
ld f12, 8(r2) ; carga Y(i)
addd f12,f10,f12 ; suma a * X(i) + Y(i)
sd 8(r2), f12 ; almacena Y(i)
iter3:
ld f14, 16(r1) ; carga X(i)
multd f16, f14, f0 ; multiplica a * X(i)
ld f18, 16(r2) ; carga Y(i)
addd f18,f16,f18 ; suma a * X(i) + Y(i)
sd 16(r2), f18 ; almacena Y(i)
addi r1, r1, 24 ; incrementa índice X
addi r2,r2, 24 ; incremente índice Y
sgt r3, r1, r4 ; test por si finalizado
beqz r3, iter1 ; bucle si no finalizado
trap 0 ; Fin
x: .double 1.00, 1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09
.double 1.10, 1.11, 1.12, 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19
.double 1.20, 1.21, 1.22, 1.23, 1.24, 1.25, 1.26, 1.27, 1.28, 1.29
.double 1.30, 1.31, 1.32, 1.33, 1.34, 1.35, 1.36, 1.37, 1.38, 1.39
.double 1.40, 1.41, 1.42, 1.43, 1.44, 1.45, 1.46, 1.47, 1.48, 1.49
.double 1.50, 1.51, 1.52, 1.53, 1.54, 1.55, 1.56, 1.57, 1.58, 1.59
.double 1.60, 1.61, 1.62, 1.63, 1.64, 1.65, 1.66, 1.67, 1.68, 1.69
.double 1.70, 1.71, 1.72, 1.73, 1.74, 1.75, 1.76, 1.77, 1.78, 1.79
.double 1.80, 1.81, 1.82, 1.83, 1.84, 1.85, 1.86, 1.87, 1.88, 1.89
.double 1.90, 1.91, 1.92, 1.93, 1.94, 1.95, 1.96, 1.97, 1.98
y: .double 2.00, 2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09
.double 2.10, 2.11, 2.12, 2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19
.double 2.20, 2.21, 2.22, 2.23, 2.24, 2.25, 2.26, 2.27, 2.28, 2.29
.double 2.30, 2.31, 2.32, 2.33, 2.34, 2.35, 2.36, 2.37, 2.38, 2.39
.double 2.40, 2.41, 2.42, 2.43, 2.44, 2.45, 2.46, 2.47, 2.48, 2.49
.double 2.50, 2.51, 2.52, 2.53, 2.54, 2.55, 2.56, 2.57, 2.58, 2.59
.double 2.60, 2.61, 2.62, 2.63, 2.64, 2.65, 2.66, 2.67, 2.68, 2.69
.double 2.70, 2.71, 2.72, 2.73, 2.74, 2.75, 2.76, 2.77, 2.78, 2.79
.double 2.80, 2.81, 2.82, 2.83, 2.84, 2.85, 2.86, 2.87, 2.88, 2.89
.double 2.90, 2.91, 2.92, 2.93, 2.94, 2.95, 2.96, 2.97, 2.98
a: .double 1.6180
.text
.global main
main:
add r1,r0,x ; R1 <= Dirección de comienzo de x
add r2,r0,y ; R2 <= Dirección de comienzo de y
ld f0,a ; F0 <= Valor de a
addi r4,r1, 784 ; R4 <= Última posición del vector x
inicio:
ld f2, 0(r1) ; carga X(i)
ld f8, 8(r1) ; carga X(i)
ld f14, 16(r1) ; carga X(i)
multd f4, f2, f0 ; multiplica a * X(i)
multd f10, f8, f0 ; multiplica a * X(i)
multd f16, f14, f0 ; multiplica a * X(i)
ld f6, 0(r2) ; carga Y(i)
ld f12, 8(r2) ; carga Y(i)
ld f18, 16(r2) ; carga Y(i)
addd f6,f4,f6 ; suma a * X(i) + Y(i)
addd f12,f10,f12 ; suma a * X(i) + Y(i)
addd f18,f16,f18 ; suma a * X(i) + Y(i)
sd 0(r2), f6 ; almacena Y(i)
sd 8(r2), f12 ; almacena Y(i)
sd 16(r2), f18 ; almacena Y(i)
addi r1, r1, 24 ; incrementa índice X
addi r2,r2, 24 ; incremente índice Y
sgt r3, r1, r4 ; test por si finalizado
beqz r3, inicio ; bucle si no finalizado
trap 0 ; Fin
x: .double 1.00, 1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09
.double 1.10, 1.11, 1.12, 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19
.double 1.20, 1.21, 1.22, 1.23, 1.24, 1.25, 1.26, 1.27, 1.28, 1.29
.double 1.30, 1.31, 1.32, 1.33, 1.34, 1.35, 1.36, 1.37, 1.38, 1.39
.double 1.40, 1.41, 1.42, 1.43, 1.44, 1.45, 1.46, 1.47, 1.48, 1.49
.double 1.50, 1.51, 1.52, 1.53, 1.54, 1.55, 1.56, 1.57, 1.58, 1.59
.double 1.60, 1.61, 1.62, 1.63, 1.64, 1.65, 1.66, 1.67, 1.68, 1.69
.double 1.70, 1.71, 1.72, 1.73, 1.74, 1.75, 1.76, 1.77, 1.78, 1.79
.double 1.80, 1.81, 1.82, 1.83, 1.84, 1.85, 1.86, 1.87, 1.88, 1.89
.double 1.90, 1.91, 1.92, 1.93, 1.94, 1.95, 1.96, 1.97, 1.98
y: .double 2.00, 2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09
.double 2.10, 2.11, 2.12, 2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19
.double 2.20, 2.21, 2.22, 2.23, 2.24, 2.25, 2.26, 2.27, 2.28, 2.29
.double 2.30, 2.31, 2.32, 2.33, 2.34, 2.35, 2.36, 2.37, 2.38, 2.39
.double 2.40, 2.41, 2.42, 2.43, 2.44, 2.45, 2.46, 2.47, 2.48, 2.49
.double 2.50, 2.51, 2.52, 2.53, 2.54, 2.55, 2.56, 2.57, 2.58, 2.59
.double 2.60, 2.61, 2.62, 2.63, 2.64, 2.65, 2.66, 2.67, 2.68, 2.69
.double 2.70, 2.71, 2.72, 2.73, 2.74, 2.75, 2.76, 2.77, 2.78, 2.79
.double 2.80, 2.81, 2.82, 2.83, 2.84, 2.85, 2.86, 2.87, 2.88, 2.89
.double 2.90, 2.91, 2.92, 2.93, 2.94, 2.95, 2.96, 2.97, 2.98
a: .double 1.6180
.text
.global main
main:
add r1,r0,x ; R1 <= Dirección de comienzo de x
add r2,r0,y ; R2 <= Dirección de comienzo de y
ld f0,a ; F0 <= Valor de a
addi r4,r1, 784 ; R4 <= Última posición del vector x
inicio:
ld f2, 0(r1) ; carga X(i)
ld f6, 0(r2) ; carga Y(i)
multd f4, f2, f0 ; multiplica a * X(i)
ld f8, 8(r1) ; carga X(i)
ld f14, 16(r1) ; carga X(i)
ld f12, 8(r2) ; carga Y(i)
addi r1, r1, 24 ; incrementa índice X
multd f10, f8, f0 ; multiplica a * X(i)
addd f6,f4,f6 ; suma a * X(i) + Y(i)
sgt r3, r1, r4 ; test por si finalizado
ld f18, 16(r2) ; carga Y(i)
multd f16, f14, f0 ; multiplica a * X(i)
addd f12,f10,f12 ; suma a * X(i) + Y(i)
sd 0(r2), f6 ; almacena Y(i)
sd 8(r2), f12 ; almacena Y(i)
addd f18,f16,f18 ; suma a * X(i) + Y(i)
sd 16(r2), f18 ; almacena Y(i)
addi r2,r2, 24 ; incremente índice Y
beqz r3, inicio ; bucle si no finalizado
trap 0 ; Fin