El Sistema de Memoria Organización de Computadoras - 66:20 1. Se brinda a continuación una serie de referencias a memoria, dadas como direcciones de palabras: 2, 3, 11, 16, 21, 13, 64, 48, 19, 11, 3, 22, 4, 27, 6 y 11. Suponer una memoria caché de correspondencia directa con 16 bloques de una palabra inicialmente vacı́os. Rotular cada referencia de la lista como “acierto”(hit) o “desacierto” (miss) y mostrar el contenido final de la caché. 2. Usando la serie de referencias dadas en el ejercicio anterior, mostrar los aciertos y desaciertos y el contenido final de la memoria caché para una organización de correspondencia directa con bloques de cuatro palabras y un tamaño total de 16 palabras. 3. Suponer que se tienen dos computadoras idénticas A y B, salvo por su organización de memoria caché. Se pide la escritura de dos códigos de manera tal que se cumpla que el primer código se ejecute mucho más rápido en la máquina A que en la B, y que el segundo código se ejecute mucho más rápido en la máquina B que en la A. Datos: Cachés unificadas. El tiempo de escritura de una palabra de 32 bits en memoria principal es igual a 5 tiempos de acierto en memoria caché. Penalidad de desacierto = 10 tiempos de acierto. Caché A: 128 conjuntos, dos elementos por conjunto, bloque de 32 bytes, write through y no-write allocate. Caché B: 256 conjuntos, un elemento por conjunto, bloque de 32 bytes, write back y write allocate. 4. Dado el siguiente pseudocódigo: int array[10000,100000]; para cada elemento array[i][j] array[i][j] = array[i][j]*2; Escribir dos programas en C que implementen este algoritmo: uno debe acceder los elementos del array recorriéndolo por filas (row-major order ) y el otro debe accederlos reocrriédolo por columnas (column-major order ). Compare los tiempos de ejecución de los dos programas. ¿Cómo explica los resultados obtenidos en base al impacto que el código ha producido en la jerarquı́a de memoria? 5. Suponer dos memorias cachés: C1 es una organización de correspondencia directa con 16 bloques de una palabra y C2 es una organización de correspondencia directa con bloques de cuatro palabras y un tamaño total de 16 palabras. Suponer una penalidad de desacierto para C1 de 8 ciclos de $Date: 2006/08/14 15:06:35 $ El Sistema de Memoria Organización de Computadoras - 66:20 reloj de bus y una penalidad de desacierto para C2 de 11 ciclos de reloj de bus. Suponiendo que las cachés están inicalmente vacı́as, encontrar una secuencia de referencias para la cual C2 tenga una tasa de desaciertos (miss rate) más baja pero pase más ciclos de reloj en desaciertos de caché que C1. Usar direcciones de palabras. 6. Una computadora presenta las siguientes caracterı́sticas: El 95 % de los accesos a memoria se encuentran en la memoria caché. Cada bloque de caché es de dos palabras. El procesador envı́a referencias al sistema de memoria a una tasa de 109 palabras por segundo. El 25 % de las referencias son escrituras. La memoria principal trabaja a una tasa de 109 palabras por segundo (lecturas o escrituras). En cualquier instante de tiempo, el 30 % de los bloques de la caché se encuentra modificado. La caché usa write allocate sobre un desacierto de escritura. Se está considerando agregar un periférico al sistema y se desea saber cuánto del ancho de banda de la memoria del sistema ya está siendo usado. Calcular el ancho de banda de la memoria del sistema usado en promedio para los dos casos siguientes (establezca sus hipótesis): 7. a) La caché es write through. b) La caché es write back. Para una computadora con CPU MIPS R2000 y memoria caché de 16-KB con asociatividad de grado 4 y lı́nea de 16 bytes: a) Calcular el número de bits de tag, ı́ndice y offset. b) Dibujar un esquema detallado de la memoria caché (numerar los conjuntos desde 0 en adelante). c) Dar la dirección (en hexadecimal) correspondiente a cada uno de los siguientes datos y ubicarlos en el esquema del ı́tem b: 1) A y B son datos de un mismo bloque de memoria que mapean en el conjunto número 7. 2) C y D son datos de distintos bloques de memoria que mapean en el conjunto número 255. 3) E y F son datos que pertenecen a los bloques de memoria principal siguientes a C y D, respectivamente. 4) G es un dato separado en 1-MB de distancia respecto a B. $Date: 2006/08/14 15:06:35 $ El Sistema de Memoria Organización de Computadoras - 66:20 8. Dar una secuencia de 5 direcciones de memoria distintas generadas por una CPU MIPS con memoria caché, de manera tal que se cumpla con lo siguiente: La segunda dirección es acierto. La tercera mapea en un conjunto distinto al correspondiente a la primera. La quinta es desacierto. Las direcciones se deben dar en hexadecimal. La memoria caché es de 8-KB, asociativa de grado 2 y bloque de 16 bytes. No se pueden hacer hipótesis acerca del contenido previo de la caché. Justificar su respuesta. 9. Para el siguiente código: loop: .data array: add $t2, $0, $0 sll $t1, $t2, 2 sw $t2, array($t1) addi $t2, $t2, 1 slti $t3, $t2, 12 bgtz $t3, loop ori $v0, $0, 10 syscall .word 0, 1, 2, 3, 4, 5, ... a) Calcular el CPI promedio. b) Calcular el promedio de accesos a memoria por instrucción. c) Calular la tasa de desaciertos. Datos: caché de 8-KB, de 2 vı́as asociativa por conjunto, unificada, con bloque de 32 bytes y reemplazo LRU. Aclare las hipótesis que utilice. 10. Para una computadora con CPU MIPS R2000 y memoria caché de 512 bytes con asociatividad de grado 2 y lı́nea de 16 bytes. a) Calcular el número de bits de tag, ı́ndice y offset. b) Dibujar un esquema detallado y completo de la memoria caché (área de datos y tags). Numerar los conjuntos desde 0 en adelante. c) Ubicar en el dibujo a cada uno de los siguientes datos (bytes) dados por su dirección, y dar y ubicar en el área de tags, a los tags correspondientes. $Date: 2006/08/14 15:06:35 $ El Sistema de Memoria Organización de Computadoras - 66:20 Dato A B C D E F Dirección 0xffffff00 0xffffff04 0xcccccc08 0xffffff1a 0xffffff70 0xffffffff Justifique todas sus respuestas y muestre sus cálculos. 11. El código que se da a continuación, escrito en lenguaje C para ambientes UNIX, permite ejercitar los distintos niveles de una jerarquı́a de memoria. Esto se hace a partir de recorrer una zona contigua de memoria con un “tranco” (o separación entre las distintas referencias) dado. Fijado el tamaño de la zona de memoria a recorrerse se repite el acceso de la misma para trancos de distintos tamaños. Asimismo, se consideran zonas de distintos tamaños. Para combinación de zona de memoria recorrida (tamaño del lazo) y tranco se obtienen los tiempos promedio para realizar una lectura y una escritura en memoria. Compilar y ejecutar el código dado. Realizar un gráfico con los datos obtenidos, donde se tienen los tiempos promedio de lectura más escritura a memoria en función de los distintos saltos, para lazos de disitintos tamaños. Del análisis del gráfico determine para la computadora donde se ejecutó este test: a) La cantidad de niveles presentes en la jerarquı́a de memoria. b) El tamaño de cada nivel. c) El grado de asociatividad de cada nivel. d) El tamaño del bloque. Aclare sus hipótesis. #include #include #include #include <stdio.h> <sys/times.h> <sys/types.h> <time.h> /* lazo mas peque~ no */ #define LAZO_MIN (1024) /* lazo mas grande */ #define LAZO_MAX (1024*1024*4) /* para obterner un tiempo de muestra mas grande */ #define SAMPLE 10 /* numero de ticks de reloj por segundo */ $Date: 2006/08/14 15:06:35 $ El Sistema de Memoria Organización de Computadoras - 66:20 #ifndef CLK_TCK #define CLK_TCK 60 #endif /* array para ir recorriendolo */ int x[LAZO_MAX]; /* funcion para leer tiempo */ double get_seconds() { struct tms rusage; times(&rusage); /* utilitario UNIX: tiempo en clock ticks */ return (double) (rusage.tms_utime)/CLK_TCK; } void main() { int register i, index, stride, limit, temp; int steps, tsteps, csize; double sec0, sec; /* variables de timing */ for (csize=LAZO_MIN; csize <= LAZO_MAX; csize=csize*2) for (stride=1; stride <= csize/2; stride=stride*2) { sec = 0; /* inicializa timer */ limit = csize-stride+1; /* dimensiona lazo de esta iteracion */ steps = 0; do /* repetir hasta colectar 1 segundo */ { sec0 = get_seconds(); /* arrancar timer */ for (i=SAMPLE*stride;i!=0;i=i-1) /* muestra mas grande */ for (index=0; index < limit; index=index+stride) x[index] = x[index] + 1; /* accesso a caché */ steps = steps + 1; /* cuenta iteraciones del lazo*/ sec = sec + (get_seconds() - sec0);/* finaliza timer */ } while (sec < 1.0); /* hasta colectar 1 segundo */ /* Repetir loop vacio para restar overhead del lazo */ tsteps = 0; /* para equiparar nro. de iteraciones del while */ do /* repetir hasta mismo nro. de iteraciones com arriba */ { sec0 = get_seconds(); /* arrancar timer */ for (i=SAMPLE*stride;i!=0;i=i-1) /* muestra mas grande */ for (index=0; index < limit; index=index+stride) temp = temp + index; /* codigo dummy */ tsteps = tsteps + 1; /* cuenta iteraciones del wwhile*/ sec = sec - (get_seconds() - sec0);/* - overhead */ } $Date: 2006/08/14 15:06:35 $ El Sistema de Memoria Organización de Computadoras - 66:20 while (tsteps<steps); /* hasta = nro. de iteraciones */ printf("Size:%7d Stride:%7d read+write:%l4.0f ns\n", csize*sizeof(int), stride*sizeof(int), (double)sec*1e9/(steps*SAMPLE*stride*((limit-1)/stride+1))); } /* fin de de los dos loops for exteriores */ } 12. El programa del ejercicio anterior se experimentó en una computadora dada y se obtubieron resultados que fueron volcados en la siguiente figura: Calcular en base a la figura: 13. a) La cantidad de niveles presentes en la jerarquı́a de memoria. b) El tamaño de cada nivel. c) El grado de asociatividad de cada nivel. d) El tamaño del bloque. El “modelo del lazo” consiste en referenciar secuencialmente un grupo de bloques consecutivos en memoria, en forma cı́clica, de manera de formar un lazo infinito. Cada bloque recibe solo una referencia por vuelta del lazo $Date: 2006/08/14 15:06:35 $ El Sistema de Memoria Organización de Computadoras - 66:20 y todas son exactamente en el mismo byte dentro del bloque. Por ejemplo la secuencia de direcciones de bloques en memoria: b0 , b1 , b2 , b3 , b0 , b1 , b2 , b3 , ..., b0 , b1 , b2 , b3 , ... conforma un lazo infinito compuesto de cuatro bloques. Una posible implementación del modelo del lazo para las referencias a datos en memoria es la del pseudocódigo que se da a continuación: variables enteras: i, L, B; vector de punteros: a; variables en registro: p, k; inicialización del vector a para todo a[i]: a[i] ← dirección de a[(i + B) mod L]; p ← dirección a[0]; lazo repetir k veces: p ← lo apuntado por p; Durante la ejecución del lazo, los únicos accesos a memoria para datos se producen con la asignación p ← lo apuntado por p. Esto es ası́ dado que el puntero p y la variable k de la repetición se mantienen en registros, no requiriéndose accesos a memoria para las mismas. Los saltos en memoria entre sucesivas referencias a datos distan exactamente un bloque (B), por la inicialización del vector a. La proporción de desaciertos que produce el pseudocódigo anterior es prácticamente igual a la de un lazo infinito (para lograrlo, k debe tomar un valor suficientemente elevado). Realice una codificación en C del modelo del lazo a partir del pseudocódigo anterior. Implemente lazos de distintos tamaños de manera tal de cubrir los tamaños de las memorias caché de los procesadores actuales. Efectúe la medición de los tiempos de ejecución de los lazos considerados y en base a ella determine: a) b) c) 14. La cantidad de niveles presentes en la jerarquı́a de memoria. El tamaño de cada nivel. El grado de asociatividad de cada nivel. Use un simulador de memoria caché (por ejemplo, Dinero IV) para simular varias organizaciones de memoria caché para el primer millón de referencias del benchmark GCC. Simular cachés separadas para instrucciones y datos, de 32-KB y con la misma organización. Simular al menos dos grados de asociatividades distintos y dos tamaños de bloques distintos. Dibujar un diagrama en bloques completo de la organización de memoria caché que logre la mejor tasa de desaciertos. $Date: 2006/08/14 15:06:35 $ El Sistema de Memoria Organización de Computadoras - 66:20 15. Se le ha encargado el diseño de una memoria caché para un sistema nuevo. Se tienen direcciones de 32 bits y se requieren cachés separadas para instrucciones y datos. Usted dispone de 16 chips SRAM para realizar el diseño, los cuales tienen un tiempo de acceso de 1.5 ns. La penalidad de desacierto para el sistema de memoria es de 8 + 2 × tamaño del bloque en palabras. El uso de asociatividad agrega 0.2 ns al tiempo de acceso a la memoria caché. Usando el benchmark GCC, y considerando el primer millón de referencias a memoria, encontrar las mejores organizaciones de cachés de instrucciones y datos, dadas las SRAMs disponibles. 16. La asociatividad usualmente mejora la tasa de desacierto, pero no siempre. Dé una serie corta de referencias a memoria para la cual una caché asociativa por conjuntos de grado 2 y polı́tica de reempalzo LRU experimenta más desaciertos que una caché de correspondencia directa del mismo tamaño. 17. El siguiente programa C es ejecutado (sin optimizaciones) sobre un procesador con una caché que tiene bloques de 8 palabras (32 bytes) y contiene 256 bytes de datos: int i, j, c, stride, array[512]; ... for (i=0; i < 10000; i++) for(j=0; j < 512; j = j + stride) c = array[j] + 17; Si consideramos solamente la actividad de memoria caché generada por las referencias al arreglo, y suponenos que los enteros son palabras, ¿cuál es la tasa de desaciertos esperada cuando la caché es de correspondencia directa y stride es 256? ¿Y si stride es 255? ¿Podrı́a cualquiera de estos cambiar si la caché fuera asociativa por conjuntos de grado 2? 18. 19. Se quiere usar un simulador de memoria caché para simular varias TLB y organizaciones de memoria virtual. Usar el primer millón de referencias a memoria del benchmark GCC para esta evaluación. Se quiere conocer la tasa de desaciertos de TLB para cada una de las siguientes TLBs y tamaños de página: a) TLB de 64 entradas totalmente asociativa y páginas de 4-KB. b) TLB de 32 entradas totalmente asociativa y páginas de 8-KB. c) TLB de 64 entradas asociativa por conjuntos de grado 8 y páginas de 4-KB. d) TLB de 128 entradas asociativa por conjuntos de grado 4 y páginas de 4-KB. Considere un sistema de memoria virtual con las siguientes propiedades: $Date: 2006/08/14 15:06:35 $ El Sistema de Memoria Organización de Computadoras - 66:20 Direcciones virtuales de 40 bits. Páginas de 16-KB. Direcciones fı́sicas de 36 bits. ¿Cuál es el tamaño total de la tabla de páginas para cada proceso en este procesador, suponiendo que cada entrada en la tabla requiere de cuatro bits adicionales (válido, protección, modificado, uso)? 20. Colocar un “SI” en los casilleros correspondientes a los siguientes dispositivos si es que estos son accedidos en el proceso de proveer un dato solicitado por la CPU, para cada fila de la siguiente tabla. Si no son accedidos colocar un “NO”. Si el acceso al dispositivo depende de si hubo algún otro acierto o desacierto no explicitado en la primer columna, entonces colocar una “X”. Justificar su respuesta con un breve párrafo para cada fila. a) L1 es direccionado por direcciones virtuales. Evento Hit L1 Hit L2 b) Caché L2 Mem. Ppal. TLB Tabla Pag. Swap L1 es direccionado por direcciones fisicas. Evento Hit L1 Falla de Pag. 21. Caché L1 Caché L1 Caché L2 Mem. Ppal. TLB Tabla Pag. Swap Dada una CPU MIPS con hardware de manejo memoria virtual se pide: a) Calcular el tamaño del espacio de direcciones virtuales. b) Dar la cota máxima de la cantidad de memoria que efectivamente puede usar un programa. c) Calcular el tamaño en bytes de una tabla de traducción de páginas directa y de una invertida. d) Calcular el tiempo de acceso promedio a memoria para una caché direccionada por direcciones virtuales. Datos: RAM = 512-MB SWAP = 256-MB 8 bytes por entrada en tabla de traducción de página. Tasa de desaciertos de la memoria caché = 5 % Tiempo de acierto = 2 ns. $Date: 2006/08/14 15:06:35 $ El Sistema de Memoria Organización de Computadoras - 66:20 Penalidad de desacierto de la memoria caché = 40ns Tasa de desaciertos del TLB = 7 % Penalidad de desacierto del TLB = 15 ns. Tasa de falla de páginas = 0.01 % Penalidad por falla de página = 3 mseg. Aclare cualquier hipótesis que realice, y justifique las respuestas. 22. En un sistema de memoria virtual paginada para MIPS, en un instante dado, la dirección virtual 0x7fc123h corresponde a la dirección fı́sica 0x9de123h. a) Defina un formato para las entradas de la tabla de traducción de páginas y dé el contenido de la entrada correspondiente a la dirección dada. b) Dar el contenido de la entrada correspondiente de la TLB suponiendo acierto en TLB (indicar contenidos de tag y datos de la entrada). Datos: páginas de 4-KB y TLB totalmente asociativa. 23. Construir un banco de memoria de 3M × 8bits en base a circuitos integrados de 1M × 4bits para una CPU que tiene un bus de direcciones de 24 bits, y ubicarlo a partir de la dirección 4M de memoria. 24. Dado el siguiente programa en lenguaje C: int i, j, stride; double array[256]; ... for (i=0; i<100; i++) for (j=0; j<256; j=j+stride) procesar( array[j] ); ... Solamente debemos preocuparnos por los accesos a memoria generados por el arreglo, y cada elemento del arreglo es de 64 bits. La memoria caché L1 tiene bloques de 16 bytes. Se asume que esta memoria caché es lo suficientemente grande para mantener todo el arreglo. 25. a) Asumiendo que los elementos del arreglo no están inicialmente en la caché, ¿cuál serı́a la tasa de desaciertos si stride es 2? b) Se pretende disminuir la tasa de desaciertos utilizando la técnica de prefetching, asumiendo que la distancia de prefetch es d = 5. Reescribir el programa anterior incluyendo las instrucciones de prefetch correspondientes, y recalcular la tasa de desaciertos. Dado el siguiente programa en lenguaje C: $Date: 2006/08/14 15:06:35 $ El Sistema de Memoria Organización de Computadoras - 66:20 double mult(double a, double b) { return (a * b); } ... double a[512], b[512], c[512]; register int i; for (i=0; i<512; i++) a[i] = mult( b[i] , c[i] ); ... Considerar una organización caché de datos L1 2WSA de 8-KB con lı́nea de 64 bytes, y que la llamada a mult() no produce accesos a dicha memoria. 26. a) Asumiendo que los elementos de los arreglos no están inicialmente en la caché, y que los tres están ubicados uno a continuación del otro en memoria principal ¿cuál es la tasa de desaciertos? b) Se pretende disminuir la tasa de desaciertos utilizando la técnica de array padding. Reescribir el programa anterior (con la menor cantidad posible de memoria adicional), y recalcular la tasa de desaciertos. c) De ser posible, ¿qué otra(s) optimización(es) aplicarı́a al programa dado? (explique en qué consiste en caso de aplicar alguna). Dado el siguiente programa en lenguaje C: #define N 512 int A[N][N], B[N][N]; register int i, j, acum; acum = 0; for (i=0; i<N; i++) for (j=0; j<N; j++) acum += A[j][i] + B[j][i]; Considerar una organización caché de datos L1 2WSA de 4-KB con lı́nea de 64 bytes, y polı́tica de reemplazo LRU. El tipo int ocupa 4 bytes. a) Asumiendo que los elementos de las matrices no están inicialmente en la caché, y que ambas están ubicadas una a continuación de la otra en memoria principal ¿cuál es la tasa de desaciertos? b) Se pretende disminuir la tasa de desaciertos aplicando una sola optimización. Determine qué optimización (de las estudiadas en el curso) aplicarı́a, explique en qué consiste, y vuelva a calcular la tasa de desaciertos para el programa optimizado. $Date: 2006/08/14 15:06:35 $