ARQUITECTURA DE COMPUTADORES (2º ING. INFORMATICA) PRACTICA 7 (CURSO 2006/07) MEMORIAS CACHE OBJETIVOS: La presente práctica pretende ilustrar el funcionamiento de las memorias caché a través del uso del simulador gráfico Visual Cache 1.0. Dicho simulador, desarrollado íntegramente en esta Facultad1, permite realizar un seguimiento del proceso que internamente tiene lugar en estos dispositivos, así como comprender las distintas alternativas de diseño: cachés separadas o unificadas, grado de asociatividad, política de escritura, algoritmo de reemplazo, etc. Dado su carácter didáctico, sólo incluye cachés de un solo nivel. El usuario puede configurar todas las características del sistema mediante ventanas interactivas. El simulador es trace-driven, es decir, la entrada del simulador es un fichero de trazas de memoria. Cuando el procesador accede a memoria, coloca una determinada información en su bus de direcciones. Esta información puede ser recogida por software o hardware y almacenada en un fichero. Por tanto, los ficheros de trazas no son más que ficheros cuyos registros poseen información referente a la dirección de memoria accedida por el procesador, al tipo de acceso del que se trata (Acceso en lectura o en escritura) y el tipo de información al que se está accediendo (Datos o Instrucciones). Esto es lo habitual en los estudios de prestaciones de sistemas de memoria. No interesa que la entrada de datos sea código máquina, que necesariamente es dependiente del procesador, ni código de alto nivel, donde es difícil aislar los accesos al sistema de memoria. Por el contrario, un fichero de trazas de memoria sólo incluye la información interesante desde el punto de vista del sistema de memoria. Las trazas usadas en Visual Cache 1.0 tienen el siguiente formato: • Un carácter indicativo del tipo de acceso que se está realizando (L ÆLectura o W Æ Escritura). • Un campo con la dirección referenciada (en hexadecimal, 8 dígitos). • Un carácter indicativo de si el acceso es a un dato o a una instrucción (DÆ Dato o I Æ Instrucción). • Finalmente, un campo de 2 dígitos decimales con el tamaño del dato accedido en bytes. Ej: L 0x000000FF I 04 El usuario puede editar y modificar el fichero de trazas para probar secuencias de acceso que ilustren los aspectos deseados. La simulación de la traza puede realizarse de una vez, pero para nuestros propósitos será preferible hacerlo paso a paso, para observar el funcionamiento interno de la caché. Para trazas muy largas, pueden también insertarse puntos de ruptura (breakpoints). PARTE 1. En esta parte se debe simular la ejecución del siguiente código: for(i=1;i<=MAX;i++) x[i]=x[i]+1; Suponiendo un procesador tipo RISC de 32 bits (es decir, con instrucciones y datos todos de tamaño 32 bits), el código máquina podría ser algo parecido a (los mnemónicos de las instrucciones son ficticios): LW Ri, #1; ETIQ: CMP Ri,MAX; JG FIN; SHL R1,Ri,#2; ADD R2, R1, Rx; LW R3, (R2); ADDI R3,R3,#1; SW (R2),R3; ADDI Ri,Ri,#1; JMP ETIQ; FIN: … La variable i está en el registro Ri, y se inicializa a 1. Comprueba si estamos al final del bucle for. Si es así, salta al final. Multiplica por 4 bytes por palabra. Resultado a R1. Suma ese valor a Rx (dirección de comienzo de x[i]). Resultado a R2 Primer acceso a datos, lectura del elemento x[i] apuntado por R2. Suma inmediato, x[i]+1. Acceso en escritura para actualizar x[i]. i++ Salto incondicional. 1 A. González, C. Vaquero, “Análisis Cuantitativo y Simulación de Memorias Caché”. Proyecto Fin de Carrera (Ingeniería Informática). Universidad de Sevilla, 1999. 1 El fichero de trazas correspondiente a este código, suponiendo MAX=10, es prac3_a.vca. En él se incluyen tanto los accesos a código como a datos. Nótese que la longitud del fichero es mucho mayor que la del código, pues en los ficheros de trazas de memoria los bucles se “desenrollan”. Para la realización de esta parte de la práctica, siempre consideraremos tamaño de caché de 2Kb (en total), e inicialmente líneas de 8 bytes. Deben probarse las alternativas indicadas a continuación. Para cada una de ellas, se debe realizar la ejecución paso a paso, o bien usar breakpoints, comprobando detalles como valor de etiqueta, número de líneas, etc. Finalmente, debe apuntar en la tabla de la última página el valor de miss-rate y rellenar el campo COMENTARIO con un breve resumen de lo más relevante que haya observado en la simulación. Por ejemplo, si hay algún conflicto digno de mención, por qué determinada configuración mejora o empeora la situación de anteriores pruebas, por qué algún cambio de parámetro no parece afectar a los resultados, etc. a) Cachés separadas, mapeado directo. b) Caché unificada, mapeado directo. c) Caché unificada, asociativa por conjuntos (2 vías). d) Caché unificada, totalmente asociativa. e) Repita lo anterior con tamaño de línea 16 bytes e indique los cambios observados. En el bucle anterior, todas las escrituras se realizan sobre datos previamente leídos, por lo que siempre hay aciertos en escritura. Pruebe a cambiar la traza para estudiar cómo funciona el caché en caso de fallo en escritura. En concreto, haga que el núcleo del bucle sea por ejemplo y[i]=x[i]+1, con x[i] almacenado a partir de 0xDA100000 e y[i] almacenado a partir de 0xDA200000 (traza Prac3-b). Observe los resultados en las siguientes situaciones (tamaño de línea 8 bytes): f) Cachés separadas, mapeado directo, caché de datos CB-WA. g) Caché unificada, asociativa por conjuntos (2 vías), CB-WA. Pruebe tanto el algoritmo LRU como el aleatorio. Si observa algún cambio interesante, indíquelo en el campo COMENTARIO. h) Caché unificada, totalmente asociativa, CB-WA. PARTE 2. En esta segunda parte, nos limitaremos el estudio de los accesos a datos, suponiendo siempre cachés separadas. El bucle a estudiar sería ahora: for(i=1;i<=MAX;i=i+ZANCADA) t=t+x[i]; Nótense las siguientes diferencias: • El acceso al array no es elemento a elemento, sino que hay un parámetro zancada que establece el salto entre elementos accedidos. • Los accesos al array son sólo de lectura. • El tamaño del array, MAX, puede tomar el valor que más convenga. Considere un caché de datos de 1Kb con líneas de 32 bytes, directamente mapeado. Se pide: a) Genere una traza con zancada tal que MR≈1 (el peor caso, fallos continuos en caché). b) Genere una traza con zancada tal que MR≈0.5. c) Genere una traza con zancada tal que MR≈0.25. En todos los casos debe comprobar que el MR medido por el simulador coincide con el deseado. PARTE 3. Suponga que se desean comparar dos alternativas: Caché A: Cachés separadas, asociativa por conjuntos, 8 conjuntos, 2 vías por conjunto, líneas/vías de 64bytes, copy-back y write-allocate. Caché B: Caché unificada, mapeado directo, 32 líneas de 64bytes, copy-back y write allocate. Nota: Las cachés A y B son equiparables en tamaño. Se pide: a) Escribir un fichero de traza (código y datos) que haga la máquina con caché A lo más rápida posible comparada con la máquina con caché B. b) Escribir un fichero de traza que haga la máquina con caché B lo más rápida posible comparada con la máquina con caché A. En ambos casos, debe tratarse de ficheros breves y debe aclarar con comentarios a qué correspondería cada acceso del fichero de traza (tipo de instrucción, tipo de dato). 2 ARQUITECTURA DE COMPUTADORES. 2º INGENIERÍA INFORMÁTICA. PRÁCTICA 7. ALUMNO (Apellidos, nombre): AULA: FECHA y HORA: TABLA DE RESULTADOS. PARTE 1 APARTADO 1.a Separadas, map. directo MR Datos: COMENTARIO Instrucciones: 1.b Unificada, map. directo 1.c Unificada, asoc. 2 vías 1.d Unificada, asociativa. 1.e Cambios por línea 16 bytes Caso y[i]=x[i]+1; 1.f Igual que 1.a, datos CB 1.g Igual que 1.c, datos CB-WA 1.h Igual que 1.d, datos CB-WA 3 PARTE 2. MR≈0.25 MR≈0.5 MR≈1 PARTE 3 Caché A más rápida Caché B más rápida 4