miércoles, 9 de enero de 2013

Práctica 3. Jerarquía de memoria SIJEM 1

SIJEM es un simulador didáctico de jerarquías de memoria desarrollado como Proyecto Fin de Carrera en la Universidad de La Laguna.
Permite analizar el comportamiento de una jerarquía de memoria que incluye memoria virtual, memoria principal y varios niveles de memoria caché. A través de una interfaz gráfica podemos configurar la jerarquía de memoria y simular su comportamiento haciendo uso de ficheros de traza (el programa incorpora varios) procedentes de la ejecución de programas reales o inventados por el usuario.
En estas prácticas nos centraremos exclusivamente en el estudio de la memoria caché.
Ejercicio 1
En este comienzo se nos pide la lectura de la ayuda incorporada en el programa SIJEM.
Ejercicio 2
Utilizando el asistente de configuración, cargue el fichero Ejem4.cgf y deseleccione los niveles 2 y 3 de la memoria caché, cambiando el tamaño del bloque a 4096 bytes en la pantalla del nivel L3. En la pantalla de la caché de nivel 1, cambie el tamaño de la misma a 16 KB y seleccione en el recuadro de organización la opción “Mapeado directo”. Deje el resto de los datos de configuración tal como aparecen por defecto.
Pulsando siguiente se visualiza un resumen de la configuración del sistema. Pulsando en finalizar, elegimos un programa para simular. Marque “Fichero de direcciones” y seleccione el fichero “crafty_d.trd” localizado en el directorio de Ejemplos. Pulse de nuevo en finalizar, marque la opción búsqueda de páginas y pulse comenzar.
Ejecute completamente el programa mediante los controles de simulación y responda a las siguientes cuestiones:
¿Cuántos bloques tiene la caché de instrucciones de nivel 1? ¿Y la caché de datos? Cuatro en ambos casos.
La dirección de memoria principal tiene 20 bits (tamaño 1 MB). ¿Cómo se interpretan estos bits en la caché L1?
Bits destinados al índice: 2 bits (2^2)
Bits destinados a la etiqueta: 20 – 2 – 10 – 2 = 6 bits
Anote el número de aciertos en la memoria caché y en la memoria principal, respectivamente, así como el número de ciclos empleados por el programa.

Aciertos caché: 36
Aciertos MP: 42
Número de ciclos: 56.260
Ejercicio 3 Añada un nivel 2 a la caché de 32 KB de tamaño, manteniendo el resto de la configuración sin cambios. Ejecute de nuevo el mismo programa y responda a las siguientes cuestiones:
¿Cuántos bloques tiene la caché de nivel 2? 8 bloques.
¿Cómo se interpretan los bits de dirección en la caché L2? 5 bits de dirección, 3 de índice y 12 de palabra.
Anote el número de aciertos en la memoria caché (aciertos en L1, aciertos en L2 y aciertos totales) y en la memoria principal, respectivamente, así como el número de ciclos empleados por el programa. Compare los resultados con los obtenidos anteriormente.
L1: 41 aciertos, L2: 33 aciertos, totales: 74, mem.principal: 16, ciclos:38335
El número de aciertos en L1 es el mismo, los de memoria principal se reducen de 49 a 16 y el número de ciclos se reduce casi a la mitad.
Ejercicio 4 Manteniendo esta última configuración con dos niveles de caché, cambie la organización a “Completamente asociativa” y, posteriormente, a “Asociativa por conjuntos de 2 vías”. Compare los resultados con los obtenidos en los apartados anteriores.
Completamente asociativa: L1: 43 aciertos, L2: 34 aciertos, totales: 77, mem.principal:13 aciertos, ciclos: 34580.
Asociativa por conjuntos de dos vías: L1: 42 , L2: 36 , totales: 78 , mem.principal: 12 , ciclos: 33520.
Ejercicio 5 Añada un tercer nivel de caché L3 de 64 KB, manteniendo el resto de la configuración sin cambios. Ejecute de nuevo el mismo programa y responda a las siguientes cuestiones (considere sólo el caso de mapeado directo):
¿Cuántos bloques tiene la caché de nivel 3? 16 bloques.
¿Cómo se interpretan los bits de dirección en la caché L3?
Bits índice: 4 bits (2^4)
Bits etiqueta: 20 – 4 – 12 – 2 = 2 bits
Anote el número de aciertos en la memoria caché (aciertos en L1, aciertos en L2, aciertos en L3 y aciertos totales) y en la memoria principal, respectivamente, así como el número de ciclos empleados por el programa. Compare los resultados con los obtenidos anteriormente.
Aciertos caché L1: 34
Aciertos caché L2: 25
Aciertos caché L3: 12
Aciertos MP: 0
Números de ciclos: 33.765
Ejercicio 6 Probar dos de los siguientes ejemplos Ejem5.cfg, Ejem6.cfg, Ejem7.cfg, Ejem8.cfg, Ejem9.cfg y Ejem10.cfg con algunos de los ficheros de traza acabados en a (32bits de direcciones – 4GB memoria) y observar las diferencias entre los diferentes algoritmos de sustitución.
Anote en cada ejemplo la configuración de la memoria, el fichero de trazas utilizado y los resultados obtenidos(1) por cada algoritmo. Comente los resultados.
Ejem5.cfg
Ciclos: 218575
Fetch:0, Read: 67, Write: 33.
L1: 10 aciertos, L2: 1 acierto, L3: 4 aciertos, mem.principal: 21 aciertos, fallos: 64
Reemplazamientos: L1I:0, L1D:86, L2:81, L3:69
Ejem8.cfg
Ciclos: 242415
Fetch:0, Read: 67, Write: 33.
L1: 4 aciertos, L2: 1 acierto, L3: 0 aciertos, mem.principal: 31 aciertos, fallos: 64
Reemplazamientos: L1I:0, L1D:92, L2:87, L3:79
Los ejercicios han sido bastantes prácticos y didácticos. Tuve ciertos problemas para calcular el tamaño de la etiqueta ya que habíamos hecho pocos ejercicios en clase en ese momento y no comprendí demasiado bien su obtención. Por lo demás, veo perfecta la propuesta de ejercicios.

lunes, 7 de enero de 2013

Práctica 6 - Simula3MS


En esta práctica, al igual que en la anterior, utilizaremos el Simula3MS.

El objetivo de esta práctica es que el alumno/a identifique el camino de datos del procesador monociclo MIPS y compruebe su funcionamiento mediante el simulados SIMULA3MS.

Requisitos:

- Nos descargamos el programa llamado programa1:
- Tambien nos descargamos el Simula3MS (http://simula3ms.des.udc.es).

La práctica consta de 12 ejercicios que veremos a continuación.
EJERCICIO 1

1.- Abra el programa de nombre Programa1.
Nos descargamos el programa que requeríamos al comienzo de la práctica.


2.- Pinche sobre el botón ensamblar y compruebe que no se produce ningún error.

Pulsamos y vemos que no nos da ningún error en el recuadro de abajo.




3.- Si ha habido errores repase la sintaxis de las instrucciones ayudándose del manual. En caso contrario, pique sobre ejecutar para iniciar el proceso de simulación de ejecución del programa recién creado.

Al no producirse ningún error podemos seguir con el siguiente punto. Si se produce alguno nos fijamos bien en el código y vemos que hemos copiado bien el programa.
Pinchamos en ejecutar y nos saldrá algo como esto:


4.- Observe en la nueva ventana la zona que se destacan en la figura 2 además del código ubicado en el segmento de texto, figura 1:



5.- Haciendo uso del botón “Ciclo siguiente” avance hasta la primera instrucción lw.


6.- Localice e indique los elementos necesarios del camino de datos que realiza esta instrucción de tipo I:

Para realizar la instrucción lw $s0,0($t1) entran en juego la memoria de datos, dos multiplexores y el banco de registro.


7.- Las conexiones entre los elementos del camino de datos aparecen resaltados en verde. Describa con palabras y con lenguaje RTL todas las operaciones que tienen lugar hasta completar esta instrucción lw $s0,0($t1).

El dato se encuentra en memoria de datos, pasa por dos multiplexores a través del bus de datos hasta llegar al banco de registro donde dicho dato se cargará en el registro especificado ($s0).


8.- Indique el valor, en hexadecimal, que toman los siguientes registros y buses:

PC: 0x0040001c
Instrucción[31-0]: 0x8d300000
Instrucción[25-21]:0x00000008
Instrucción[20-16]:0x00000006
Instrucción [15-0]: 0x00000000
Bus de 32 bits tras la extensión de signo: 0xfffffffe
Dato leído 1: 0x10010000
Resultado de la ALU (ó dirección de memoria de datos): 0x00000000
Dato leído en memoria de datos: 0x0000000a
Dato a escribir en el banco de registros: $s3


9.- Haciendo uso del botón “Ciclo siguiente” avance hasta la última instrucción lw.¿Cambia en algo el proceso ya descrito de realización de la instrucción lw?. ¿Qué valores toman ahora los siguientes registros y buses?

El proceso es el mismo, simplemente se carga el siguiente valor del array.
Instrucción[15-0]:0x FFFFFFFE
Bus de 32 bits tras la extensión de signo: 1216


10.- Haciendo uso del botón “Ciclo siguiente” avance hasta la instrucción add. Observando el camino de datos destacado en verde, explique con sus palabras qué operaciones tienen lugar para la realización de la instrucción add.

El camino de datos es el rosa.
Los datos se cargan en diferentes registros($S1,$s2). Uno de ellos($s1) entra en la ALU. Cuando éste entra el segundo registro($S2) ocupa el bus de datos y se dirige hacia la ALU. Se produce la operación de suma(ADD) y el resultado se envía a un nuevo registro.


11.- ¿Se trata del mismo camino de datos utilizado para la instrucción Lw? Justifique su respuesta.

La instrucción LW no tiene el mismo camino que la instrucción ADD ya que LW no necesita el uso de la ALU. Simplemente un dato de memoria se carga en un registro del banco de registros de la CPU.

12.- Vuelva a la instrucción lw y observe cómo algunas líneas de control aparecen destacadas sobre las demás usando otro tono del color naranja. ¿Qué líneas de control actúan para cada una de las instrucciones analizadas?

Lw: LeerMem,MemaReg, FuenteALU,EsorReg.
Add: RegDect,ALUCp,EscorReg.

jueves, 3 de enero de 2013

Práctica 8 - WinDLXV

Esta práctica consiste, al igual que en la anterior ,en usar el programa WINDLXV, pero esta vez de una forma algo más avanzada.

En este caso las condiciones de partida que tenemos son las siguientes:


- 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
Ejercicio 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).

Se aumenta en un 24% la velocidad.

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 el este programa, compensa realizar dicha mejora desde el punto de vista de la relación coste/prestaciones.

 El rendimiento aumenta sólo en un 12%, con lo cual no compensa realizar dicha mejora ya que el coste es mayor al aumento del rendimiento.

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?

En este caso, el rendimiento de la máquina aumenta en un 18%, exactamente lo mismo del incremento del coste, el cambio, no compensa, aunque tampoco empeora.

d) ¿Tendría interés mejorar la latencia de la unidad de suma?


No, ya que no se están realizando ninguna operación de suma, con lo cual aunque se mejore la latencia de la unidad de suma, no influirá en nada.
Ejercicio 2Seleccione la opción “salto retardado” y ejecute el programa. ¿Qué ocurre? ¿Cuál es la causa? ¿Cuál sería la solución?

La ejecución del programa se hace de manera más rápida, la causa es que con esa opción no se comprueba si el salto ha sido o no efectivo, sino que simplemente ejecuta la siguiente instrucción. La solución debería de dar que el programa ha tardado más en ejecutarse.


Ejercicio 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.


.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
addi r1,r0,xtop

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


Determinar la ganancia de velocidad que se obtiene con respecto a la versión inicial del programa.


El nuevo código tarda un 10% más que el anterior, con lo cual es más lento.
Ejercicio 4Para 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).

 Este ejercicio lo subiré cuando los profesores de la asignatura me aclaren qué hay que hacer, ya que al menos yo y algunos compañeros, no entendemos.
Ejercicio 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 (señalado también en negrita) 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
addi r1,r0,xtop

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

El nuevo código posee un 2% más de velocidad que el anterior.
Ejercicio 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 he cambiado el orden de las instrucciones de lectura-escritura, antes las de escritura estaban antes que las de lectura ya que el código contaba con muchas detenciones del tipo Raw(lectura después de escritura) . 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


No he detectado ningún fallo en la práctica, está correcta, aunque sí que el enunciado del ejercicio 4 podría enfocarse de alguna otra forma para que pueda entenderse y así hacer posible su realización.

sábado, 29 de diciembre de 2012

Práctica 7 - WinDLXV


En esta práctica usaremos el programa WinDLXV que sirve para saber como nuestro ordenador ejecuta las órdenes que le indicamos, y como se va modificando el pipeline, entre otras cosas.

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

(Estas condiciones se modificaciones se hacen accediendo a la pestaña Arquitectura en el menú superior).
Ejercicio 1

a) Número total de ciclos de ejecución y CPI
b) Número (de ciclos) y distribución de las detenciones (stalls)
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)

a) 29 ciclos, 1993 ciclos por instrucción
b) 29 ciclos
c) 19 ciclos, 1267 CPI, 35% de ganancia

Básicamente el estos resultados se consiguen esperando a que el programa ejecute la sentencia completa de órdenes y luego si miramos en el cuadro superior derecho llamado Estadísticas miraremos los datos que nos piden. La ganancia la he calculado con una regla de tres, analizando los ciclos y el CPI de ambos casos.



Ejercicio 2

a) Número total de ciclos de ejecución y CPI
b) Número (de ciclos) y distribución de las detenciones
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
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?

a) 7 ciclos, 7000 CPI
b) 7 ciclos
c) 5 ciclos, 5000CPI, 29% de ganancia
d) Aritmético-lógicas ->         Suma/Resta: 3    Multiplicación: 6     División: 20
    Carga -> 13


Ejercicio 3

a) Número total de ciclos de ejecución y CPI
b) Número (de ciclos) y distribución de las detenciones
c) Ganancia del rendimiento al segmentar las unidades funcionales de punto flotante

a) 18 ciclos, 3000 CPI
b) 18 ciclos
c) 17% de ganancia


Ejercicio 4

a) Número total de ciclos de ejecución y CPI del programa inicial
b) Número de ciclos perdidos por dependencias tipo RAW en el programa inicial
c) Ganancia del rendimiento al reordenar las instrucciones

a) 86 ciclos, 7167 CPI
b) 14
c) 15% de ganancia

Todos los ejercicios se resuelven como en el primer caso.



Práctica 4 - Jerarquía de memoria SIJEM 2


En esta práctica aprenderemos el funcionamiento de la memoria caché y sus propiedades.

Dicha práctica consiste en una serie de preguntas tipo test (20 preguntas), acerca de dicho tema. Para ellos usamos el simulador SIJEM. Sin embargo, no es necesario el uso de este programa para responder algunas preguntas, ya porque la explicación sea trivial o se pueda resolver acudiendo a los conocimientos teóricos directamente.

La versión de SIJEM usada no es la proporcionada por el campus virtual de la UCA, ya que dicha versión solo funciona en equipos de 32 bits, por tanto, usamos una versión portable.

En cada pregunta se nos indica entre paréntesis los archivos de configuracion de los parámetros(.cfg) y de direcciones (.trd) que hay que usar.
Ejercicio 1 (Ejem4.cfg y crafty_d.trd) Si el tamaño de la memoria caché de nivel 3 es de 256KB y el tamaño de bloque es de 1KB, ¿Cuántos bloques puede almacenar la caché de nivel 3?
           a. 32
b. 64
c. 256
 

Como vemos, la lista de bloques va desde 0 hasta 255, por tanto, la respuesta correcta es la opción “c”.

Ejercicio 2 (Ejem4.cfg y crafty_a.trd) Si el tamaño de la memoria caché de nivel 1 es de 16KB y el tamaño de bloque es de 1KB, y teniendo en cuenta que está dividida en instrucciones y datos, ¿Cuántos bloques puede almacenar cada una de las divisiones de la caché de nivel 1?
a. 4
b. 8
c. 16





Como vemos, la lista de bloques va desde 0 hasta 15, por tanto, la respuesta correcta es la opción “c”.

Ejercicio 3 (Ejem4.cfg y crafty_a.trd) Si el tamaño del bloque de memoria caché es de
1024 Bytes ¿Cuántos bits son necesarios para representar el desplazamiento dentro del bloque?
a. 4
b. 8
c. 10

Viendo la parte de D.Caché, veremos que se divide en dos partes, cada una de 10 bits, por tanto, la respuesta correcta es la opción “c”.

Ejercicio 4 (Ejem4.cfg y crafty_a.trd) ¿Qué ventajas aporta que la memoria caché de nivel 1 esté dividida en dos?
a. No aporta ventaja, sólo permite ordenar mejor las páginas.
b. Aumenta el tamaño de la caché de nivel 1.
c. Aprovecha mejor el principio de localidad.

Probando con L1 dividido y no dividido, obtenemos simpre el mismo resultado (vease imágen), por tanto llego a la conclusión de que la respuesta correcta es la opción "a".

Ejercicio 5 (Ejem4.cfg y crafty_a.trd) ¿En qué posición se coloca un nuevo bloque dentro de la memoria caché sabiendo que estamos utilizando una estrategia de colocación de mapeado directo?
a. En la posición dada por la fórmula (Número de bloque) MOD (Número de bloques de caché).
b. En la posición dada por la fórmula (Identificador) MOD (Número de bloques de caché).
c. En cualquier posición libre que se encuentre.


Atendiendo a la formula, vemos que los operandos coinciden con el Número de bloque y el Número de bloques de caché, por tanto, la respuesta correcta es la opción “a”.

Ejercicio 6 (Ejem5.cfg y crafty_a.trd) ¿En qué posición se coloca un nuevo bloque dentro de la memoria caché sabiendo que estamos utilizando una estrategia de colocación completamente asociativa?
           a. En la posición dada por la fórmula (Número de bloque) MOD (Número de bloques de caché)
b. En la posición dada por la fórmula (Identificador) MOD (Número de bloques de caché)
c. En cualquier posición libre que se encuentre.

En ningun nivel vemos ninguna formula, por tanto la correcta es la opción "c".

Ejercicio 7 (Ejem11.cfg y crafty_a.trd) ¿En qué posición se coloca un nuevo bloque dentro de la memoria caché sabiendo que estamos utilizando una estrategia de colocación asociativa por conjuntos?
           a. En la posición dada por la fórmula (Número de bloque) MOD (Número de bloques de caché).
b. En la posición dada por la fórmula (Identificador) MOD (Número de bloques de caché).
c. En cualquier posición del conjunto dado por la fórmula (Número de bloque) MOD (Número de conjuntos de la caché).

En la imagen vemos que que hay bloques con el mismo numero, por lo cual, interpreto que estos consituyen un mismo conjunto, por tanto, la respuesta correcta es la opción "c".

Ejercicio 8 (Ejem11.cfg y crafty_a.trd) ¿Cuál es el tamaño del conjunto de una memoria asociativa por conjuntos de 2 vías?
            a. 1 bloque
b. 2 bloques
c. 4 bloques

La respuesta correcta es la opción “b”. No requiere mayor explicación, el número de vías es igual al número de bloques por conjunto.

Ejercicio 9 (Ejem5.cfg y crafty_a.trd) ¿Qué ocurre cuando no existe ninguna posición en la memoria caché a la que copiar un nuevo bloque, y hemos elegido una política de sustitución al azar?
            a. Se elige un bloque cualquiera para sustituir con el nuevo bloque.
b. El nuevo bloque no se escribe en la memoria caché.
c. Se elige el primer bloque de la memoria para sustituirlo con el nuevo bloque.

La respuesta correcta es la opción “a”. Al ser una pólitica de sustitución al azar, como su propio nombre indica, el bloque será sustituido en cualquier lugar.

Ejercicio 10 (Ejem6.cfg y crafty_a.trd) ¿Qué bloque de caché se reemplaza cuando elegimos una política de sustitución FIFO?
           a. Un bloque cualquiera elegido al azar.
b. El bloque que lleva más tiempo en memoria.
c. Se reemplaza aquel bloque que lleva más tiempo en memoria sin ser usado.

FIFO = First In First Out = Primero en entrar, primero en salir
La respuesta correcta es la opción “b”.

Ejercicio 11 (Ejem7.cfg y crafty_a.trd) ¿Qué bloque se reemplaza cuando elegimos una política de sustitución LRU?
           a. Un bloque cualquiera elegido al azar.
b. El bloque que lleva más tiempo en memoria.
c. Se reemplaza aquel bloque que lleva más tiempo en memoria sin ser usado.

LRU = Least Recently Used = Último usado recientemente
La respuesta correcta es la opción “c”.

Ejercicio 12 (Ejem9.cfg y crafty_a.trd) ¿Qué bloque se reemplaza cuando elegimos una política de sustitución LFU?
           a. Un bloque cualquiera elegido al azar.
b. El bloque que lleva más tiempo en memoria.
c. Se reemplaza aquel bloque que haya sido usado el menor número de veces.

LFU = Least Frequently Used = Menor frecuencia de uso
La respuesta correcta es la opción “c”.

Ejercicio 13 (Ejem4.cfg y crafty_a.trd) ¿Por qué no es necesaria una política de sustitución utilizando mapeado directo?
            a. Porque nunca se reemplaza una página.
b. Porque la página a reemplazar ya está determinada.
c. Porque la página a reemplazar siempre se elige al azar.


La página a reemplazar ya está determinada por la fórmula, como podemos ver en la imágen, por tanto, la respuesta correcta es la opción “b”.

Ejercicio 14 (Ejem4.cfg y crafty_a.trd) ¿Qué ocurre cuando la posición de la memoria caché a la que debemos copiar la nueva página procedente de memoria principal no está vacía sabiendo que estamos utilizando una estrategia de mapeado directo?
            a. La página de esa posición de memoria caché se sobrescribe con la nueva.
b. Se busca una nueva posición que esté libre.
c. La nueva página no se escribe en la memoria caché.






En la imágen se puede ver como directamente el bloque se sobrescribe con el nuevo valor, por tanto, la respuesta correcta es la opción “a”.

Ejercicio 15 (Ejem5.cfg y crafty_a.trd) ¿Por qué no es necesaria la parte de índice en la dirección del bloque utilizando una estrategia de colocación completamente asociativa?
      a. Porque la posición dentro de memoria caché no está definida, el bloque puede       colocarse en cualquier posición.
b. Porque el identificador determina la posición dentro de memoria caché.
c. Porque la memoria caché nunca se llena.
Por definición, la colocación completamente asociativa coloca los bloques en cualquier posición, por tanto, la respuesta correcta es la opción “a”.

Ejercicio 16 (Ejem11.cfg y crafty_a.trd) ¿Para qué se utiliza la parte de índice en la dirección del bloque utilizando una estrategia de colocación asociativa por conjuntos?
           a. Para obtener el conjunto donde colocar el bloque.
b. Para obtener la posición donde colocar el bloque.
c. Para obtener la posición del conjunto donde colocar el bloque.



Como vemos en la imágen, el número del campo "Ind"(Índice), no se refiere al número del bloque sino al del conjunto (hay bloques con el mismo número),por tanto, la respuesta correcta es la opción “a”.

Ejercicio 17 (Ejem4.cfg y crafty_a.trd) Cuando se utiliza escritura directa (write-through):
           a. La información se escribe en la caché y en la memoria principal.
b. La información se escribe sólo en la caché.
c. La información se escribe en la caché, en la memoria principal y en la memoria secundaria.

No soy capaz de averiguar la respuesta mediante el programa, por tanto, me baso en la teoría para responder. La respuesta correcta es la opción “a”.

Ejercicio 18 (Ejem4.cfg y crafty_a.trd) Cuando se utiliza escritura retardada (write-back):
           a. La información se escribe en la caché y en la memoria principal.
b. La información se escribe sólo en la caché.
c. La información se escribe en la caché, en la memoria principal y en la memoria secundaria.

No soy capaz de averiguar la respuesta mediante el programa, por tanto, me baso en la teoría para responder. La respuesta correcta es la opción “b”.

Ejercicio 19 (Ejem4.cfg y crafty_a.trd) ¿Para qué se utiliza el bit de modificación de la memoria caché?
           a. Indica si el bloque se ha modificado mientras se encontraba cargado en ese nivel de caché.
b. Indica si el bloque se ha modificado mientras se encontraba cargado en cualquier nivel de caché.
c. Indica que el bloque correspondiente a ese bloque en memoria principal se ha modificado.

Cada vez que el programa accede a un bloque de cualquier nivel de la caché ya ocupado, el bit de modificación en todos los niveles cambiaba de 0 a 1, por tanto, la respuesta correcta es la opción “b”.

Ejercicio 20 (Ejem4.cfg y Crafty_a.trd) Ejecuta algunas líneas del programa y contesta, ¿Cuándo se actualiza el bit de modificación del bloque?
           a. Cuando se produce una escritura en memoria.
b. Cuando se produce una lectura de memoria.
c. Cuando hay una instrucción.




El bit de modificación del bloque se acualiza cada vez que el tipo de instrucción es MEMWRITE, es decir, escritura en memoria, por tanto, la opción correcta es la "a".

martes, 25 de diciembre de 2012

Práctica 5 - Simula3M

En esta práctica haremos uso del simulador Simula3M (http://simula3ms.des.udc.es) para poder ejecutar programas en el lenguaje ensamblador del procesador MIPS R2000/R3000.

Requisitos:
  • Máquina Virtual de Java 1.5 o superior (Descargar Java).
  • Conocimientos sobre ensamblador MIPS (Usar manual adjunto).
El software Simula3M utilizado en esta práctica ofrece un entorno de simulación muy intuitivo por lo que no nos será difícil adaptarnos a él. 

Básicamente, consta de un editor dónde se escribe todo nuestro programa en ensamblador y luego hay dos botones, uno de ellos 'Ensamblar' sirve para comprobar si se han cometido errores y el segundo 'Ejecutar' sirve para simular la ejecución de nuestro programa.

Ejercicio 1
En el ejercicio 1 debemos hacer uso del manual proporcionado en esta práctica (Manual_Simula3MS.pdf) para aprender a usar el simulador Simula3M.

No tiene ninguna dificultad, simplemente leer dicho manual y comprenderlo.

Ejercicio 2
En el ejercicio 2 nos piden que escribamos un programa de ejemplo, para ello debemos hacer uso de lo aprendido en el ejercicio 1 para entender lo que hace el programa:



















En este programa de ejemplo, se definen dos números enteros de 32 bits, uno con valor 100 y otro con valor -10 y se reserva espacio para almacenar el resultado de la suma.

Luego, se leen de memoria y se almacenan en los registros $s0 y $s1 del banco de registro del procesador, se suman y por último, se guarda en memoria el resultado en la dirección que definimos al principio en la variable resultado.

Ejercicio 3
Una vez que hayamos escrito el programa debemos guardarlo y presionar el botón 'Ensamblar' para comprobar que no se produce ningún error.

Si se ha hecho bien, no debe dar ningún error.

Ejercicio 4
Si se ha obtenido errores debe solucionarse con la ayuda del manual, en caso contrario, presionamos en el botón 'Ejecutar' para proceder a la simulación de dicho programa.



Ejercicio 5
En este ejercicio deberemos ir anotando los cambios que se produzcan en los registros usados, en cada ciclo de programa, cada vez que pulsemos en 'Ciclo siguiente'.

El estado final de dichos registros es:



































Ejercicio 6
En este ejercicio debemos escribir otro programa de ejemplo, guardarlo, ensamblarlo y ejecutarlo y además explicar lo que hace:



















Explicación
Se define un vector array_word con 4 elementos del tamaño de una palabra con valores de 210, 240, 330 y 5640.
La dirección del vector es almacenada en el registro $t1. A continuación se va cargando cada elemento del vector en los registros $s0, $s1$s2 y $s3, que como son del tipo palabra, de una palabra a la siguiente habrá una diferencia de 4 bytes.

Contenido del segmento de datos de memoria al inicio de la ejecución
0x10010000: 0x3c090000
0x10010004: 0x35290000
0x10010008: 0x8d300000
0x1001000c: 0x8d310004

Contenido del registro t1 antes de la ejecución
t1: 00000000

Valor del registro PC antes de la ejecución:
PC: 00400000

Contenido del registro t1 después de la ejecución:
t1: 10010000

Contenido de los registros siguientes al término de la ejecución:
s0: 000000d2
s1: 000000f0
s2: 0000014a

Valor del registro PC al término de la ejecución:
PC: 00400018

Ejercicio 7
En este ejercicio probaremos un programa de ejemplo para hacer llamadas al sistema, apartado A.5. del manual.






















Ejercicio 8
En este ejercicio nos piden que creemos un programa que solicite por teclado tres valores enteros y los almacene en memoria en un vector llamado “vector” para el que previamente se habrán reservado cuatro palabras de memoria, tres para los enteros introducidos y un cuarto para guardar el resultado final. Luego complete el programa efectuando la suma de los elementos del vector construido y muéstrelo por pantalla.

.data
# Reservamos memoria para 4 enteros (4 bytes cada uno), tres sumandos y el resultado
vector: .space 16

.text
.globl main
main:

la $t0,vector # Cargar en registro $t0, la direccion base de vector

li $v0,5 # Establecer solicitud de entero que será almacenado en v0
syscall
move $s0,$v0 # Guardar el entero en $s0

li $v0,5 # Establecer solicitud de entero que será almacenado en v0
syscall
move $s1,$v0 # Guardar el entero en $s1

# Solicita valor
li $v0,5 # Establecer solicitud de entero que será almacenado en v0
syscall
move $s2,$v0 # Guardar el entero en $s2

# Sumar
add $t1,$s0,$s1 # t1 = s1 + s0
add $t1,$t1,$s2

# Guardar en memoria los valores leidos
sw $s0,0($t0)
sw $s1,4($t0)
sw $s2,8($t0)
# Guardar en memoria el resultado de la suma
sw $t1, 12($t0)

# Mover resultado a $a0 para mostrar por pantalla
move $a0, $t1
li $v0, 1
syscall

# Salimos
li $v0,10
syscall
_________________________________________________________________

La instrucción move no es válida en Simula3M.