Translate

viernes, 21 de diciembre de 2012

Práctica 8


El siguiente programa (pract2v1.s) se encarga de multiplicar todos los números de la lista almacenada por el número pi, dejando los resultados almacenados en las mismas posiciones.
***********************************************************
.data 0
a:          .double 3.14159265358979

x:          .double 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
.double 17,18,19,20,21,22,23

xtop:       .double 24

.text 256

start:      ld f2,a           (1)
addi r1,r0,xtop   (2)
loop:       ld f0,0(r1)       (3)
multd f4,f0,f2    (4)
sd 0(r1),f4       (5)
subi r1,r1,8      (6)
bnez r1,loop      (7)
            trap 6            (8)
***********************************************************
Considerar inicialmente las siguientes opciones de configuración:
-       Unidad de suma: latencia 2 ciclos
-       Unidad de multiplicación: latencia 5 ciclos
-       Unidad de división: latencia 19 ciclos
-       Unidades funcionales sin segmentar
-       Saltos: predicción de no tomar
-       Adelantamiento de resultados: desactivado

1.    a) Simular el programa y determinar la ganancia de velocidad que se obtiene si se permiten caminos de bypass (opción adelantamiento de resultados activada).
            318 ciclos frente a 416 sin adelantamiento. Se obtiene una ganancia de velocidad de 98 ciclos.
            b) Partiendo de la configuración inicial, considere que se efectúa una mejora en la unidad de multiplicación, reduciendo su retardo a 3 ciclos. Esta mejora supone un incremento del coste del 15%. Determine si, para este programa, compensa realizar dicha mejora desde el punto de vista de            la relación coste/prestaciones.
            Sin adelantamiento: 368 ciclos frente a 416 ciclos. La mejora es de 48 ciclos. Se mejoraría un 11,54%. Relación coste/prestaciones = 15% / 11,54% = 1,3%
Con adelantamiento: 270 ciclos frente a 318 ciclos. La mejora es de 48 ciclos. Se mejoraría un 15,09%. Relación coste/prestaciones = 15% / 15,09% = 0,99%
No merece la pena realizar la mejora.

            c) Considere que la mejora consiste en reducir el retardo de la unidad de multiplicación a 2 ciclos, con un incremento del coste del 18%. ¿Compensa la mejora?
            Sin adelantamiento: 344 ciclos frente a 416 ciclos. La mejora es de 72 ciclos. Se mejoraría un 17,31%. Relación coste/prestaciones = 18% / 17,31% = 1,04%
Con adelantamiento: 246 ciclos frente a 318 ciclos. La mejora es de 72 ciclos. Se mejoraría un 22,64%. Relación coste/prestaciones = 18% / 22,64% = 0,795%
Merece la pena realizar la mejora.
            d) ¿Tendría interés mejorar la latencia de la unidad de suma?
            No, porque no se realizan suman, y la única reducción posible es en 1 unidad y no merecería la pena.

2.    Seleccione la opción “salto retardado” y ejecute el programa. ¿Qué ocurre? ¿Cuál es la causa? ¿Cuál sería la solución?
            Se reduce a 25 ciclos. La causa es que ya que puede acceder a la información antes, necesita menos ciclos para la ejecución del programa.

3.    La siguiente figura (pract2v2.s) muestra una versión modificada del código inicial, que se ha transformado aplicando una técnica que recibe el nombre de desenrollado de bucle. Esta técnica consiste en realizar los cálculos de varias iteraciones en una única iteración para reducir así el número de instrucciones de salto que se tienen que ejecutar, con lo que además se evitan riesgos de control.
Determinar la ganancia de velocidad que se obtiene con respecto a la versión inicial del programa.
****************************************************************
.data 0
a:          .double 3.14159265358979

x:          .double 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
.double 17,18,19,20,21,22,23

xtop:       .double 24

.text 256

start:      ld f2,a           (1)
addi r1,r0,xtop   (2)
loop:       ld f0,0(r1)       (3)
multd f4,f0,f2    (4)
sd 0(r1),f4       (5)
ld f6,-8(r1)      (6)
multd f8,f6,f2    (7)
sd -8(r1),f8      (8)
ld f10,-16(r1)    (9)
multd f12,f10,f2 (10)
sd -16(r1),f12    (11)
ld f14,-24(r1)    (12)
multd f16,f14,f2 (13)
sd -24(r1),f16    (14)
subi r1,r1,32     (15)
bnez r1,loop      (16)
      trap 6            (17)
****************************************************************
            Sin adelantamiento: 326 ciclos frente a 416 ciclos de la versión inicial. Ganancia de velocidad en 90 ciclos.
            Con adelantamiento: 246 ciclos frente a 368 ciclos de la versión inicial. Ganancia de velocidad en 122 ciclos.

4.    Para el programa del apartado anterior, pract2v2.s, determinar la ganancia de velocidad que se obtiene con respecto a un procesador DLX sin segmentar de referencia, que denominaremos DLXssr.
En el procesador DLXssr cada instrucción va pasando por distintas fases que se suceden según sean utilizadas por la correspondiente instrucción, de forma que las instrucciones tendrán distinto tiempo de ejecución según del tipo que sean.
Consideraremos que en DLXssr las fases IF, ID, intEX, MEM y WB tienen un ciclo de reloj cada una. Las fases faddEX, fmultEX y fdivEX tendrán el mismo número de ciclos que en el caso del procesador segmentado.
Para estimar el tiempo de ejecución del programa en DLXssr hay que tener en cuenta el tiempo que tardaría cada una de sus instrucciones. El tiempo de una instrucción se puede determinar a partir del número de etapas por las que pasa. Así, por ejemplo, una instrucción de carga (ld) pasaría por todas las etapas (duración 5 ciclos de reloj) mientras que una instrucción de almacenamiento (sd) no pasaría por WB (duración 4 ciclos de reloj) ya que no tiene que almacenar nada en los registros del procesador. Las instrucciones aritmético-lógicas no pasarían por la etapa MEM. Hay que tener en cuenta que la duración de la etapa EX depende del tipo de instrucción: si la operación es con enteros, se utilizará intEX y la duración será de un ciclo; si es en coma flotante, se utilizará faddEX, fmulEX o fdivEX y la duración será la asignada a la correspondiente unidad.
Para las instrucciones de salto condicional considere una duración de 3 ciclos (en la etapa de ejecución se comprueba la condición y se carga en el PC la nueva dirección, si fuese el caso). Para el trap considere 2 ciclos (hasta la etapa de decodificación).
           
           


5.    Modificar el programa del apartado 3 (pract2v3.s) de forma que incluya 8 iteraciones en el bucle. Determinar la ganancia de velocidad que se obtiene con respecto a las versiones anteriores.
            Para conseguir que el bucle tenga 8 iteraciones, eliminamos las líneas señaladas en negrita del código, y el 32 de la línea siguiente, lo convertimos en un 24:
**********************************************************************
            .data 0
a:          .double 3.14159265358979

x:          .double 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
            .double 17,18,19,20,21,22,23

xtop:       .double 24

            .text 256

start:      ld f2,a           (1)
            addi r1,r0,xtop   (2)  
loop:       ld f0,0(r1)       (3)
            multd f4,f0,f2    (4)
            sd 0(r1),f4       (5)
            ld f6,-8(r1)      (6)
            multd f8,f6,f2    (7)
            sd -8(r1),f8      (8)
            ld f10,-16(r1)    (9)
            multd f12,f10,f2  (10)
            sd -16(r1),f12    (11)
            ld f14,-24(r1)    (12)
            multd f16,f14,f2  (13)
            sd -24(r1),f16    (14)
            subi r1,r1,32     (15)
            bnez r1,loop      (16)
            trap 6            (17)
**********************************************************************
            El nuevo código posee un 2% más de velocidad que el anterior.

6.    Partiendo de la versión del apartado 3, reorganizar las instrucciones (pract2v4.s) para reducir el efecto de las dependencias entre ellas. Simular la versión realizada y determinar la ganancia de velocidad obtenida.
            Para reducir el efecto de las dependencias entre ellas, hemos cambiado el orden de las instrucciones de lectura-escritura. Anteriormente, las de escritura estaban antes que las de lectura, ya que el código contaba con muchas detenciones del tipo RAW. Al hacer este cambio hemos obtenido una ganancia de velocidad del 17% con respecto a la primera versión.


**********************************************************************
            .data 0
a:          .double 3.14159265358979

x:          .double 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
            .double 17,18,19,20,21,22,23

xtop:       .double 24

            .text 256

start:      addi r1,r0,xtop
            ld f2,a
loop:       ld f0,0(r1)
            multd f4,f0,f2
            ld f6,-8(r1)
            sd 0(r1),f4
            multd f8,f6,f2
            ld f10,-16(r1)
            sd -8(r1),f8
            multd f12,f10,f2
            ld f14,-24(r1)
            sd -16(r1),f12
            multd f16,f14,f2
            sd -24(r1),f16
            subi r1,r1,32
            bnez r1,loop
            trap 6
**********************************************************************

Práctica 7



 PRÁCTICAS CON WinDLXV


Para cada uno de los siguientes ejemplos, las condiciones de partida serán:
- Unidad de suma: latencia 2 ciclos
- Unidad de multiplicación: latencia 5 ciclos
- Unidad de división: latencia 19 ciclos
- Unidades funcionales sin segmentar
- Adelantamiento de resultados: desactivado

- Ejemplo 1: dependencias de datos tipo RAW

Ejecute el programa ciclo a ciclo y observe las detenciones que se producen en el cauce debido a las dependencias.

¿Cuál es en este cauce la latencia de emisión de las instrucciones aritmético-lógicas?
Suma/Resta = 3
Multiplicación = 6
División = 20

¿La escritura y la lectura de los operandos en el banco de registros se realizan en el mismo o en distinto ciclo?
Si, una en el flaco de subida y otra en el flaco de bajada

Una vez ejecutado el programa completo, indicar:

a) Número total de ciclos de ejecución y CPI:
29 ciclos y 1,933 ciclos por instrucción
           
b) Número (de ciclos) y distribución de las detenciones (stalls):
10 RAW (Cuando pide un dato antes de que se haya calculado)
0 WAW
0 WAR
0 Estructurales

c) Número total de ciclos de ejecución, CPI, número (de ciclos) y distribución de las detenciones y ganancia del rendimiento al emplear adelantamiento de resultados (data forwarding):

19 ciclos, 1,267 CPI, 0 RAW, 0 WAW, 0 WAR y 0 Estructurales. La ganancia es que al usar adelantamiento es 10 ciclos menos de ejecución y no tener ninguna detención.  


;*********** WINDLXV *************
;*********** Ejemplo 1 *************
;-----------------------------------------------------------------------------
; Ejemplo para ilustrar dependencias de datos tipo RAW
;-----------------------------------------------------------------------------
.text
main:
add r1,r2,r3 ;almacena un nuevo valor en r1
sub r4,r1,r5 ;usa r1
and r6,r1,r7 ;usa r1
or r8,r1,r9 ;usa r1
xor r10,r1,r11 ;usa r1
nop
nop
nop
nop
add r1,r2,r3 ;almacena un nuevo valor en r1
sub r4,r1,r5 ;usa r1 y almacena un nuevo valor en r4
and r6,r4,r7 ;usa r4 y almacena un nuevo valor en r6
or r8,r6,r9 ;usa r6 y almacena un nuevo valor en r8
xor r10,r8,r11 ;usa r8 y almacena un nuevo valor en r10
Finish: trap 6

- Ejemplo 2: dependencias de datos tipo RAW

Inicialice los registros r2 y r3 con los valores 0x1002 y 0x6, respectivamente. Igualmente, inicialice las posiciones de memoria 0x1004 y 0x1008 con los valores 0x1f y 0x20, respectivamente.

Sin ejecutar el programa en el simulador, determine los valores que almacenarán los registros r1, r4, r5, r6 y r8 al finalizar su ejecución. Indique también la dirección de memoria en la que se almacenará el contenido del registro r5. Una vez ejecutado el programa en el simulador compruebe estos resultados.

R1 = R2 + R3 = 4098 + 6 = 4104
R4 = R1 desplazado 0 veces = 4104
R5 = R4 – R3 = 4104 – 6 = 4098
R8 = R1 or R5 = 100000001000 or 1000000000010 = 1000000000000 = 4096

Ejecute el programa ciclo a ciclo y observe las detenciones que se producen en el cauce debido a las dependencias.

¿Cuál es en este cauce la latencia de emisión de las instrucciones aritmético-lógicas?

-Suma/resta: 3 Latencia
-Multiplicación: 6 Latencia
-División: 20 Latencia

¿Y para las instrucciones de carga?

-Suma/resta: 7 Latencia
-Multiplicación: 8 Latencia
-División: 21 Latencia
-Carga Vectorial: 13 Latencia

Una vez ejecutado el programa completo, indicar:

a) Número total de ciclos de ejecución y CPI

 25 ciclos y hay 1,923 CPI

b) Número (de ciclos) y distribución de las detenciones

8 RAW, 0 WAW, 0 WAR y 0 Estructurales




c) Número total de ciclos de ejecución, CPI, número (de ciclos) y distribución de las detenciones y ganancia del rendimiento al emplear adelantamiento de resultados

19 Ciclos, 1,462 CPI, 2 RAW, 0 WAW, 0 WAR, 0 Estructurales. Las ganancias de usar adelantamiento son 7 ciclos menos y menos detenciones, 6 RAW menos.

d) Al emplear adelantamiento de resultados, ¿cuáles serían las latencias de emisión para las instrucciones aritmético-lógicas y para las instrucciones de carga?

Instrucciones Aritmético-lógicas:
-Suma/resta: 3 Latencia
-Multiplicación: 6 Latencia
-División: 20 Latencia

Instrucciones de carga:
-Suma/resta: 7 Latencia
-Multiplicación: 8 Latencia
-División: 21 Latencia
-Carga Vectorial: 13 Latencia

;*********** WINDLXV*************
;*********** Ejemplo 2 *************
;-----------------------------------------------------------------------------
; Ejemplo para ilustrar dependencias de datos tipo RAW
;-----------------------------------------------------------------------------
.text
main:
add r1,r2,r3
lw r4, 0(r1) ;carga en r4 usando r1
sub r5,r4,r3 ;usa r4
sw 14(r2),r5 ;almacena r5 usando r2
nop
nop
nop
nop
lw r1, 2(r2)
sub r4,r1,r5
and r6,r1,r5
or r8,r1,r5
Finish:
trap 6

- Ejemplo 3: dependencias de tipo estructural

Ejecute el programa ciclo a ciclo y observe las detenciones que se producen en el cauce debido a las dependencias.
Una vez ejecutado el programa completo, indicar:

a) Número total de ciclos de ejecución y CPI

18 Ciclos y 3 ciclos por instrucción

b) Número (de ciclos) y distribución de las detenciones

0 RAW, 0 WAW, 0 WAR y 0 Estructurales

c) Ganancia del rendimiento al segmentar las unidades funcionales de punto flotante**

15 ciclos frente a 18 ciclos sin segmentar. La ganancia es de 3 ciclos, aunque se producen 3 detenciones; 1 RAW y 2 Estructurales.


;*********** WINDLXV *************
;*********** Ejemplo 3 *************
;-----------------------------------------------------------------------------
; Ejemplo para ilustrar dependencias de tipo estructural
;-----------------------------------------------------------------------------
.text
main:
addf f1,f2,f3
multf f2,f4,f5
addf f3,f3,f4
multf f6,f6,f6
addf f1,f3,f5
addf f2,f3,f4
Finish:
trap 6



- Ejemplo 4: reordenación de datos

Para este ejemplo considere una latencia de 3 ciclos para la suma y la multiplicación y de 9 ciclos para la división. Unidades funcionales sin segmentar y adelantamiento de resultados desactivado.
Determinar:
a) Número total de ciclos de ejecución y CPI del programa inicial

86 Ciclos y 7.167 ciclos por instrucción

b) Número de ciclos perdidos por dependencias tipo RAW en el programa inicial

35 Ciclos

c) Ganancia del rendimiento al reordenar las instrucciones

73 ciclos frente a 86 ciclos, y solo perdemos 17 ciclos por dependencia tipo RAW en vez de 35.
;*********** WINDLXV *************
;*********** Ejemplo 4 *************
;------------------------------------------------------------------------------------------------------
; Ejemplo para ilustrar la reordenación de instrucciones – PROGRAMA ORIGINAL
;------------------------------------------------------------------------------------------------------
.data
ONE: .word 1
.text
main:
lf f1,ONE ;convierte divf en move al almacenar
cvti2f f7,f1 ; 1 en f7 en formato de punto flotante
nop
divf f1,f8,f7 ;mueve Y=(f8) a f1
divf f2,f9,f7 ;mueve Z=(f9) a f2
addf f3,f1,f2
divf f10,f3,f7 ;mueve f3 a X=(f10)
divf f4,f11,f7 ;mueve B=(f11) a f4
divf f5,f12,f7 ;mueve C=(f12) a f5
multf f6,f4,f5
divf f13,f6,f7 ;mueve f6 a A=(f13)
Finish:
trap 6


;*********** WINDLXV *************
;*********** Ejemplo 4 *************
;------------------------------------------------------------------------------------------------------------
; Ejemplo para ilustrar la reordenación de instrucciones – PROGRAMA REORDENADO
;------------------------------------------------------------------------------------------------------------
.data
ONE: .word 1
.text
main:
lf f1,ONE ;convierte divf en move al almacenar
cvti2f f7,f1 ; 1 en f7 en formato de punto flotante
nop
divf f1,f8,f7 ;mueve Y=(f8) a f1
divf f2,f9,f7 ;mueve Z=(f9) a f2
divf f4,f11,f7 ;mueve B=(f11) a f4
divf f5,f12,f7 ;mueve C=(f12) a f5
addf f3,f1,f2
multf f6,f4,f5
divf f10,f3,f7 ;mueve f3 a X=(f10)
divf f13,f6,f7 ;mueve f6 a A=(f13)
Finish:
trap 6