lOMoARcPSD|2193028 Examen 10 Octubre 2013, preguntas y respuestas Fundamentos de computadores (Universidad Complutense Madrid) StudeerSnel wordt niet gesponsord of ondersteund door een hogeschool of universiteit Gedownload door Amor Sánchez (amorsanchezs@gmail.com) lOMoARcPSD|2193028 FUNDAMENTOS DE COMPUTADORES 18 de junio de 2013. Examen parcial del 2º cuatrimestre. Nombre____________________________________________________________________________DNI_____________________________ Apellidos_____________________________________________________________________________________________Grupo________ Ejercicio 1 (3 puntos). Supongamos que definimos que un número natural es “bonito” si es menor que cien mil y además su valor puede obtenerse como una suma de números naturales de la forma 1+2+3+4+5+… Se pide: a) (1,5 puntos) Escribir un programa en lenguaje ensamblador del ARM tal que dado un número natural N decida si es o no bonito. El programa escribirá en la variable B un 1 si el número es bonito y un 0 en caso contrario. b) (1,5 puntos) Convertir el código anterior en una subrutina que reciba como entrada un número natural N y devuelva como salida un 1 si el número N es bonito y un 0 si no lo es. Escribir un programa en lenguaje ensamblador del ARM que llame a la subrutina, y tal que dado un vector A de M números naturales sea capaz de hallar cuántos números bonitos hay en el vector. El programa debe almacenar la cantidad de números bonitos hallada en la variable “cuenta_bonitos”. Nota: Se debe respetar el convenio del ARM visto en clase para llamadas a subrutinas. Además, en ambos apartados se deben incluir las directivas para reservar memoria y declarar las secciones (.data, .bss y .text) correspondientes. Ejercicio 2 (3 puntos). Se desea añadir al procesador multiciclo la instrucción movz, de tipo R: movz rd, rs, rt # si (BR[rt]==0) entonces BR[rd]BR[rs] Se pide: a) (1 punto) Completar la ruta de datos de la figura con los elementos que faltan para que se puedan ejecutar las instrucciones del procesador MIPS estudiadas en clase, incluyendo además los cambios que tendrían que realizarse para poder ejecutar esta instrucción. b) (1 punto) Añadir los estados necesarios a la máquina de estados (ver figura siguiente) para poder implementar el control de esta instrucción. c) (1 punto) Indicar los valores que van tomando todos los registros implicados en la ejecución de la instrucción MOVZ R1, R2, R3. El código de operación de la función MOVZ es 000000 y el valor de los campos SHAMT y FUNCT son 00000 y 100110, respectivamente. El estado actual de la máquina es: R1=0x00000017 R2=0x00110011 R3=0x00000000 PC=0x00003400 Gedownload door Amor Sánchez (amorsanchezs@gmail.com) lOMoARcPSD|2193028 Ejercicio 3 (3 puntos). Sea un computador con una memoria principal de 1MB, con una memoria cache de emplazamiento directo de 1KB con bloques de 128 bytes. La memoria es direccionable por bytes y el tamaño de palabra es de 4 bytes. Se pide: a) (0,5 puntos) Indicar el formato de la dirección para MP y para MC. b) (1 punto) En un momento dado sólo cuatro de las entradas de la cache contienen datos válidos, los contenidos del array de etiquetas de la cache (en hexadecimal) son los indicados en tabla inferior. Expresar en hexadecimal el rango de direcciones de memoria principal ubicadas en la memoria cache. Bloque de MC 0 1 2 3 4 5 6 7 Etiqueta 0x3A7 0x100 0x100 0x0D2 c) (1,5 puntos) Partiendo de la situación indicada en la tabla anterior, supongamos que un programa realiza la siguiente cadena de referencias en lectura (en hexadecimal): todas las palabras entre E9C38 y E9D7C ambos incluidos, todas las palabras entre las direcciones 4019C y 402AC, ambas incluidas, y todas las palabras entre las direcciones 34A84 y 34BC0, ambas incluidas. Indicar en cada caso los fallos que se producen e indicar cómo se queda el array de etiquetas de la memoria cache después de acceder a la última dirección. Ejercicio 4 (1 punto). El siguiente código en lenguaje ensamblador del ARM puede usarse para generar un retardo que permita la eliminación de rebotes en un pulsador, tal como hemos hecho por ejemplo en el laboratorio. bReb: finR: LDR R2,=200000 MOV R3,#0 CMP R3,R2 BEQ finR MUL R1,R0,R1 ADD R3,R3,#1 B bReb (salida del bucle, continua el programa) a) (0,75 puntos) Si sabemos que la frecuencia de reloj del ARM es de 66 MHz y hemos medido que desde que se produce la entrada en el bucle hasta que se produce la salida transcurren 2 décimas de segundo ¿cuál ha sido el valor de CPI en la ejecución del bucle? b) (0,25 puntos) Si en las mismas condiciones aumentamos la frecuencia del reloj hasta 100 MHz ¿cuánto tiempo transcurrirá desde que se entra en el bucle hasta que se sale? Gedownload door Amor Sánchez (amorsanchezs@gmail.com) lOMoARcPSD|2193028 FUNDAMENTOS DE COMPUTADORES 18 de junio de 2014. Examen parcial del 2º cuatrimestre. Nombre__________________________________________________________DNI___________________________ __ Apellidos_________________________________________________________________________Grupo________ Ejercicio 1 (2.5 puntos) Para el computador MIPS estudiado en clase, responder a las siguientes preguntas: a) (0.5 puntos) Qué instrucción/es, del repertorio de instrucciones del procesador MIPS estudiado en clase, se ven afectada/s y no se podrían ejecutar si se elimina de la ruta de datos el registro MDR, la entrada 1 del Mux que selecciona el dato que se escribe en el banco de registros, y por lo tanto dicho Multiplexor. b) (0.75 puntos) Partiendo de la ruta de datos completa del MIPS, se desea añadir una nueva instrucción Store con Direccionamiento Absoluto (SMDA). Se añade para ello un nuevo formato de instrucción con los siguientes campos (Op, Rs, dirección): El comportamiento de la instrucción SMDA sería el siguiente: SMDA Rs, dirección Mem[ExtCeros(dirección)] BR[rs] donde ExtCeros(dirección) extiende la dirección de 21 bits a 32 bits añadiendo ceros por la izquierda. Añade a la ruta de datos los cambios que tendrían que realizarse para poder ejecutar esta instrucción. c) (0.5 puntos) Añade los cambios necesarios en el diagrama de transición de estados del controlador para poder ejecutar correctamente esta nueva instrucción. d) (0.75 puntos) Indicar los cambios necesarios en la tabla de verdad del controlador (añadir las filas y columnas necesarias). Ejercicio 2 (3 puntos) Sea un computador con un procesador ARMv4. EL procesador cuenta con una memoria cache de emplazamiento directo de 256 bytes con bloques de 64 bytes, unificada para datos e instrucciones (se almacenan en la misma cache los bloques de instrucciones accedidos en la etapa FETCH y los bloques de datos accedidos durante las etapas que hacen acceso a memoria en las instrucciones ldr y str). a) (0.5 puntos) En dicho sistema se quiere ejecutar el siguiente programa. Explique razonadamente lo que hace el código. Gedownload door Amor Sánchez (amorsanchezs@gmail.com) lOMoARcPSD|2193028 .equ N, 16 .data A: .word N valores enteros separados por comas B: .word N valores enteros separados por comas .text start: b) c) d) e) ldr r0, =A ldr r1, =B mov r4, #N L1: ldr r2, [r0] ldr r3, [r1] add r2, r2, r3 and r2, r2, #0xF str r2, [r0] add r0, r0, #4 add r1, r1, #4 sub r4, #1 cmp r4, #0 bne L1 end: b. (0.25 puntos) Con direcciones de 32 bits, indicar el formato de la dirección para MP y para la MC. (0.5 puntos) El programa se enlaza ubicando la sección .data a partir de la dirección 0x0C000000, y la sección .text se coloca a continuación de la sección .data. Obtenga los rangos de direcciones que ocupan el array A, el array B y las instrucciones, indicando para cada rango el/los bloques de memoria correspondientes, y el marco de bloque (bloque de cache) y la etiqueta asociados. (1 punto) Determine el número de aciertos y fallos de cache que se producirían al ejecutar el código anterior, hasta la primera vez que se ejecuta la instrucción que está en la etiqueta end. (0.75 puntos) Suponga que el programador cambia el valor N por 32. Obtenga de nuevo los bloques de memoria en que se ubicarían los datos y las instrucciones. Explique cualitativa y razonadamente cómo afectaría este cambio a los fallos de cache (No es necesario calcular el nuevo número de fallos, sólo explicar lo que sucedería). Ejercicio 3 (3 puntos) Dado un vector V de N componentes se dice que es Melchoriforme si posee al menos un elemento Rubio. Un elemento V[i] es Rubio si satisface la siguiente expresión: N −1 ∑ v [ j ] =2∗v [ i ] j=0 Se pide: a) (1 punto) Una subrutina SumaVector( V, N ) que sume los N elementos del vector V, respetando el convenio de llamadas a subrutinas visto en clase. b) (2 puntos) Un programa que dado un vector V y su dimensión N decida si es Melchoriforme, utilizando la subrutina SumaVector. Ejercicio 4 (1.5 puntos) El código de un determinado programa está constituido por instrucciones máquina con la siguiente frecuencia de ejecución: aritméticas 50%, carga 20%, almacenamiento 10% y salto condicional 20% (donde la mitad de los saltos se toman). En cierto procesador las instrucciones consumen los siguientes ciclos: aritméticas 4, carga 5, almacenamiento 4, salto no tomado 3, salto tomado 4. a) (0.5 puntos) Calcula el CPI del procesador al ejecutar este programa. Gedownload door Amor Sánchez (amorsanchezs@gmail.com) lOMoARcPSD|2193028 b) (0.5 puntos) Sabiendo que el programa se ha ejecutado en 8.2ms, y que la frecuencia del procesador es de 1GHz, calcula el número de instrucciones que se han ejecutado. c) (0.5 puntos) Suponiendo que por cada 100 instrucciones ejecutadas se produce 1 fallo de cache, que implica una penalización de 300 ciclos de reloj, calcula el nuevo tiempo de ejecución del programa. ¿Cuál sería entonces el nuevo CPI? Gedownload door Amor Sánchez (amorsanchezs@gmail.com) lOMoARcPSD|2193028 FUNDAMENTOS DE COMPUTADORES 18 de junio de 2014. Examen parcial del 2º cuatrimestre. Nombre__________________________________________________________DNI___________________________ __ Apellidos_________________________________________________________________________Grupo________ Gedownload door Amor Sánchez (amorsanchezs@gmail.com) X 0010 0001 101011 (sw) X 0101 0001 000000 (tipo-R) X 0111 0001 000100 (beq) X 1001 0 0 1 00 (add) 1 1 MemtoReg MDRWrite 0 0 0 0 0 RegWrite 0 RegDest 0 0 X 0011 0 0 0011 XXXXXX X 0100 0 0 0 1 0100 XXXXXX X 0000 0 0 0 0 0101 XXXXXX X 0110 0 0 0 0 0110 XXXXXX X 0000 0 0 1 0 0111 XXXXXX X 1000 0 0 0 0 1000 XXXXXX X 0000 0 0 0 0 1001 XXXXXX 0 0000 1001 XXXXXX 1 1010 0 0 1 00 01 (sub) 0 0 0 1010 XXXXXX X 0000 0 1 0 11 00 (add) 0 0 0 1 10 00 00 (add) 10 (funct) 1 1 XXXXXX 1 00 (add) 0 0010 0 10 IorD 100011 (lw) 01 MemRead 0001 0 MemWrite 1 OutWrite PCWrite 1 ALUOp IRWrite 0001 ALUScrB Estado siguiente X ALUSrcA Zero XXXXXX BWrite op 0000 AWrite Estado actual lOMoARcPSD|2193028 1 1 Gedownload door Amor Sánchez (amorsanchezs@gmail.com) 1 1 0 1 0 1 0 1 0 0 0 1 1 lOMoARcPSD|2193028 FUNDAMENTOS DE COMPUTADORES 18 de junio de 2014. Examen final . Nombre__________________________________________________________DNI____________________________ _ Apellidos_________________________________________________________________________Grupo________ Ejercicio 4 (2.5 puntos) Para el computador MIPS estudiado en clase, responder a las siguientes preguntas: c) (0.5 puntos) Qué instrucción/es, del repertorio de instrucciones del procesador MIPS estudiado en clase, se ven afectada/s y no se podrían ejecutar si se elimina de la ruta de datos el registro MDR, la entrada 1 del Mux que selecciona el dato que se escribe en el banco de registros, y por lo tanto dicho Multiplexor. d) (0.75 puntos) Partiendo de la ruta de datos completa del MIPS, se desea añadir una nueva instrucción Store con Direccionamiento Absoluto (SMDA). Se añade para ello un nuevo formato de instrucción con los siguientes campos (Op, Rs, dirección): El comportamiento de la instrucción SMDA sería el siguiente: SMDA Rs, dirección Mem[ExtCeros(dirección)] BR[rs] donde ExtCeros(dirección) extiende la dirección de 21 bits a 32 bits añadiendo ceros por la izquierda. Añade a la ruta de datos los cambios que tendrían que realizarse para poder ejecutar esta instrucción. e) (0.5 puntos) Añade los cambios necesarios en el diagrama de transición de estados del controlador para poder ejecutar correctamente esta nueva instrucción. f) (0.75 puntos) Indicar los cambios necesarios en la tabla de verdad del controlador (añadir las filas y columnas necesarias). Ejercicio 5 (3 puntos) Sea un computador con un procesador ARMv4. EL procesador cuenta con una memoria cache de emplazamiento directo de 256 bytes con bloques de 64 bytes, unificada para datos e instrucciones (se almacenan en la misma cache los bloques de instrucciones accedidos en la etapa FETCH y los bloques de datos accedidos durante las etapas que hacen acceso a memoria en las instrucciones ldr y str). f) (0.5 puntos) En dicho sistema se quiere ejecutar el siguiente programa. Explique razonadamente lo que hace el código. Gedownload door Amor Sánchez (amorsanchezs@gmail.com) lOMoARcPSD|2193028 .equ N, 16 .data A: .word N valores enteros separados por comas B: .word N valores enteros separados por comas .text start: g) h) i) j) ldr r0, =A ldr r1, =B mov r4, #N L1: ldr r2, [r0] ldr r3, [r1] add r2, r2, r3 and r2, r2, #0xF str r2, [r0] add r0, r0, #4 add r1, r1, #4 sub r4, #1 cmp r4, #0 bne L1 end: b. (0.25 puntos) Con direcciones de 32 bits, indicar el formato de la dirección para MP y para la MC. (0.5 puntos) El programa se enlaza ubicando la sección .data a partir de la dirección 0x0C000000, y la sección .text se coloca a continuación de la sección .data. Obtenga los rangos de direcciones que ocupan el array A, el array B y las instrucciones, indicando para cada rango el/los bloques de memoria correspondientes, y el marco de bloque (bloque de cache) y la etiqueta asociados. (1 punto) Determine el número de aciertos y fallos de cache que se producirían al ejecutar el código anterior, hasta la primera vez que se ejecuta la instrucción que está en la etiqueta end. (0.75 puntos) Suponga que el programador cambia el valor N por 32. Obtenga de nuevo los bloques de memoria en que se ubicarían los datos y las instrucciones. Explique cualitativa y razonadamente cómo afectaría este cambio a los fallos de cache (No es necesario calcular el nuevo número de fallos, sólo explicar lo que sucedería). Gedownload door Amor Sánchez (amorsanchezs@gmail.com) lOMoARcPSD|2193028 FUNDAMENTOS DE COMPUTADORES 18 de junio de 2014. Examen final. Nombre__________________________________________________________DNI____________________________ _ Apellidos_________________________________________________________________________Grupo________ Gedownload door Amor Sánchez (amorsanchezs@gmail.com) X 0010 0001 101011 (sw) X 0101 0001 000000 (tipo-R) X 0111 0001 000100 (beq) X 1001 0 0 1 00 (add) 1 1 MemtoReg MDRWrite 0 0 0 0 0 RegWrite 0 RegDest 0 0 X 0011 0 0 0011 XXXXXX X 0100 0 0 0 1 0100 XXXXXX X 0000 0 0 0 0 0101 XXXXXX X 0110 0 0 0 0 0110 XXXXXX X 0000 0 0 1 0 0111 XXXXXX X 1000 0 0 0 0 1000 XXXXXX X 0000 0 0 0 0 1001 XXXXXX 0 0000 1001 XXXXXX 1 1010 0 0 1 00 01 (sub) 0 0 0 1010 XXXXXX X 0000 0 1 0 11 00 (add) 0 0 0 1 10 00 00 (add) 10 (funct) 1 1 XXXXXX 1 00 (add) 0 0010 0 10 IorD 100011 (lw) 01 MemRead 0001 0 MemWrite 1 OutWrite PCWrite 1 ALUOp IRWrite 0001 ALUScrB Estado siguiente X ALUSrcA Zero XXXXXX BWrite op 0000 AWrite Estado actual lOMoARcPSD|2193028 1 1 Gedownload door Amor Sánchez (amorsanchezs@gmail.com) 1 1 0 1 0 1 0 1 0 0 0 1 1 lOMoARcPSD|2193028 Fundamentos de Computadores 17 de Junio de 2015. Examen Parcial 2º Cuatrimestre Nombre:____________________________________ DNI: ________________ Apellidos: ___________________________________________ Grupo: _____ Ejercicio 1. (3 puntos) Responde a las siguientes cuestiones, suponiendo que el vector V está almacenado a partir de la dirección de memoria 0x0C000000 y que el código se encuentra a continuación de los datos. El código almacena en la variable CuentaTotal el sumatorio de todos los números positivos que contiene el vector. Para realizar este sumatorio, se utilizan dos subrutinas: Cuenta y Averigua. El estudiante sólo necesita saber de la subrutina Averigua que como parámetro de entrada recibe el entero V[i] y como resultado devuelve: (1) el valor de V[i], si V[i] es positivo; (2) 0, si V[i] es negativo. .data V: .word 1,2,­3,4,5,9,17,­15,20,12 N: .word 10 .bss CuentaTotal: .space 4 .text start: ldr r0,=V ldr r1,=N bl Cuenta ldr r1, =CuentaTotal str r0, [r1] end: b end Cuenta: bucle: fin_bucle: PRÓLOGO_1 mov r2, #0 mov r5, #0 ldr r4, [r1] cmp r2, r4 beq fin_bucle ldr r3, [r0, r2, lsl #2] bl Averigua add r5, r5, r0 add r2, r2, #1 b bucle move r0, r5 EPÍLOGO_1 mov pc, lr a) (0,5 ptos.) Indicar el valor de la dirección de la etiqueta Cuenta, es decir, a qué dirección salta la instrucción bl Cuenta. Razona la respuesta. b) (1 pto.) La subrutina Cuenta no es correcta considerando el estándar de llamadas a procedimientos de ARM. Modificar el código de dicha subrutina para que respete este estándar. c) (0,5 ptos.). Codificar el prólogo y el epílogo de la subrutina Cuenta, teniendo en cuenta las modificaciones del apartado b. d) (1 ptos.). Codificar en ensamblador la subrutina Averigua. Gedownload door Amor Sánchez (amorsanchezs@gmail.com) lOMoARcPSD|2193028 Ejercicio 2 (3 puntos) a) (1 punto) En la ruta de datos del procesador MIPS visto en clase se ha cambiado el banco de registros. Ahora el banco de registros tiene un sólo puerto de lectura en vez dos, como se muestra en la figura. Completa la ruta de datos para que puedan seguir realizándose en todas las instrucciones las transferencias A <­ Rs y B <­ Rt. b) (1 punto) Modifica el diagrama de estados para que se puedan ejecutar correctamente todas las instrucciones que hemos considerado para el diseño del procesador. Añade nuevos estados si es necesario e indica si es necesario añadir alguna señal de control nueva. Gedownload door Amor Sánchez (amorsanchezs@gmail.com) lOMoARcPSD|2193028 c) (1 punto) Indicar los valores que van tomando todos los registros internos de la ruta de datos al final de cada etapa en la ejecución de la instrucción Add R1, R2, R3, sabiendo que el código de operación (OP) de las instrucciones aritmético­lógicas es (000000)2, el valor de los campos SHAMT y FUNCT para la instrucción Add es (00000)2 y (100000)2 respectivamente, y que el estado actual de la máquina es: R1=0x00000017, R2=0x00110011, R3=0x00000000 y PC=0x00003400. Recordar que el formato de las instrucciones Tipo­R es: Ejercicio 3 (3 puntos) Una jerarquía de memoria está compuesta por una memoria principal de 16 Mbytes y una cache con emplazamiento directo de 16 Kbytes. El tamaño de bloque es de 256 bytes. Sobre esta jerarquía de memoria se ejecuta un millón de accesos de lectura, obteniéndose una tasa de aciertos de 0,995. Se supone que el tiempo de acceso a la memoria principal es de 20 ns, el tiempo de acceso a la cache es de 1 ns y la penalización por fallo es de 400 ns. Responde a las siguientes cuestiones (0,5 puntos cada apartado): Nota: Todos los datos numéricos del problema están en decimal. Las respuestas numéricas pueden darse en el sistema decimal o hexadecimal, a elección del estudiante. a) Muestra el formato de la dirección para la Mp y la cache. b) Si el bloque nº 87 de la Mp tiene que llevarse a la cache ¿qué nº de bloque de cache se le asigna? c) ¿A cuántos bloques de Mp le corresponde el mismo bloque en la cache? Indica el nº del primer y el último bloque de Mp a los que les corresponde alojarse en el bloque 22 de la cache. d) ¿Cuál es el tiempo medio de acceso a memoria? e) ¿Cuánto se tarda en ejecutar la secuencia de accesos a memoria descrita? f) ¿Qué ganancia de velocidad se obtiene respecto del mismo sistema, pero sin la cache? Ejercicio 4 (1 punto) Al ejecutar un programa, P, en un computador, C , el rendimiento obtenido ha sido 400 MIPS. La frecuencia de reloj es de 1,66 GHz. a) (0,5 puntos) ¿Cuál ha sido el número medio de ciclos de reloj por instrucción? b) (0,5 puntos) Suponemos que P está compuesto por tres tipos de instrucciones del repertorio de C, cuya frecuencia de ejecución y duración en ciclos de reloj es, respectivamente, la siguiente: · Acceso a memoria: 30% , 5 ciclos · Aritméticas: 50%, 4 ciclos · Salto condicional: 20%, 4 ciclos si el salto se toma, 3 ciclos si no se toma. En promedio, de cada 100 saltos condicionales ejecutados ¿cuántos se han tomado? Gedownload door Amor Sánchez (amorsanchezs@gmail.com) lOMoARcPSD|2193028 Fundamentos de Computadores 16 de Junio de 2016. Examen Parcial 2º Cuatrimestre Nombre:____________________________________ DNI: ________________ Apellidos: ___________________________________________ Grupo: _____ Ejercicio 1 (3 puntos) Un procesador cuenta con una jerarquía de memoria que está compuesta por una memoria principal de 64MB y una cache con emplazamiento directo de 4KB con 16 bloques. En dicho procesador se ejecuta un código que genera accesos de lectura a memoria consecutivos a todas las direcciones entre 0x0300800 y 0x03017FF. a) (0.25 puntos) Muestra el formato de la dirección para la Mp y la cache b) (0.75 puntos) Indica los fallos de cache que provocará la ejecución del código indicando los bloques sobre los que se produce el fallo, asumiendo que la cache está inicialmente vacía c) (0.75 puntos) Indica cuál será el contenido del directorio (array de etiquetas o tags) tras finalizar la ejecución Supongamos que a continuación vuelve a ejecutarse el mismo código una segunda vez: d) (0.5 puntos) ¿Cuántos fallos de cache se producirían la segunda vez? e) (0.75 puntos) Si el tiempo de acceso a la memoria principal es de 20 ns, el tiempo de acceso a la cache es de 1 ns y la penalización por fallo es de 400 ns, indica cuál sería el tiempo medio de acceso a memoria y la ganancia que se obtiene respecto a un sistema sin cache (teniendo en cuenta las dos ejecuciones del código). Ejercicio 2 (1 punto) En un determinado computador con procesador ARM a una frecuencia de reloj de 1.5GHz se ejecuta el siguiente programa: L1: mov r4, ldr r5, mov r6, cmp r4, bge L2 ldr r0, add r6, add r4, b L1 #0 =A #0 #128 [r5, r4, lsl #2] r6, r0 r4, #1 L2: b . a) Suponiendo que las instrucciones aritmético lógicas tardan 4 ciclos, las instrucciones de carga tardan 5 ciclos, los saltos tomados 4 ciclos y los no tomados 3 ciclos, obtener el número medio de ciclos por instrucción para este programa (CPI) (hasta la primera vez que se ejecuta la instrucción b . ). b) En el apartado anterior se suponía un comportamiento ideal en el que todos los accesos a memoria se realizan en 1 ciclo de reloj, en cuyo caso las instrucciones de carga tardan los 5 ciclos de reloj indicados. Supongamos ahora que el sistema tiene una memoria cache en la que se produce un fallo por cada 16 ejecuciones de la instrucción ldr r0, [r5, r4, lsl #2] y que la penalización por fallo es de 100 ciclos. Teniendo en cuenta el tiempo adicional debido a las penalizaciones, calcular de nuevo el CPI. Gedownload door Amor Sánchez (amorsanchezs@gmail.com) lOMoARcPSD|2193028 Ejercicio 3 (3 puntos) Dado un vector, A, de 3*N componentes, se desea obtener un nuevo vector, B, de N componentes donde cada componente de B es la suma módulo 32 de una tripleta de elementos consecutivos de A. Es decir: B[0] = (A[0]+A[1]+A[2]) mod 32, B[1] = (A[3]+A[4]+A[5]) mod 32, etc Se pide: a) (1.25 puntos) Escribir un programa en lenguaje ensamblador del ARM que implemente el cálculo descrito de acuerdo con el siguiente código C equivalente: #define N 4 int A[3*N] = {una lista de 3*N valores}, int B[N]; int i, j=0; void main (void) { for (i=0; i<N; i++){ B[i] = sum_mod_32(A, j, 3); j=j+3 } } donde la subrutina sum_mod_32(V,p,m) devuelve como resultado la suma módulo 32 de m elementos consecutivos del vector V tomados a partir de la posición p. b) (1.25 puntos) Escribir el código ensamblador de la subrutina sum_mod_32, de acuerdo al siguiente código C equivalente: sum_mod_32 (int A[ ], int j, int len) { int i, sum=0; for (i=0; i<len; i++) sum = sum + A[j+i]; sum=mod_power_of_2(sum,5); return sum; } donde la subrutina mod_power_of_2(num, exp), siendo num un entero positivo y exp un entero mayor que 0 y menor que 32, devuelve como resultado el valor de (num mod 2^exp). Por ejemplo, si invocamos a la función como: mod_power_of_2(34, 5), la función devolvería como salida: ((34) mod (2^5))=(34 mod 32)=2. c) (0.5 puntos) El siguiente código ensamblador es una implementación de la subrutina mod_power_of_2, sin prólogo ni epílogo. Añadir el prólogo, el epílogo y añadir también comentarios ilustrativos a las instrucciones que expliquen cómo se va realizando el cálculo. Ayuda: Para entender el flujo del programa se sugiere considerar un caso concreto; por ejemplo, el caso del cálculo de módulo 25. mod_power_of_2: .... prólogo .... loop3: endloop3: mov mov mov r3,#0 r4,#0 r2,#1 cmp bge add mov add b and r4,r1 endloop3 r3,r3,r2 r2,r2, lsl #1 r4,r4,#1 loop3 r0,r0,r3 .... epílogo .... Nota.- En todos los apartados se debe respetar el estándar de llamadas a subrutinas estudiado en clase, y las variables pueden ubicarse en registros o en memoria (global o pila según corresponda). Gedownload door Amor Sánchez (amorsanchezs@gmail.com) lOMoARcPSD|2193028 Ejercicio 4. (3 puntos) Se desea añadir al procesador MIPS estudiado en clase la instrucción Load Upper Immediate, cuyo nemotécnico sería: LUI Rx, Immediate codificada como una instrucción Tipo-I: 6 5 5 110011 not used Rx 16 Immediate y cuya descripción se correspondería con el siguiente movimiento registro a registro: BR(Rx) <- (Immediate << 16) , PC <- PC + 4 es decir, el contenido del campo Immediate de la instrucción se desplaza 16 posiciones a la izquierda, rellenando con ceros por la derecha, y se almacena en el registro destino. a) (1 punto) Indicar los cambios necesarios en la ruta de datos del MIPS estudiada en clase. b) (1 punto) Indicar los cambios necesarios en el diagrama de transición de estados del controlador. c) (1 punto) Indicar los cambios necesarios en la tabla de verdad del controlador. PCWrite IorD MemWrite IRWrite RegDst AWrite ALUSrcA OutWrite ALUop Control de ALU RegWrite 1 MUX 1 0 4 busW 1 2 0 MUX MDR 1 MDRWrite MemtoReg <<2 Instruc. [15-0] BWrite Extensión de signo MemRead 3 Gedownload door Amor Sánchez (amorsanchezs@gmail.com) ALUSrcB ALUout busB Zero ALU RW busA A 0 Instrucción [15-11] DW RB MUX DR Banco de registros Instrucción [20-16] IR 1 B RA ADDR MUX Instrucción [25-21] Memoria MUX PC 0 0 lOMoARcPSD|2193028 Gedownload door Amor Sánchez (amorsanchezs@gmail.com) lOMoARcPSD|2193028 1 a) 18 8 Bloque P Etiqueta 14 M P 4 8 b) Contamos un acceso por dirección entre 0x0300800 y 0x03017FF La primera dirección corresponde al comienzo del bloque 0x03008, que le corresponde el bloque de cache M = 8 con etiqueta 0x0300. La última dirección corresponde al final del bloque 0x03017, al que le corresponde el bloque de cache M = 7, con etiqueta 0x0301. Por lo tanto se han accedido todos los bloques entre 0x03008 y el 0x03017, 16 en total. Se produce un fallo por bloque accedido, por tanto 16 fallos. c) M 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 V 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Etiqueta 0x0301 0x0301 0x0301 0x0301 0x0301 0x0301 0x0301 0x0301 0x0300 0x0300 0x0300 0x0300 0x0300 0x0300 0x0300 0x0300 d) Como todos los bloques accedidos están en cache, no se produce ningún fallo de cache e) Con cache: Gedownload door Amor Sánchez (amorsanchezs@gmail.com) lOMoARcPSD|2193028 T = Nº Accesos x Tiempo de acceso a cache + Nº de fallos x Penalización por fallo = = 2*2^12 x 1ns + 16 x 400 ns = 14,6 ms Sin cache: T = Nº Accesos x Tiempo de acceso a MP = 2*2^12 * 20 ns = 163,8 ms Speedup = 163,8 / 14,6 = 11,2 2 a) Nº de loads = 1 + 1*128 = 129 Nº de stores = 0 Nº de aritmetico lógicas = 2 + 3*128 + 1 = 387 Nº de saltos tomados = 1 + 1*128 +1 = 130 Nº de saltos no tomados = 128 CPI = (129*5 + 387*4 + 130*4 + 128*3) / (129+387+130+128) = 3097 / 774 = 4,0013 b) Tenemos que sumar al número de ciclos los ciclos adicionales de penalización: CPI = (3097 + 128/16 * 100) / 774 = 5,0349 3 .extern _stack .equ N, 4 .data A: .word .bss B: .space N*4 .text start: loop1: 20,12,63,45,140,34,20,30,40,45,55,65 ldr mov ldr ldr mov mov sp,=_stack fp,#0 r6,=A r7,=B r5, #0 r4, #0 @ r5 = loop counter i @ R4 = Index j cmp bge r5, #N endloop1 @ if loop exhausted, go to mov mov mov r0,r6 r1,r4 r2,#3 bl sum_mod_32 str add add b r0,[r7,r5,lsl#2] r5,r5,#1 r4,r4,#3 loop1 end @ prepare call parameters @ store B[i] @ i++ @ Gedownload door Amor Sánchez (amorsanchezs@gmail.com) lOMoARcPSD|2193028 endloop1: b . // Subroutine sum_mod_32 (non-leaf) sum_mod_32: push {r4-r8,fp,lr} add fp,sp,#4*(7-1) @ PROLOG mov mov mov mov r4,#0 r5,#0 r6,r0 r7,r1 @ @ @ @ mov r8,r2 @ number of elements to cmp bge add ldr add add b r4,r8 endloop2 r0,r7,r4 r3,[r6,r0,lsl#2] r5,r5,r3 r4,r4,#1 loop2 mov mov bl r0,r5 r1,#5 mod_power_of_2 r4 = i r5=sum dir A initial position of the addition add loop2: endloop2: sub pop mov sp,fp,#4*(7-1) {r4-r8,fp,lr} pc, lr @ r0 = i+j @ r3=A[i+j] @ increase sum @i++ @ EPILOG // Subroutine sum_mod_32 (leaf) mod_power_of_2: push {r4,fp} add fp,sp,#4*(2-1) @ PROLOG mov mov mov r3,#0 r4,#0 r2,#1 @ intialize the mask @ i: loop counter @ auxiliary value to create the cmp r4,r1 @ compare the counter to the bge add lsl endloop3 r3,r3,r2 r2,r2,#1 @ update the mask @ move the "one" to the next add b r4,r4,#1 loop3 @ i++ and r0,r0,r3 @ r0 = r0 mod 2^exponent mask loop3: exponent position endloop3: sub pop mov sp,fp,#4*(2-1) {r4,fp} pc,lr @ EPILOG .end 4 Gedownload door Amor Sánchez (amorsanchezs@gmail.com) lOMoARcPSD|2193028 a) PCWrite IorD IRWrite MemWrite RegDst AWrite ALUSrcA OutWrite ALUop Control de ALU RegWrite MUX 0 4 1 2 0 1 2 ALUSrcB <<2 BWrite 2 Extensión de signo << 16 Instruc. [15-0] MDRWrite 3 MUX MDR MemRead MemtoReg b) A <- BR( rs ) B <- BR( rt ) op = ‘110011 ’ 11 BR(rt) <-Inst[15-0] << 16 c) Gedownload door Amor Sánchez (amorsanchezs@gmail.com) ALUout busB busW 1 Zero 1 ALU RW busA A RB 0 Instrucción [15-11] DW Banco de registros Instrucción [20-16] DR MUX 1 IR Memoria ADDR B RA MUX Instrucción [25-21] MUX PC 0 0 X 0010 0001 101011 (sw) X 0101 0001 000000 (tipo-R) X 0111 0001 000100 (beq) X 1001 0 0 1 1 MemtoReg 0 1 0 0 0 1 0 0 0 0 0 0 00 (add) RegWrite 1 01 RegDest 0 0 MDRWrite IorD 100011 (lw) MemRead 0001 MemWrite 1 OutWrite PCWrite 1 ALUOp IRWrite 0001 ALUScrB Estado siguiente X ALUSrcA Zero XXXXXX BWrite op 0000 AWrite Estado actual lOMoARcPSD|2193028 0 0001 110011 (LUI) X 1011 0 0 0010 XXXXXX X 0011 0 0 0011 XXXXXX X 0100 0 0 0 1 0100 XXXXXX X 0000 0 0 0 0 0101 XXXXXX X 0110 0 0 0 0 0110 XXXXXX X 0000 0 0 1 0 0111 XXXXXX X 1000 0 0 0 0 1000 XXXXXX X 0000 0 0 0 0 1001 XXXXXX 0 0000 0 0 1 00 01 (sub) 0 0 0 1010 XXXXXX X 0000 0 1 0 11 00 (add) 0 0 0 1011 XXXXXX X 0000 0 0 0 0 1 0 1 1 10 10 00 00 (add) 00 (add) 10 (funct) 1 1 1 Gedownload door Amor Sánchez (amorsanchezs@gmail.com) 1 1 0 01 0 1 0 1 0 0 00 10 1 0 1 1 lOMoARcPSD|2193028 Fundamentos de Computadores 2ºC. 31 de mayo de 2019. Examen 2º Parcial (todos los apartados, 10 puntos). Examen Final (solo apartados en negrita, 5.5 puntos). Nombre:____________________________________ DNI: _________________ Apellidos: ____________________________FINAL/PARCIAL:_______________ Ejercicio 1. Queremos añadir una memoria cache a un procesador con arquitectura de 32 bits (bus de direcciones es de 32 bits y bus de datos de 32 bits). La Memoria Principal (MP) direcciona 4Gpalabras. La Memoria Cache (MC) direcciona 1 Kpalabras. Los bloques de memoria son de 16 palabras. a) (0.25 p) Muestra el formato de la dirección desde el punto de vista de la MP y de la MC. DirMP: 32bits : B:28bits, P:4bits DirMC: 10bits : E:22bits, M:6bits, P:4bits b) (0.25) ¿Cuál es el tamaño de la MP y de la MC en Bytes?(en la MC incluye las etiquetas del directorio y dos bits, uno de validez y otro de escritura por cada marco) MP: 2^32Palabras=2^32*2^2B =16GB MC: 2^10palabras*2^2B+2^6*(22+2)bits=4KB+64*4B=4KB+256B=1280B c) (0.25 p) ¿Qué bloques de MP ocupan los primeros 16KB? 16KB=4Kpal: 12 bits=> Nº de bloques ocupados 2^(12-4)=2^8=256 primeros bloques. d) (0.5 p) Traza a qué marcos de MC van los primeros 16KBytes de MP y con qué etiquetas. B0..B63 ->M0..M63 Etiqueta b0..00 B64..B127 ->M0..M63 Etiqueta b0..01 B128..B191 ->M0..M63 Etiqueta b0..10 B192..B255 ->M0..M63 Etiqueta b0..11 e) (0.25) Cuantos fallos se producen al leer las palabras que ocupan los primero 16KB de forma secuencial. Un fallo por bloque de MP que se trae a MC. 256 fallos f) (0.5) Si el TMP=20ns, TMC=1ns y Tfallo=100ns. ¿Cuantas veces es más rápido con MC que sin ella? TiempoMP=4Kaccesos*20ns=4*1024*20ns=81,92µs TiempoMC=4Kaccesos*1ns+256*100ns=29,696 µs SpeedUp=81,92µs/29,696 µs=2,76 veces más rápido con MC. g) (1 p) Disponemos de un Chip SRAM que tiene los siguientes puertos: CE#,OE# WE#, A9…A0 y D8…D0. Utilizando el chip anterior diseña una memoria cache (MC) que maneje 1Kpalabra (palabra=32bits). Nota: Solo direccionar palabras, no bytes. Las lineas de direcciones y de datos del chip indican que es capaz de direccionar 2^10 bytes. Tan solo habrá que situar 4 chips en paralelo (cuatro columnas) para conseguir 2^10 palabras. • No es necesario decodificador. • CE#,OE# WE# de cada módulo conectados directamente a CE#,OE# WE# de la entrada. • A11..A2 conectados directamente al puerto de entrada de direcciones (si el bus de direcciones es tamaño palabra sería las líneas A9..A0). Dar ambas soluciones por válidas. • El puerto de datos B31..B0 lo forman los 4 puertos de datos de los chips. B31..B24<->D8..D0 de 1ª columna, B23..B16<->D8..D0 de 2ª columna, B15..B8 <->D8..D0 de 3ª columna, B7..B0 <->D8..D0 de 4ª columna, Gedownload door Amor Sánchez (amorsanchezs@gmail.com) lOMoARcPSD|2193028 Ejercicio 2. Supongamos un programa de 256KB formado exclusivamente por instrucciones de 32 bits. Si se ejecuta en un procesador a una frecuencia de 1 GHz y se obtienen un rendimiento de 200 MIPS. a) (0.5) Calcula el CPI CPI= (10^9ciclos/s)/(200*10^6instr/s)= 5 b) (0.5 p) Calcula el tiempo de ejecución del programa suponiendo que cada instrucción se ejecuta una sola vez. Tiempo=256*2^10 B * 1instr/4B /(200 *10^6 instr/s)=327 µs Ejercicio 3. Añadir al procesador MIPS una instrucción que copie el valor de un registro en otro registro aplicando un número de desplazamientos aritméticos sobre el registro fuente, de forma similar a como lo hace la instrucción MOV de ARM. La instrucción en ensamblador sería: MOV Rt,Rs,#inmediato que se codifica como: y debe hacer la siguiente transferencia lógica: BR(Rt) <- DespArit(BR(Rs),inmediato), PC <- PC + 4 Se dispone de un módulo combinacional para implementar la función DespArit(Din,N), que hace N desplazamientos aritméticos, a la izquierda si N es positivo y a la derecha N si es negativo. 32 / / 32 Din Dout N 32 / Se pide: a) (1 punto) Indicar los cambios necesarios en la ruta de datos del MIPS estudiada en clase. Conectar: • Din a la salida del Registro A • N a la salida de ExtSign • Dout a la entrada b10 de Mux MemtoReg (Señal de control de 2 bits) Gedownload door Amor Sánchez (amorsanchezs@gmail.com) lOMoARcPSD|2193028 b) (1 punto) Indicar los cambios necesarios en el diagrama de transición de estados del controlador. Estado 1->Estado 11 si opcod=’MOV’ Estado11(BR(Rt) <- DespArit(BR(Rs),inmediato)) Como es un módulo combinacional se puede hacer todo en un ciclo (si da tiempo) Estado 11-> Estado 0 c) (1 punto) Indicar los cambios necesarios en la tabla de verdad del controlador. E0000 si OP=’MOV’ salto a E1011 (Señales de control igual) E1011: • Todas las escrituras en registros y memoria a 0 excepto RegWrite=1 • Todas las señales de control de multiplexores indiferentes excepto RegDst=0 y MemtoReg=10 (en esta columna habrá que completar a 2 bits) Gedownload door Amor Sánchez (amorsanchezs@gmail.com) X 0101 0001 000000 (tipo-R) X 0111 0001 000100 (beq) X 1001 0001 (mov) X 1011 0 0 MemtoReg 0 0 0 1 0 0 0 0 0 0 1 XXXXXX X 0011 0 0 0011 XXXXXX X 0100 0 0 0 1 0100 XXXXXX X 0000 0 0 0 0 0101 XXXXXX X 0110 0 0 0 0 0110 XXXXXX X 0000 0 0 1 0 0111 XXXXXX X 1000 0 0 0 0 1000 XXXXXX X 0000 0 0 0 0 1001 XXXXXX 0 0000 1001 XXXXXX 1 1010 0 0 1 00 01 (sub) 0 0 0 1010 XXXXXX X 0000 0 1 0 11 00 (add) 0 0 0 1011 XXXXXX X 0000 0 0 0 0 1 1 10 00 00 (add) 00 (add) 10 (funct) 1 0 0010 0 10 RegDest RegWrite 1 00 (add) MDRWrite IorD 101011 (sw) MemRead 0001 OutWrite 1 0010 01 ALUOp 1 X 0 0 ALUScrB 0 100011 (lw) 1 ALUSrcA 0 0001 0 BWrite 1 AWrite 1 MemWrite 0001 PCWrite X IRWrite XXXXXX 0000 Estado siguiente Zero op Estado actual lOMoARcPSD|2193028 1 1 1 1 0 01 0 1 0 1 0 0 00 10 1 1 1 1 Ejercicio 4. Se quiere cambiar una imagen de formato RGBA a formato CMYK para imprimirla. Para ello se utiliza el siguiente código de alto nivel. typedef struct _pixel_32_t { unsigned char R; %Canal de Rojo unsigned char G; %Canal de Verde unsigned char B; %Canal de Azul unsigned char A; %Canal de Transparencia } pixel32; %Un pixel ocupa una palabra de 32 bits. pixel32 rgba2cmyk(pixel32 rgba); %Se desconoce su implementación pues se suministra compilada %rgba es una palabra que contiene el pixel original RGBA. %Devuelve una palabra con el pixel en formato CMYK. void TraduceImagen(pixel32 *rgba,int N, int M) {%La imagen es un array de N*M pixeles(palabras) %pixel32 *rgba: será la dirección de memoria base del array. %N es el número de filas y M es el número de columnas for (int i=0;i<N*M;i++) rgba[i] = rgba2cmyk(rgba[i]); } a) (2 puntos) Escribir en ensamblador la subrutina TraduceImagen acorde al estándar AAPCS visto en clase. Gedownload door Amor Sánchez (amorsanchezs@gmail.com) lOMoARcPSD|2193028 b) (1 punto) Escribir un programa en ensamblador que prepare la pila y llame a la subrutina TraduceImagen. Debe asumir que las variables pixel32 mirgba[N],[M], int N e int M son variables creadas en otro fichero. .extern .extern .extern .extern .extern .global mirgba N M rgba2cmyk _stack start .text TraduceImagen: push {R4-R8,FP,LR} add FP,SP,#6*4 mov R4,R0 //&rgba mov R5,R1 //N mov R6,R2 //M mov R7,#0 //i=0 mul R8,R5,R6 //N*M fi: cmp R7,R8 bge finfi ldr R0,[R4,R7,LSL #2] bl rgba2cmyk str R0,[R4,R7,LSL #2] add R7,R7,#1 b fi finfi: pop {R4-R8,FP,LR} mov PC,LR start: ldr sp,=_stack mov fp,#0 ldr R0,=mirgba //&mirgba ldr R1,=N ldr R1,[R1] //Dato N ldr R2,=M ldr R2,[R2] //Dato M bl TraduceImagen b . .end Gedownload door Amor Sánchez (amorsanchezs@gmail.com)