Memoria Práctica de Ingeniería de Computadores II

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 10

2012

Memoria práctica de Ingeniería de Computadores II:


Programación en el ensamblador del procesador
segmentado DLX del bucle DAXPY

Longinos Recuero Bustos


(lrecuero1@alumno.uned.es)
longinox.blogspot.com
675727441
Alcázar de San Juan
19/02/2012
Tabla de contenido
Apartado a ..................................................................................................................................... 3
Apartado b..................................................................................................................................... 3
Apartado c ..................................................................................................................................... 4
Apartado d..................................................................................................................................... 5
Apartado e..................................................................................................................................... 6
Apéndice A .................................................................................................................................... 7
Apéndice B .................................................................................................................................... 8
Apéndice C..................................................................................................................................... 9
Apéndice D .................................................................................................................................. 10

2 Longinos Recuero Bustos (lrecuero1@alumno.uned.es)


Apartado a
La programación de este apartado se encuentra en el listado del Apéndice A y en el fichero BUCLE.S
entregado junto a la práctica.

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

add r1,r0,x 0 --- --- --- --- --- 1 5 5


add r2,r0,y 0 --- --- --- --- --- 2 6 5
ld f0,a 0 --- --- --- --- --- 3 7 5
addi r4,r1, 784 0 --- --- --- --- --- 4 8 5
ld f2, 0(r1) 0 --- --- --- --- --- 5 9 5
multd f4, f2, f0 1 --- RAW --- --- --- 6 15 10
ld f6, 0(r2) 1 STRUCTURAL --- --- --- --- 7 12 6
addd f6,f4,f6 3 RAW --- --- --- --- 9 17 9
sd 0(r2), f6 3+1 STRUCTURAL RAW --- --- --- 10 18 9
addi r1, r1, 8 1 STRUCTURAL --- --- --- --- 14 19 6
addi r2,r2, 8 0 --- --- --- --- --- 16 20 5
sgt r3, r1, r4 0 --- --- --- --- --- 17 21 5
beqz r3, inicio 1 RAW --- --- --- --- 18 23 6

Todo lo anterior y algunos datos más son recogidos de manera gráfica en la siguiente imagen capturada
del simulador WinDLX:

3 Longinos Recuero Bustos (lrecuero1@alumno.uned.es)


En resumen:

 Hay un total de 11 detenciones.


 En el ciclo 5, comienza la ejecución de la instrucción en la primera iteración del bucle.
 Cada iteración del bucle original consume 61 ciclos.

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:

Coincidiendo con lo recogido anteriormente:

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 lo tanto, la aceleración obtenida sobre el bucle original es de:

4 Longinos Recuero Bustos (lrecuero1@alumno.uned.es)


Apartado d
Como primera aproximación, se puede planificar el código del apartado c, reorganizando (agrupando) las
instrucciones por tipo (véase el listado de código del Apéndice C y en el fichero BUCLE_D.S). Sin embargo la
ganancia obtenida, apenas mejora lo obtenido con anterioridad.

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:

5 Longinos Recuero Bustos (lrecuero1@alumno.uned.es)


Apartado e
El CPI medio viene descrito por la expresión:

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:

CICLOS INSTRUCCIONES DETENCIONES ACELERACIÓN CPI medio


BUCLE.S (a) 1592 869 695 --- 19 / 09 = 2,11
BUCLE_C.S (c) 1196 632 563 1,33 39 / 19 = 2,05
BUCLE_D.S 1064 632 398 1,49 35 / 19 = 1,84
BUCLE_D_OP2.S (d) 767 632 68 2,07 26 / 19 = 1,36

6 Longinos Recuero Bustos (lrecuero1@alumno.uned.es)


Apéndice A
Listado del fichero

.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

7 Longinos Recuero Bustos (lrecuero1@alumno.uned.es)


Apéndice B
.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

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

8 Longinos Recuero Bustos (lrecuero1@alumno.uned.es)


Apéndice C
.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)
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

9 Longinos Recuero Bustos (lrecuero1@alumno.uned.es)


Apéndice D
.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)
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

10 Longinos Recuero Bustos (lrecuero1@alumno.uned.es)

También podría gustarte