Página 1 de 4 Guía Trabajo Práctico Número 6 Arquitectura de Computadoras 24/05/2014 Ejercicios Propuestos 2) [Acotado] Dada la mezcla de instrucciones para gcc vista en prácticos anteriores, se intentará calcular la influencia del uso de una memoria caché en el CPI del programa. Tipo de Instrucción % gcc /CPI Aritméticas 48% 1,0 Transferencias de datos 33% 1,4 Saltos condicionales 17% 1,7 Saltos incondicionales 2% 1,2 a) Calcule el CPI promedio de gcc corriendo en una máquina con caché, donde la tasa de fallos es de 2% para instrucciones y de 4% para datos, y la penalización por fallos es de 20 ciclos en ambos casos. 4) [Acotado] Considere un caché de mapeo directo, con 16 palabras por bloque, las cuales se cargan de una memoria SDRAM que requiere un ciclo para enviar el dato, un ciclo para enviar el tamaño del bloque, 5 ciclos de latencia y un ciclo por cada palabra a transferir. Calcule el tiempo de penalización por fallos para las siguientes situaciones, tomando siempre como referencia los porcentajes de gcc: a) Fallo de Lectura en un Caché de Instrucciones. b) Fallo de Lectura en un Caché de Instrucciones con Early Restart (considerando que la mitad de los saltos condicionales son tomados). c) Fallo de Lectura en un Caché de Datos con política de escritura write back, suponiendo que el 20% de las veces, el bloque a reemplazar ha sido modificado. 8) Dados los siguientes datos sobre el sistema de memoria de un procesador, se pide: Datos a) b) c) d) e) f) Alpha 21264 Dirección virtual 48 bits Dirección física 41 bits Tamaño de página 8 KB TLB MD, 256 entradas Caché L1 MD, 8 KB, bloques de 64 B Caché L2 MD, 4 MB, bloques de 64 B Indique en qué campos se descompone la dirección virtual, y los tamaños de cada uno de ellos. Indique en qué campos se descompone la dirección física, y los tamaños de cada uno de ellos. El caché de primer nivel, ¿es accedido con direcciones virtuales o reales? Indique el tamaño de la etiqueta del TLB. Indique el tamaño de una entrada completa del TLB. Indique en qué campos se descompone la dirección del caché de segundo nivel. 11) Considere un procesador de 1 GHz con 2 niveles de caché, 1 nivel de DRAM y un disco para memoria virtual. El procesador posee un caché de nivel 1 para instrucciones y otro para datos. El sistema de memoria posee los siguientes parámetros: Componente Hit Time Caché L1 1 ciclos Caché L2 7 ciclos + 1 ciclo/ 32 bits DRAM 16 ns + 3 ns / 4 bytes DISCO 8.5 ms + 5 ms / 512 bytes Miss Rate Block Size 1.5% 32 Bytes 5% 256 Bytes 0.7% 4 KB 0% 4 KB Guía Trabajo Práctico Número 6 Página 2 de 4 Por último considere que el caché de nivel L1 trabaja con direcciones reales, es decir que primero se accede a un TLB que tiene un tiempo de acceso de 1 ciclo, que falla 0,1% de las veces y que requiere una lectura de 4 bytes de la DRAM para actualizarse (estos accesos no pueden fallar). a) ¿Cuál es el tiempo medio de acceso a memoria para instrucciones y para datos? b) Suponiendo que todos los accesos a datos son lecturas, ¿cuánto es el CPI promedio de gcc? Soluciones Propuestas 2) La idea de este ejercicio es mostrar la influencia de los fallos en el cálculo del CPI. Hasta ahora habíamos supuesto siempre una memoria ideal, y habíamos obtenido en el mejor de los casos un CPI de 1.255 en el procesador segmentado. Pero cuando las memorias dejan de ser ideales, y se convierten en cachés, su tiempo de acceso sigue siendo de un ciclo, pero sólo cuando hay un acierto. Cuando ocurre un fallo de caché, el procesador no puede continuar realizando ninguna tarea, y se detiene completamente hasta que el fallo es resuelto. Por este motivo es que la cantidad de ciclos que el procesador pierde a causa de los fallos de caché debe sumarse al CPI. CPI = CPIideal + Paradas por fallos Las paradas por fallos se calculan como la cantidad de ciclos que pierdo cada vez que tengo un fallo (penalidad) multiplicado por la cantidad de veces que este evento ocurre (tasa de fallos). Paradas por fallos = m * Pf Además, no debemos olvidar que el procesador segmentado posee dos cachés separados, uno para instrucciones y uno para datos, y que cada uno de ellos puede influir de diferente manera, según la cantidad de veces que es accedido, pero ambos provocarán paradas. Paradas por fallos = %refInstr * mInstr * PfInstr + %refDatos * mDatos * PfDatos Con estas ecuaciones, simplemente reemplazamos las variables con los datos proporcionados por el enunciado: Paradas por fallos = 100% * 2% * 20 + 33% * 4% * 20 = 0.4 + 0.264 = 0.664 CPI = 1.255 + 0.664 = 1.919 Es muy importante destacar que este resultado implica que los fallos de caché incrementan en más de un 50% el CPI promedio de un procesador, y esto es considerando penalidades que no son tan reales. 4) Este ejercicio es similar al anterior, pero ahora vamos a tener que calcular la penalidad en caso de fallo. a) En el caso de producirse un fallo en la caché de instrucciones, voy a tener que traer todo un bloque, por lo que la penalización será la suma de los ciclos para enviar el dato (1 ciclo), más los ciclos para enviar el tamaño del bloque (1 ciclo), más los ciclos de latencia (5 ciclos), más la cantidad para transferir todo el bloque (16 ciclos, 1 por cada palabra). El tiempo total es: T = 1 + 1 + 5 + 16 * 1 = 23 ciclos b) Early restart es una técnica que se utiliza para disminuir la penalización por fallos en cachés que tienen bloques de más de una palabra. Básicamente, consiste en que se empieza a llenar el bloque por la primera palabra y se devuelve el control al procesador apenas llega la palabra solicitada, no cuando termine de llenarse todo el bloque, como es usual. De esta manera, suponiendo accesos secuenciales (normales en las instrucciones), cuando pida la primera palabra de un bloque será un fallo, pero cuando pida la segunda tendré un acierto. Si extendemos este supuesto, vemos que sólo se fallará al solicitar la primera palabra de un bloque, por lo tanto la penalidad sería la de traer solamente la primera palabra. Pero no todas las instrucciones son secuenciales. Las secuenciales son las aritméticas (48%) y las de transferencia de datos (33%). Los saltos incondicionales no son secuenciales, y suponemos que la mitad de los saltos condicionales sí lo son. Esto nos da que el 89.5% de las instrucciones son secuenciales, por Guía Trabajo Práctico Número 6 Página 3 de 4 lo que les corresponde la penalidad de traer la primera palabra de un bloque. Esta sería de 1+1+5+1, o sea de 8 ciclos. Para el resto de instrucciones (10.5%), les puede tocar cualquier palabra dentro del bloque (incluida la primera), por lo que tomamos un promedio: (8+9+10+…+23) / 16, que se puede reducir algebraicamente a (8 + 23) / 2 = 15.5 ciclos. Finalmente, T = 0.895 * 8 + 0.105 * 15.5 = 8.7875 ciclos c) En un caché de tipo write-back, los bloques que son modificados no se escriben en memoria hasta que les llega el momento de ser reemplazados. Entonces, en el caso de que se produzca un fallo de caché la penalidad puede verse incrementada si es que el bloque que va a ser reemplazado ha sido modificado previamente. En este caso, podría decirse que la penalidad es doble: se paga una vez para escribir en memoria el bloque modificado, y luego otra vez para traer el bloque solicitado. Entonces, el 80% de las veces la penalidad es la de traer todo un bloque: 23 ciclos. Y el 20% restante la penalidad es doble, por lo que el tiempo total sería: T = 0.8 * 23 + 0.2 * 2 * 23 = 27.6 ciclos La ecuación anterior puede reducirse algebraicamente, y expresarse como T = (1 + 0.2) * 23, lo cual es una manera más sencilla de calcular el tiempo. 8) a) La dirección virtual se descompone en dos campos: el número de página virtual y el Offset de página. Como las páginas son de 8 KB son necesarios 13 bits para el Offset, y el resto (35 bits) se usan para el número de página. b) La dirección física se descompone en dos campos: el número de marco y el Offset de página. El Offset es el mismo que el de la dirección virtual, por lo que también es de 13 bits, quedando 28 bits para el número de marco. c) Para saber si el caché L1 puede ser accedido con direcciones virtuales, tengo que encontrar cómo se descompone su dirección, y controlar que la cantidad de bits necesarios para identificar un bloque (o sea el índice más el desplazamiento) sea menor o igual que la cantidad de bits del Offset de página. Si no se cumple esta condición el caché L1 sólo podrá ser accedido con direcciones reales. Como el caché tiene bloques de 64 bytes, son necesarios 6 bits para indicar el desplazamiento. Como es de mapeo directo, tendrá en total (8 KB / 64 B) = 128 bloques, por lo que se necesitan 7 bits para indicar el índice. O sea que en total son necesarios 7 + 6 = 13 bits para indexar un bloque de caché, y como dijimos anteriormente el Offset de página es de 13 bits, por lo que puede accederse al caché con direcciones virtuales. d) Teniendo en cuenta los resultados obtenidos en el apartado a, el número de página de la dirección virtual tiene 35 bits. Además como el TLB es de mapeo directo, y tiene 256 entradas, son necesarios 8 bits para su índice y el resto de los bits se usan para la etiqueta, por lo que la misma es de 35 – 8 = 27 bits. e) Una entrada completa de TLB posee tres campos: bits de estado, la etiqueta a comparar y el número de marco a devolver en caso de acierto. Por lo tanto considerando los resultados obtenidos en los apartados anteriores, y que usamos 4 bits de estado, su tamaño total es de 4 + 27 + 28 = 59 bits. f) Al caché L2 se accede con direcciones reales (de 41 bits), y a esta dirección se la divide en tres campos: etiqueta, índice y desplazamiento. Como los bloques son de 64 bytes, se necesitan 6 bits para el desplazamiento. Como el tamaño es de 4 MB, y es de mapeo directo, tiene en total (4 MB / 64 B) = 64K bloques, por lo que se necesitan 16 bits de índice. El resto de los 41 bits se utiliza como etiqueta, o sea 41 – 16 – 6 = 19 bits. Por lo tanto podemos descomponer la dirección del caché L2 como etiqueta (19 bits), índice (16 bits) y desplazamiento (6 bits). 11) Teniendo en cuenta que el procesador es de 1 GHz podemos calcular el período que será T = 1 ns. a) Para poder calcular el tiempo medio de acceso al sistema de memoria completo debemos comenzar por el último nivel, en este caso el disco. Esto se debe a que los tiempos de acceso de los niveles inferiores se van agrupando y formando la penalización de los niveles superiores. Guía Trabajo Práctico Número 6 Página 4 de 4 Para calcular los tiempos de acceso generalmente debemos considerar en primer lugar el tiempo de hit, el mismo esta compuesto por un tiempo fijo y un tiempo de transferencia de datos. Este último es el tiempo necesario para que la unidad que se esta analizando envíe los datos al nivel superior y se calcula teniendo en cuenta la tasa de transferencia del nivel actual y el tamaño de bloque de la unidad del nivel anterior. Además para las unidades que tienen un nivel por debajo, y por lo tanto tienen una tasa de fallos distinta de cero, debemos adicionar la tasa de fallos por la penalidad, la misma será igual al tiempo de acceso del nivel que está por debajo del nivel analizado. De este modo para calcular el tiempo de acceso del disco debemos tener en cuenta los 8.5 ms que serían el tiempo de acceso fijo, y además, sabiendo que debemos transferir un bloque completo a la DRAM, y que los bloques de la DRAM tienen 4 KB, adicionamos el tiempo de transferencia del disco para enviar esta información teniendo en cuenta que la tasa de transferencia es 512 bytes cada 5 ms. Dado que el disco no tiene un nivel por debajo, la tasa de fallos es cero por lo que no se adiciona ninguna penalidad. AMAT(Disco) = 8.5 ms + 5 ms x (4 KB / 512 bytes) = 8.5 ms + 5 ms x 8 = 48.5 ms Una vez calculado el tiempo de acceso del disco, subimos un nivel para calcular el tiempo de acceso de la DRAM. En este caso, debemos tener en cuenta los 16 ns de acceso, más el tiempo de transferencia de un bloque de caché L2 a una tasa de transferencia de 4 bytes cada 3 ns. Como la DRAM posee un nivel por debajo (el disco) la misma tiene una tasa de fallos distinta de cero, por lo que deberemos adicionar la tasa de fallos por la penalidad de fallo, teniendo en cuenta que esta penalidad será igual al tiempo de acceso del nivel inferior, es decir, del disco. AMAT(DRAM) = 16 ns + 3 ns * (256 bytes / 4 bytes) + 0.007 * 48.5 ms AMAT(DRAM) = 208 ns + 339500 ns = 339708 ns = 339708 T Al analizar el tiempo de acceso del cache L2 contamos los 7 ciclos de acceso más las transferencia de 32 bytes al caché L1 con una tasa de transferencia de 32 bits (4 bytes) cada ciclo. También adicionamos la penalidad (tiempo de acceso de la DRAM) por la tasa de fallos del cache L2. AMAT(L2) = 7T + 1T * (32 bytes/4 bytes) + 0.05 * 339708 ns AMAT(L2) = 15T + 16985T = 17000 T El último nivel de memoria es la caché L1 y el tiempo de acceso a la misma será igual el tiempo de acceso (1T) más la tasa de fallos por la penalidad de fallos (tiempo de acceso a caché L2). Para este caso en particular en el cual se accede primero al TLB para la traducción de las direcciones, debemos adicionar el retardo provocado tanto por el acceso al TLB como por la falla del mismo, el cual será igual al tiempo requerido por la DRAM para transferir 4 bytes, teniendo en cuenta que la misma no puede fallar. AMAT(L1) = 1T + 0.015 * 17000T+ 1 + 0.001 * (16 ns +3 ns) AMAT(L1) = 1T + 255T+ 1 + 0.001 * 19T = 257 T Por lo tanto el tiempo medio de acceso a memoria tanto para instrucciones como para datos en el sistema de memoria completo será igual a 257 T. b) Para calcular el CPI promedio de gcc, tomamos como base el CPI ideal calculado en prácticos anteriores 1,255 y al mismo le adicionamos los ciclos medios requeridos para acceder a memoria. Si tenemos en cuenta que todas las instrucciones acceden a memoria de instrucciones y que el 33% de las instrucciones (instrucciones de transferencia) acceden a memoria de datos (en este caso con la simplificación de que todos estos accesos son lecturas), y considerando el tiempo medio de acceso calculado en el apartado anterior podemos calcular el nuevo CPI promedio. CPI = CPI ideal + ref * (AMAT(L1) – Hit Time(L1)) CPI = 1,255 + 1,33 x (257 - 1) CPI = 1,255 + 340,48 = 341,735 Por lo tanto el CPI promedio para gcc considerando los accesos a memoria será 341,735. Como se puede observar, este nuevo CPI es casi 300 veces mayor que el ideal, así que pueden darse cuenta del tremendo impacto en la performance que agrega la jerarquía de memoria, y cuánta importancia toma la multiprogramación para poder realizar otras tareas mientras se resuelven los fallos de página.