practica Memoria Cache - Departamento de Informática Aplicada

Transcripción

practica Memoria Cache - Departamento de Informática Aplicada
Escuela Universitaria de Informática Ingeniería de Computadores ARQUITECTURA DE COMPUTADORES PRÁCTICA DE MEMORIA CACHÉ INTRODUCCIÓN Este documento contiene el enunciado de la práctica de memoria caché. OBJETIVO El objetivo de la práctica es incorporar al simulador de memoria caché simcache nuevas políticas y técnicas, y evaluar su impacto en el rendimiento de la caché. EL SIMULADOR El simulador (simcache) está escrito en lenguaje C y se ejecuta en entornos Linux. Está disponible para su descarga en la página Web de la asignatura (http://www.dia.eui.upm.es) INSTALACIÓN Para proceder a su instalación es necesario disponer de una cuenta en el servidor de prácticas de la asignatura (ac.eui.upm.es). Si se han realizado las prácticas anteriores se puede seguir usando el mismo nombre de usuario y palabra clave para acceder al servidor de prácticas. Para establecer una sesión interactiva desde Windows con el servidor puede utilizarse el programa Putty, que establece una sesión SSH (Secure Shell). Una vez establecida la conexión con el servidor se procederá a descargar y descomprimir/desempaquetar el software del simulador mediante los comandos: cd
wget
http://www.dia.eui.upm.es/asignatu/Arq_com/AC%20Grado/simcache1.0.tgz
tar xvfz simcache1.0.tgz
simcache1.0.tgz es el fichero que contiene el simulador en formato empaquetado y comprimido. Tras la ejecución del comando tar aparece un nuevo directorio de nombre ‘simcache-1.0’ en el directorio de conexión ($HOME), conteniendo los siguientes directorios : •
src
o los ficheros con los fuentes del simulador (extensiones .c y .h) o el fichero Makefile para poder compilar y enlazar el simulador mediante el comando make o el programa simcache ya compilado y enlazado para ser ejecutado en el servidor de prácticas. •
pruebas
Arquitectura de Computadores -­‐2-­‐ Práctica de Memoria Caché o Un subdirectorio con pruebas para cada apartado de la práctica. o Las modificaciones que se realicen al simulador deberán superar las pruebas recogidas en este subdirectorio. •
trazas-din
o Tres ficheros con referencias de memoria (cc1.trace, spice.trace y din.trace) para ser utilizados durante el desarrollo de la práctica. USO DEL SIMULADOR Para poder utilizar el simulador es necesario, en primer lugar, situarse en el directorio src, mediante el comando: cd simcache-1.0/src
El simulador tiene una interfaz de uso tipo comando con varias opciones: simcache1
[-t Tamaño] [-b TamañoBloque] [-f Correspondencia ]
[-p Politica] FicheroTrazas
Donde: • -­‐t2 Tamaño de la cache en octetos. El tamaño siempre será una potencia de dos. • -­‐b Tamaño del bloque/línea en octetos (potencia de dos) • -­‐f Función de correspondencia (D: Directa, A: Totalmente asociativa, 2, 4, 8: Asociativa de conjuntos de dos, cuatro u ocho vías ) • -­‐p Política de sustitución (A: Aleatoria, L: LRU, F:FIFO) • -­‐x 1 (Las direcciones, en los ficheros de referencias/trazas están en base en Hexadecimal). Si se omite está opción las referencias estarán en base decimal. • FicheroTrazas Nombre del fichero que contiene las referencias a memoria. 1
Si la variable de entorno PATH no contiene el directorio del simulador, será necesario llamar al simulador como ./simcache 2
El valor que aparece a continuación de la correspondiente opción está separado siempre por al menos un carácter blanco (p.e: -b 1024) Arquitectura de Computadores -­‐3-­‐ Práctica de Memoria Caché En caso de omitirse las opciones, la configuración por defecto es:
-t 1024 -b 16 -f D -p A
Un ejemplo de llamada al simulador es: ./simcache –t 1024 –b 16 –f A –p F –x 1 ../trazas-din/cc1.trace
FICHEROS DE REFERENCIAS Son ficheros de texto, en el que cada línea del fichero es una referencia (dirección) a memoria. Las referencias pueden expresarse en base decimal o hexadecimal. El simulador se suministra con tres ficheros de referencias en el subdirectorio trazasdin (en formato hexadecimal) y también están disponibles referencias en el directorio subdirectorio pruebas. Las referencias del subdirectorio trazas-din contienen ficheros con las referencias generadas por varios programas informáticos como el compilador del lenguaje C. Estos ficheros se utilizarán para medir el comportamiento de una determinada configuración de memoria caché. Por el contrario, los ficheros de referencias del subdirectorio pruebas se utilizarán para tareas de implementación y pruebas en los diferentes apartados de la práctica. RESULTADOS MOSTRADOS POR EL SIMULADOR Los resultados que obtiene el simulador se muestran por pantalla y son: ./simcache -t 1048576 -b 8 -f D -p A -x 1 ../trazas-din/cc1.trace
Tamaño de la cache = 1048576
Tamaño del bloque = 8
# accesos
# aciertos
# Fallos por carga inicial
# Fallos por conflicto
# Fallos por capacidad
# Fallos totales
Tasa acierto
=
=
=
=
=
=
=
1000002
976897
21151
1954
0
23105
97.689507% ‘# accesos’ representa el número de accesos a la memoria caché y coincide con el número de líneas del fichero de referencias/trazas. ‘# aciertos’ indica cuántos accesos han sido éxito. ‘# Fallos por carga inicial’ indica el número de fallos de caché provocados al estar vacía la caché. Arquitectura de Computadores -­‐4-­‐ Práctica de Memoria Caché ‘# Fallos por conflicto’ para las funciones de correspondencia directa o asociativa de conjuntos, indica cuántas veces la línea dónde a utilizar ya estaba ocupada por otro bloque. ‘# Fallos totales’ es la suma de los anteriores. ‘Tasa de acierto’ recoge el porcentaje de aciertos en la caché. Además de estos resultados, el simulador genera dos ficheros en el directorio de ejecución del simulador de nombres ‘DEBUG’ y ‘CACHE-­‐LINEAS’ respectivamente. El fichero DEBUG contiene una línea por cada acceso a la cache, cada línea está dividida en tres campos, si es directa o asociativa, y en cuatro si es asociativa de conjuntos. Los campos están separados por el carácter dos puntos (:) En el formato de tres campos, el primero corresponde a la dirección, el segundo indica qué ocurrió en el acceso a la caché (acierto, fallo) y el tercero el número de línea utilizado. En el caso de cuatro campos, el último indica qué conjunto se utilizó en el acceso. El fichero DEBUG está pensado para realizar labores de depuración cuando se añade o modifica una nueva funcionalidad del simulador. El fichero CACHE-­‐LINEAS recoge la historia de accesos a la caché. Este fichero permite comprobar el correcto funcionamiento de los diferentes apartados de la práctica. Cada línea de CACHE-­‐LINEAS indica qué número de línea de la caché ha sido accedida. Para todos los apartados de la práctica se proporcionan, en el subdirectorio pruebas, una serie de ficheros CACHE-­‐LINEAS junto con su fichero de referencias y su fichero DEBUG, lo que permitirá comprobar si un determinado apartado de la práctica funciona o no de acuerdo al enunciado del mismo. Para realizar la comprobación bastara con comparar el fichero CACHE-­‐LINEAS proporcionado con la prueba y el fichero CACHE-­‐LINEAS generado por el simulador. MODIFICACIÓN DEL SIMULADOR ENTORNO DE DESARROLLO Para el desarrollo de la práctica únicamente se necesita el compilador del lenguaje C (gcc), la herramienta make y un editor de texto (por ejemplo vi). También puede ser de gran ayuda la utilización de un depurador como gdb (google “gdb manual de usuario”) Como ya se ha comentado anteriormente para conectarse al servidor de prácticas es necesario un cliente SSH (en Windows Putty), suponiendo que la conexión se realiza desde un ordenador remoto con sistema operativo Windows. Arquitectura de Computadores -­‐5-­‐ Práctica de Memoria Caché Otra opción disponible para editar los fuentes del simulador, desde un ordenador Windows, es conectar como unidad de red el directorio del simulador en el servidor de prácticas. También es posible editar los fuentes con cualquier editor de texto disponible en el ordenador Windows. La compilación del simulador obligatoriamente debe realizarse mediante una conexión SSH con el servidor de prácticas. COMPILACIÓN Cómo ya se ha indicado anteriormente se proporcionan los ficheros fuente del simulador en el subdirectorio src, junto con el fichero Makefile que permite realizar la compilación automática de los fuentes, mediante la herramienta make, disponible en todos los sistemas Linux. El fichero Makefile proporcionado permite dos opciones en la llamada a make: • clean Borra todos los objetos y ficheros temporales del simulador, dejando únicamente los ficheros fuente. • all
Compila los ficheros fuente con el compilador de C (gcc). Si no existe ningún error de compilación el resultado es el fichero ejecutable del simulador (simcache)
Para construir el simulador basta con llamar a la herramienta make con la opción all en el directorio src del simulador (make all) Make únicamente compila los fuentes que se hayan visto implicados en una modificación. La opción clean (make clean) provoca que en la siguiente llamada a make all se realice una compilación completa de los ficheros fuente. FUENTES DEL SIMULADOR
Los fuentes del simulador están situados en el subdirectorio src. El simulador consta de siete ficheros de definición (con extensión h) y siete ficheros con código (con extensión c). A continuación se describe de forma somera cada uno de ellos, una descripción más detallada se puede encontrar en cada uno de ellos. aleatorio.h y aleatorio.c Contienen dos funciones para generar números aleatorios. En el fichero .h se definen las funciones y el .c se encuentra su implementación. Arquitectura de Computadores -­‐6-­‐ Práctica de Memoria Caché debug.h y debug.c Contienen tres funciones que permiten escribir informaciones de depuración en un fichero de texto. ent-­‐sal.h y ent-­‐sal.c Contienen tres funciones que permiten leer direcciones de acceso a memoria contenidas en un fichero de referencias/trazas. tiempo.h y tiempo.c Dispone de dos funciones; una para recuperar la hora del sistema con precisión de microsegundos; y la otra permite comparar dos tiempos. cache.h y cache.c Define la constante (MAX_NUM_LINEAS) con el número máximo de líneas en una caché y varios tipos enumerados para manejar la función de correspondencia, política de ubicación y tipo de acceso. También proporciona el tipo de datos para representar una memoria caché, así como las funciones para inicializarla y de acceso. En el fichero cache.c hay varias funciones con ámbito de visibilidad local como daNumLinea, daConjunto y daEtiqueta todas ellas utilizan operadores para realizar operaciones sobre bits tales como desplazamiento a la derecha (>>) and aritmético (&) y complemento (~). Para calcular el logaritmo en base dos se utiliza la expresión log2 N = log10 N/ log10 2 Para implementar la política de sustitución de líneas se utiliza la función local eligeLinea, que es la encargada de seleccionar la línea a sustituir. En la versión proporcionada del simulador únicamente están disponibles las políticas FIFO (primero en entrar, primero en salir), LRU (la menos recientemente utilizada) y Aleatoria (cualquiera de las líneas). La función AccesoCache es la encargada de comprobar si la dirección que se pretende acceder, dependiendo de la función de correspondencia configurada, está o no en la caché. contadores.h y contadores.c Define la estructura de datos y las funciones para manejar las estadísticas de uso de la caché. linea.h Define la estructura de datos que representa una línea de la caché. Arquitectura de Computadores -­‐7-­‐ Práctica de Memoria Caché list.h y list.c Facilita la apertura, cierre y escritura en el fichero CACHE-­‐LINEAS. simcache.c Contiene el programa principal (función main) que está formando por dos partes diferenciadas; en la primera se analizan los argumentos con los que se llama al simulador. La segunda es la encargada de inicializar la caché, abrir los diferentes ficheros que se utilizan y, por último, leer direcciones del fichero de trazas y acceder a la memoria caché. El acceso a los argumentos de llamada a simcache se realiza en el bucle: while ((c = getopt (argc, argv, "t:b:f:p:x:h")) != -1)
que utiliza la función getopt para recuperar los diferentes argumentos de llamada. El tercer parámetro de la llamada a getopt es la lista de los argumentos disponibles en el simulador. Tras la llamada a getopt en la variable c queda almacenada la opción procesada. El bucle while finaliza cuando se han procesado todos los argumentos, presentes en la llamada al simulador. La información que acompaña a cada argumento es siempre una tira de caracteres que, dependiendo del argumento requerirá un tratamiento u otro, por ejemplo, para las opciones –t y –b el argumento que acompaña es un número y, por lo tanto, será necesario convertir la tira de caracteres a un entero decimal (función de biblioteca atoi). Pero para el argumento –f es simplemente una letra mayúscula que indica la función de correspondencia. case 't':
tamCache = atoi (optarg);
break;
optarg es una variable global definida en el fichero de cabecera <unitstd.h> y que se actualiza con cada llamada a la función getopt. APARTADOS DE LA PRÁCTICA La práctica consta de tres apartados: • Familiarización con el simulador. • Modificación del simulador para incorporar nuevas técnicas de mejora del rendimiento de la caché. • Impacto de las nuevas técnicas en la tasa de acierto. Arquitectura de Computadores -­‐8-­‐ Práctica de Memoria Caché PRIMER APARTADO En este apartado se evaluarán diferentes configuraciones de memoria caché. A continuación se describen una serie de configuraciones. En todas ellas será necesario identificar el tamaño de bloque que mejor tasa de acierto global ofrezca. • Tamaño de caché: 64 KB, 256 KB y 1 MB • Función de correspondencia: Directa, Asociativa, Asociativa de Conjuntos de 4 vías. • Política de sustitución: LRU y Aleatoria • Fichero de trazas/direcciones: cc1.trace Para facilitar la interpretación de los resultados se sugiere utilizar una hoja de cálculo (Excel) y realizar una gráfica por cada tamaño de caché y política de sustitución (eje X tamaño de bloque, eje Y tasa de acierto) SEGUNDO APARTADO Para este segundo apartado se pide incluir en el simulador la política de sustitución LFU (menos frecuentemente utilizada). Para ello será necesario incluir una nueva opción U en el argumento –p de la llamada al simulador. En el caso de que dos o más líneas sean candidatas a abandonar la memoria caché, aplicando el algoritmo LFU, se expulsará a la línea cuyo número de línea sea menor. Los cambios a realizar en los fuentes del simulador son: •
simcache.c Incluir la opción en la función uso() de ayuda. Procesar la nueva opción U en la llamada a la función getopt • cache.h Incluir una nueva política de sustitución en el enumerado correspondiente. • linea.h Incluir un nuevo campo en la estructura de datos LINEA para mantener la frecuencia de uso de cada línea/bloque de la caché. • cache.c Modificar las funciones eligeLinea y AccesoCache. La primera permite seleccionar la línea de acuerdo a la política LFU. Y en la segunda, entre otras tareas, actualiza las informaciones necesarias para aplicar las políticas de sustitución. Para probar el correcto funcionamiento de la nueva política se sugiere utilizar las pruebas del subdirectorio pruebas/apartado-2. En el apartado de pruebas se describe el procedimiento de realización de las mismas. Arquitectura de Computadores -­‐9-­‐ Práctica de Memoria Caché TERCER APARTADO En este apartado se añadirá una caché de victimas al simulador que estará únicamente disponible cuando la función de correspondencia sea la Directa. El tamaño de la caché de victimas será de 8 líneas. La política de sustitución en la caché de victimas será la indicada en el argumento –p de la llamada al simulador. El funcionamiento de la caché de victimas será el siguiente: • Si hay fallo en la memoria caché, la línea está ocupada y el bloque NO está presente en la caché de victimas, se llevará el bloque a expulsar de la memoria caché a la caché de victimas, cargándose en la memoria caché el bloque que ha generado el fallo. Se contabilizará una fallo de caché. • Si hay fallo en la memoria caché, la línea está ocupada y el bloque SI está presente la caché de victimas, el bloque de memoria caché se llevará a la caché de victimas y viceversa. Se contabilizará un acierto. • Cuando se inserte un bloque en la caché de victimas (tras su expulsión de la memoria caché) habrá que comprobar si hay líneas disponibles para almacenarlo, en caso de que la caché de victimas esté llena se aplicará la política de sustitución para liberar una línea para el bloque que está siendo expulsado de la caché. • Siempre que un bloque sea expulsado de una línea de la caché y pase a la caché de victimas o viceversa, las informaciones utilizadas para implementar las políticas de sustitución (en este caso únicamente LFU) permanecerán sin cambio en la cache de victimas. Ejemplo de funcionamiento de la caché de Victimas Supongamos una memoria caché de 4 líneas de 2 octetos, con correspondencia directa y una caché de victimas de 8 entradas (líneas) con política de sustitución LRU (se elige la línea menos recientemente utilizada). Supongamos por ejemplo que los accesos a memoria son: 0, 8, 16, 24, 32, 40, 48, 0, 56, 64, 72 y 80. A todos estos accesos les corresponde la línea la 0 de la caché. En el seguimiento del funcionamiento de la caché se muestra la dirección y no el nº de bloque de cada dirección. Tras el acceso 0 – Fallo “Carga Inicial” Arquitectura de Computadores -­‐10-­‐ Práctica de Memoria Caché Caché Victimas Línea 0 0 0 1 2 3 4 5 6 7 Tras el acceso 8 – Fallo “Carga Inicial” Caché Victimas Línea 0 0 8 1 0 2 3 4 5 6 7 Tras el acceso 16 – Fallo “Carga Inicial” Caché Victimas Línea 0 0 16 1 0 2 3 8 4 5 6 7 Tras el acceso 24 – Fallo “Carga Inicial” Caché Victimas Línea 0 0 24 1 0 2 8 3 16 4 5 6 7 Tras el acceso 32 – Fallo “Carga Inicial” Caché Victimas Línea 0 0 Arquitectura de Computadores 1 2 -­‐11-­‐ 3 4 5 6 7 Práctica de Memoria Caché 32 0 8 16 24 Tras el acceso 40 – Fallo “Carga Inicial” Caché Victimas Línea 0 0 40 1 0 2 8 3 16 4 24 5 32 6 7 Tras el acceso 48 – Fallo “Carga Inicial” Caché Victimas Línea 0 0 48 1 0 2 8 3 16 4 24 5 32 6 40 7 Tras el acceso 0 – Acierto en caché victimas Caché Victimas Línea 0 0 0 1 48 2 8 3 16 4 24 5 32 6 40 7 Tras el acceso 56 – Fallo “Carga Inicial” Caché Victimas Línea 0 0 56 1 48 2 8 3 16 4 24 5 32 6 40 7 0 Tras el acceso 64 – Fallo “Carga Inicial” Caché Victimas Línea 0 0 Arquitectura de Computadores 1 2 -­‐12-­‐ 3 4 5 6 7 Práctica de Memoria Caché 64 48 8 16 24 32 40 0 56 Tras el acceso 72 – Fallo “Carga Inicial” , aplicar LRU en victimas (entrada 1) Caché Victimas Línea 0 0 72 1 48 2 64 3 16 4 24 5 32 6 40 7 0 56 Tras el acceso 80 – Fallo “Carga Inicial” , aplicar LRU en victimas (entrada 2) Caché Victimas Línea 0 0 80 1 48 2 64 3 72 4 24 5 32 6 40 7 0 56 PRUEBAS Como ya se ha indicado anteriormente se proporciona una batería de pruebas para cada apartado de la práctica. Las pruebas del apartado 2 se encuentran en el subdirectorio pruebas/apartado-2 y las del apartado 3 en pruebas/apartado-3. Dentro de cada uno de ellos hay una serie de directorios con diferentes pruebas. El nombre de estos directorios está formado por la concatenación de las diferentes opciones de invocación del simulador, así por ejemplo, el nombre 8b-2b-fA corresponde a una configuración de memoria caché con un tamaño de 8 octetos, líneas de 2 octetos y función de correspondencia asociativa. A su vez cada uno de estos directorios, como por ejemplo, pruebas/apartado2/8b-2b-fA contiene los siguientes tipos de fichero para cada prueba: • trace. Ficheros con referencias • debug. Ficheros con las trazas de ejecución del simulador (ficheros DEBUG) • cache-­‐lineas. Ficheros con la secuencia de líneas accedidas durante una simulación (CACHE-­‐LINEAS) • resultado. Ficheros con el resultado de la simulación, indicando entre otras, la tasa de acierto, número de fallos, etc. Arquitectura de Computadores -­‐13-­‐ Práctica de Memoria Caché Cada prueba está formada por cuatro ficheros, formándose el nombre de los ficheros mediante un número consecutivo, el carácter ‘.’ y un sufijo que indica el tipo de la información que almacena.. Así por ejemplo la prueba nº 3 está formada por los ficheros siguientes: • 1.trace • 1.resultado • 1.DEBUG • 1.CACHE-­‐LINEAS Para realizar una prueba basta con llamar al simulador utilizando la configuración y las referencias almacenadas en el fichero trace. Supongamos que se quiere realizar la primera prueba, guardada en el directorio pruebas/apartado-2/8b-2b-fA, la llamada al simulador sería: simcache -t 8 -b 2 -f A –p LFU ../pruebas/apartado-2/8b-2bfA/1.trace
La política es LFU ya que el apartado 2 de la práctica se pide la implementación de esta política. Suponiendo que en la invocación al simulador se realiza desde el directorio simcache-1.0/src Para comprobar si la prueba se ha realizado correctamente bastará con comparar que: • el resultado obtenido es el mismo que el almacenado en el fichero simcache-1.0/pruebas/apartado-2/8b-2-fA/1.resulado • y que el fichero CACHE-­‐LINEAS, generado en el directorio src es idéntico al fichero 1.CACHE-LINEAS. Para realizar está comparación se puede utilizar la utilidad diff de Linux diff CACHE-LINEAS ../pruebas/apartado-2/8b-2b-fA/1.CACHE-LINEAS
(suponiendo que se está situado en el directorio src)
Si ambos ficheros son iguales, el comando diff no muestra nada por pantalla, si son distintos indica las diferencias entre uno y otro. Arquitectura de Computadores -­‐14-­‐ Práctica de Memoria Caché ENTREGA DE LA PRÁCTICA Para entregar la práctica se utilizará el programa ac-entrega.sh que estará disponible en el servidor de prácticas. Podrán realizarse cuantas entregas de la práctica se estime oportuno, pero solo será valida, a efectos de evaluación, la última. Para utilizar el programa de entrega bastará llamarlo, sin ningún parámetro, desde la shell (bash) de Linux. EVALUACIÓN • Para dar por superado cada apartado de la práctica es necesario que las prácticas entregadas superen todas las pruebas proporcionadas en el directorio pruebas. • Únicamente es necesario entregar los apartados 2 y 3 de la práctica. • Para la obtención de la calificación final se realizarán pruebas adicionales. Arquitectura de Computadores -­‐15-­‐ Práctica de Memoria Caché 

Documentos relacionados