LABORATIORIO DE ARQUITECTURA DE COMPUTADORES INGENIERIA INFORMATICA PRACTICA 1 COMPUTADORES SEGMENTADOS (DLX) Eduardo Moriana Delgado 2007/08 1.Introducción ...................................................................................................................................... 3 2.Ejercicios ........................................................................................................................................... 3 1. Introducción En la primera práctica vamos a realizar cuatro ejercicios para un computador segmentado. Para poder realizarlo vamos a utilizar el simulador Vsim. Estos ejercicios nos permitirán observar el cauce de ejecución y como le afectan los parones cuando realizamos tareas iterativas. 2. Ejercicios 2.1 Ejercicio 1 2.1.1 Enunciado: Realizar un programa para el DLX que sume dos vectores de 10 componentes, sin usar bucles. Analizar los resultados estadísticos y las dependencias que producen detenciones en el cauce. 2.1.2 Código: .data vector1: .word 1,2,3,4,5,6,7,8,9,10 vector2: .word 0,1,2,3,2,1,0,1,2,3 vdestino: .word 0,0,0,0,0,0,0,0,0,0 lw r4,16(r1) lw r5,16(r2) add r6,r4,r5 sw 16(r3),r6 .text ini: lw r4,20(r1) lw r5,20(r2) add r6,r4,r5 sw 20(r3),r6 addi r1,r0,vector1 addi r2,r0,vector2 addi r3,r0,vdestino lw r4,0(r1) lw r5,0(r2) add r6,r4,r5 sw 0(r3),r6 lw r4,4(r1) lw r5,4(r2) add r6,r4,r5 sw 4(r3),r6 lw r4,8(r1) lw r5,8(r2) add r6,r4,r5 sw 8(r3),r6 lw r4,12(r1) lw r5,12(r2) add r6,r4,r5 sw 12(r3),r6 2.1.3 Resultados obtenidos Tamaño de memoria: 65536 bytes. Distribuida en 16 bancos. lw r4,24(r1) lw r5,24(r2) add r6,r4,r5 sw 24(r3),r6 lw r4,28(r1) lw r5,28(r2) add r6,r4,r5 sw 28(r3),r6 lw r4,32(r1) lw r5,32(r2) add r6,r4,r5 sw 32(r3),r6 lw r4,36(r1) lw r5,36(r2) add r6,r4,r5 sw 36(r3),r6 trap #6 Configuración de unidades escalares en Coma Flotante 1 Unidad(es) de suma/resta, latencia = 2 ciclos 1 Unidad(es) de división, latencia = 19 ciclos 1 Unidad(es) de multiplicación, latencia = 5 ciclos Configuración de unidades vectoriales 1 Unidad(es) de suma/resta, latencia = 6 ciclos 1 Unidad(es) de división, latencia = 20 ciclos 1 Unidad(es) de multiplicación, latencia = 7 ciclos 1 Unidad(es) de carga/almac., latencia = 12 ciclos 1 Unidad(es) logica(s), latencia = 1 ciclos 2/1 puertos de lectura/escritura en los regs. vectoriales ) Ciclos de parada por dependencia tras Cargas Escalares = 10 Ciclos de parada por dependencia de operaciones Escalares = 0 Ciclos de parada por dependencia de operaciones Vectoriales = 0 Ciclos consumidos por el programa = 54 No se han ejecutado instrucciones de salto. Operaciones Pendientes: ninguna. 2.1.4 Comentarios: En el primer a desarrollar un programa que sume dos vectores sin el uso de un bucle. Simplemente vamos sumando cada elemento de los dos vectores y lo guardamos en un tercero, para a continuación almacenarlo en memoria. En los resultados obtenidos podemos observar que hemos sufrido 10 parones de dependencias RAW, al no estar preparado el elemento a sumar después de traerlo desde memoria a uno de los registros. 2.2 Ejercico 2 2.2.1 Enunciado Modificar el programa anterior para evitar las detenciones, comprobar los resultados. 2.2.2 codigo .data vector1: .word 1,2,3,4,5,6,7,8,9,10 vector2: .word 0,1,2,3,2,1,0,1,2,3 vdestino: .word 0,0,0,0,0,0,0,0,0,0 .text ini: addi r1,r0,vector1 addi r2,r0,vector2 addi r3,r0,vdestino lw r4,0(r1) lw r5,0(r2) lw r7,4(r1) lw r8,4(r2) add r6,r4,r5 sw 0(r3),r6 add r6,r7,r8 sw 4(r3),r6 lw r4,8(r1) lw r5,8(r2) lw r6,12(r1) lw r7,12(r2) add r6,r4,r5 sw 8(r3),r6 add r6,r7,r8 sw 12(r3),r6 lw r4,16(r1) lw r5,16(r2) lw r6,20(r1) lw r7,20(r2) add r6,r4,r5 sw 16(r3),r6 add r6,r7,r8 sw 20(r3),r6 lw r4,24(r1) lw r5,24(r2) lw r6,28(r1) lw r7,28(r2) add r6,r4,r5 sw 24(r3),r6 add r6,r7,r8 sw 28(r3),r6 lw r5,32(r2) lw r6,36(r1) lw r7,36(r2) add r6,r4,r5 sw 32(r3),r6 add r6,r7,r8 sw 36(r3),r6 trap #6 lw r4,32(r1) 2.2.3 Resultados Tamaño de memoria: 65536 bytes. Distribuida en 16 bancos. Configuración de unidades escalares en Coma Flotante 1 Unidad(es) de suma/resta, latencia = 2 ciclos 1 Unidad(es) de división, latencia = 19 ciclos 1 Unidad(es) de multiplicación, latencia = 5 ciclos Configuración de unidades vectoriales 1 Unidad(es) de suma/resta, latencia = 6 ciclos 1 Unidad(es) de división, latencia = 20 ciclos 1 Unidad(es) de multiplicación, latencia = 7 ciclos 1 Unidad(es) de carga/almac., latencia = 12 ciclos 1 Unidad(es) logica(s), latencia = 1 ciclos 2/1 puertos de lectura/escritura en los regs. vectoriales ) Ciclos de parada por dependencia tras Cargas Escalares = 0 Ciclos de parada por dependencia de operaciones Escalares = 0 Ciclos de parada por dependencia de operaciones Vectoriales = 0 Ciclos consumidos por el programa = 44 No se han ejecutado instrucciones de salto. Operaciones Pendientes: ninguna. 2.2.4 comentarios La finalidad de este ejercicio, consiste en tratar de eliminar las paradas del cauce por dependencias. Como las paradas del cauce se deben a que los datos de memoria no están disponibles para realizar la suma, vamos a traer desde memoria otro par de elementos de la suma siguiente, dando así el tiempo necesario para que al iniciar las suma dos ciclos mas tarde, ya se encuentren disponibles los datos de memoria. De este modo logramos suprimir todas las paradas realizando las sumas cada dos parejas de datos. 2.3Ejercico 3 2.3.1 Enunciado Repetir la operación usando un bucle para la suma de componentes. 2.3.2 codigo .data vector1: .word 1,2,3,4,5,6,7,8,9,10 vector2: .word 1,2,3,4,5,6,7,8,9,10 vector: .word 0,0,0,0,0,0,0,0,0,0 .text start: addi r1,r0,#0 addi r2,r0, #10 bucle: lw r3,vector1(r1) lw r4,vector2(r1) add r5,r3,r4 sw vector(r1),r5 addi r1,r1, #4 subi r2, r2, #1 bnez r2,bucle nop jijiji trap #6 2.3.3 Estadísticas Tamaño de memoria: 65536 bytes. Distribuida en 16 bancos. Configuración de unidades escalares en Coma Flotante 1 Unidad(es) de suma/resta, latencia = 2 ciclos 1 Unidad(es) de división, latencia = 19 ciclos 1 Unidad(es) de multiplicación, latencia = 5 ciclos Configuración de unidades vectoriales 1 Unidad(es) de suma/resta, latencia = 6 ciclos 1 Unidad(es) de división, latencia = 20 ciclos 1 Unidad(es) de multiplicación, latencia = 7 ciclos 1 Unidad(es) de carga/almac., latencia = 12 ciclos 1 Unidad(es) logica(s), latencia = 1 ciclos 2/1 puertos de lectura/escritura en los regs. vectoriales ) Ciclos de parada por dependencia tras Cargas Escalares = 10 Ciclos de parada por dependencia de operaciones Escalares = 0 Ciclos de parada por dependencia de operaciones Vectoriales = 0 Ciclos consumidos por el programa = 93 Saltos: total 10, tomados 9 (90.00%), no tomados 1 (10.00%) Operaciones Pendientes: ninguna. 2.3.4 comentarios En este ejercicio hemos utilizado las instrucciones de salto, para implementar un bucle que realice la suma de los dos vectores. Como podemos ver en las estadísticas tenemos 10 paradas por dependencia de datos, una en cada operación de suma. 2.4 Ejercico 4 2.4.1 Enunciado 4.- Optimizar el programa del apartado anterior, comprobar resultados. .data vector1: .word 1,2,3,4,5,6,7,8,9,10 vector2: .word 1,2,3,4,5,6,7,8,9,10 vector: .word 0,0,0,0,0,0,0,0,0,0 .text start: addi r1,r0,#0 addi r2,r0,#4 addi r3,r0, #4 bucle: lw r4,vector1(r1) lw r5,vector2(r1) lw r6,vector1(r2) lw r7,vector2(r2) add r8,r4,r5 add r9,r6,r7 sw vector(r1),r8 sw vector(r2),r9 addi r1,r1, #8 addi r2,r2, #8 bnez r3,bucle subi r3, r3, #1 trap #6 2.4.2 estadisticas Tamaño de memoria: 65536 bytes. Distribuida en 16 bancos. Configuración de unidades escalares en Coma Flotante 1 Unidad(es) de suma/resta, latencia = 2 ciclos 1 Unidad(es) de división, latencia = 19 ciclos 1 Unidad(es) de multiplicación, latencia = 5 ciclos Configuración de unidades vectoriales 1 Unidad(es) de suma/resta, latencia = 6 ciclos 1 Unidad(es) de división, latencia = 20 ciclos 1 Unidad(es) de multiplicación, latencia = 7 ciclos 1 Unidad(es) de carga/almac., latencia = 12 ciclos 1 Unidad(es) logica(s), latencia = 1 ciclos 2/1 puertos de lectura/escritura en los regs. vectoriales ) Ciclos de parada por dependencia tras Cargas Escalares = 0 Ciclos de parada por dependencia de operaciones Escalares = 0 Ciclos de parada por dependencia de operaciones Vectoriales = 0 Ciclos consumidos por el programa = 64 Saltos: total 5, tomados 4 (80.00%), no tomados 1 (20.00%) Operaciones Pendientes: ninguna. 2.4.3 comentarios La finalidad de este ejercicio consiste en optimizar lo posible el bucle, y para ello aparte de hacer uso del hueco de retardo que perdemos después del salto, hemos desenrollado el bucle de tal modo que hemos coneguido eliminar todas las paradas en el cauce. Se podría actualziar mas desenrollando el bucle para ahorrar los ciclos para el control del bucle, pero no aplica a esta práctica.