Organización del Computador I Verano Jerarquía de Memoria Basado en el capítulo 5 del libro de Patterson y Hennessy Verano 2014 Profesora Borensztejn Memoria • Los registros y los bancos de registros se utilizan para la construcción de memorias pequeñas. • Las memorias mas grandes se realizan mediante: – SRAM: Static Random Access Memory – DRAM: Dynamic Random Access Memory SRAM • Se llaman de acceso aleatorio porque el tiempo de acceso para acceder cualquier dato es fijo. • Cada celda de memoria SRAM es básicamente como el biestable D que estudiamos en clases pasadas. WE Dirección CS 15 SRAM D entrada OE 8 32K x 8 8 D salida • 3 líneas de control • WE: Write Enable • CS: Chip Select • OE: Output Enable • 15 líneas de dirección • 8 líneas de datos de entrada • 8 líneas de datos de salida SRAM • Para iniciar un acceso de lectura o escritura, la señal CS debe estar activa. • Para realizar una lectura: – debe activarse la señal OE, que es útil cuando se conectan varios chips de memoria, y sirve para determinar cual de ellos accede al bus. – El tiempo de acceso de lectura de una memoria SRAM es el tiempo desde que se activa OE, y las líneas de dirección son válidas, hasta que el dato está presente en las salidas. Suele ser del orden de los 5nseg. WE Dirección CS 15 SRAM D entrada • Para realizar una escritura OE 8 32K x 8 8 D salida – debe activarse la señal WE durante un tiempo mínimo, y el dato y su dirección deben estar disponibles durante un tiempo antes (setup time) y mantenerse durante un tiempo posterior (hold time) a la activacion de la señal WE – El tiempo para completar una escritura se especifica como una combinación del setup time, hold time y la duración de la señal WE. SRAM • Si bien se construyen con biestables D, igual que los registros, para seleccionar la salida no se usa un multiplexor. Seria demasiado grande! (multiplexor de 32K a 1!) • Se realizan mediante una línea de salida compartida entre varias celdas de memoria. Cada celda tiene su salida implementada con un buffer tri-estado: Selección 0 Permiso Dato 0 Entrada Selección 1 Dato 1 Permiso Selección 2 Dato 2 Permiso Selección 3 Permiso Dato 3 Entrada Entrada Entrada Salida Salida Salida Salida Salida SRAM de 4x2 D entrada(1) WE D entrada(0) D C Q D C Permiso Permiso D C D C Q 0 Q Permiso Dirección Q Permiso 1 D C Q Permiso D C Q Permiso 2 D C Q Permiso D C Q Permiso 3 D salida(1) D salida(0) DRAM • En las DRAM el valor almacenado se mantiene como una carga en un capacitor. • El transistor permite acceder al valor almacenado en el capacitor. Word line Pass transistor Capacitor Bit line • Para escribir: • Cuando la señal de línea de palabra está activada, el transistor se abre conectando el capacitor con la línea de bit. • Si el valor de la línea es 1, el capacitor se carga. • Si el valor de la línea es 0, se descarga. DRAM • Para leer: • Se carga la línea de bit con un valor medio entre el voltaje alto y bajo • Se activa la línea de palabra, abriendo el transistor. • La carga del capacitor se mueve hacia la línea de bit, provocando un cambio en ella. • Se mide el cambio y se detecta si era un cero o un uno dependiendo de hacia donde se movió el voltaje en la línea de bit. • La lectura es destructiva! Se descargó el capacitorè volver a escribirlo. Word line Pass transistor Capacitor Bit line DRAM r o w d e c o d e r row address bit (data) lines Cada intersección representa un bit RAM Cell Array word (row) select Column Selector & I/O Circuits data Column Address – Selecciona un bit DRAM • Direccionamiento de dos niveles: primero se le da la dirección de fila y luego la de columna. – La dirección de fila activa la línea de palabra y todas las columnas se almacenan en un conjunto de cerrojos. – La dirección de columna selecciona el bit. • El tiempo de acceso es mas grande que en las SRAM, del orden de 5 a 10 veces mas. • Además, los capacitores pierden carga y es necesario refrescar los contenidos. • Ocupa menos área por bit que la SRAM WE OE • Es mas barata. Dirección 9 DRAM CAS RAS 256K x 8 8 D entrada D salida DRAM Generations Year Capacity $/GB 1980 64Kbit $1500000 1983 256Kbit $500000 1985 1Mbit $200000 1989 4Mbit $50000 1992 16Mbit $15000 1996 64Mbit $10000 1998 128Mbit $4000 2000 256Mbit $1000 2004 512Mbit $250 2007 1Gbit $50 2010 2Gbit $30 2012 4Gbit $1 2014 Jerarquía de Memoria • Los usuarios quieren una memoria rápida e infinita. • Las tres tecnologías de fabricación de memoria varían en precio y tiempo de acceso: – Tiempo de Acceso: • SRAM: 0.5-2.5 nseg • DRAM: 50-70 nseg • Disco magnético: 5-20 millones nseg. – Precios: • SRAM: $500-$1000 por GiB • DRAM: $10-$20 por GiB • Disco magnético: $0,05$0,10 por GiB Darle la máxima capacidad con la tecnología mas barata al mismo tiempo que se le proporciona acceso a la velocidad mas rápida CPU Level 1 Levels in the memory hierarchy Level 2 Level n Size of the memory at each level Increasing distance from the CPU in access time Flash Storage • Nonvolatile semiconductor storage – 100× – 1000× faster than disk – Smaller, lower power, more robust – But more $/GB (between disk and DRAM) Flash Types • NOR flash: bit cell like a NOR gate – Random read/write access – Used for instruction memory in embedded systems • NAND flash: bit cell like a NAND gate – Denser (bits/area), but block-at-a-time access – Cheaper per GB – Used for USB keys, media storage, … • Flash bits wears out after 1000’s of accesses – Not suitable for direct RAM or disk replacement – Wear leveling: remap data to less used blocks Localidad • Es el principio que hace que la jerarquía de memoria sea una buena idea – Si un dato es referenciado: • Localidad temporal: volverá a ser referenciado pronto • Localidad espacial: datos cercanos al actual serán inmediatamente referenciados • La localidad es una característica de los programas y de sus datos! – El código.....suele tener mucha localidad espacial y/o temporal. – Los datos que referencia dicho código.....depende del programa Jerarquía de Memoria • La jerarquía de memoria puede estar compuesta por varios niveles: – Las transferencias de información se dan entre niveles adyacentes – La unidad mínima de información que se transfiere entre dos niveles (el inferior y el superior) se llama bloque. – Hit (Acierto): el dato buscado está en el nivel superior – Miss (Fallo): el dato buscado NO está en el nivel superior. Jerarquía de Memoria Processor Control Speed (ns): 1 Size (bytes): 100s On-Chip Cache Registers Datapath Second Level Cache (SRAM) 10s Ks Memoria caché Main Memory (DRAM) 100s Ms Secondary Storage (Disk) 10,000,000s (10s ms) Gs Memoria virtual Memorias Cachés • Ideado por Wilkes, 1960. Las llamó memorias esclavas. • Actualmente se implementan con SRAM. • Principio de operación: – La CPU pide un dato – El dato se busca en la caché • Si no está (Miss) – El dato se trae a la memoria caché y se entrega a la CPU • Si está (Hit) – El dato se entrega a la CPU • Dos preguntas: – ¿Como se sabe si el dato está o no en la caché? – Y si está, ¿como se localiza? Caché de Mapeo Directo • ¿Donde se ubica un dato? En una posición única de la caché. • ¿Como se asigna esa posición única? En relación con la dirección del dato en memoria. • Supongamos que el dato constituye un bloque Dirección del bloque en caché = (dirección del bloque en memoria) módulo (número de bloques de la caché) • Si el número de bloques en caché es una potencia de 2, la operación módulo es simplemente quedarse con los log2 bits de menor peso de la dirección. Caché de Mapeo Directo 000 001 010 011 100 101 110 111 Cache 00001 00101 01001 01101 10001 Memory 10101 11001 11101 Caché de Mapeo Directo • Si cada bloque de la caché puede contener los datos de unas cuantas direcciones de memoria ¿Como se sabe si los datos que están en la caché son los deseados? • Es decir, ¿como se sabe si hay hit o miss? Añadiendo a la caché un conjunto de etiquetas (tags) que contienen la información necesaria para identificar a un dato en la caché: tag = (dirección del bloque en memoria) div (número de bloques de la caché) • El tag está formado por los bits altos de la dirección del dato en memoria que NO se usan para indexar a la memoria caché. Caché de Mapeo Directo Address (showing bit positions) 31 30 13 12 11 210 Byte offset Hit 10 20 Tag Index Index Valid Tag Data 0 1 2 1021 1022 1023 20 32 • Un bit de validez se agrega para saber si la entrada es válida Data • Caché de 1024 palabras (de 32 bits) • Se direcciona con los bits A2..A11. • El tag está compuesto por los bits A12..A31 • Los bits A0 y A1 sólo interesan para seleccionar el byte dentro de la palabra (bloque). Caché de Mapeo Directo • La caché almacena tanto datos como tags. • Calcular el tamaño de una caché de mapeo directo sabiendo que: • Las direcciones son de 32 bits • Los bloques son de 4 bytes • La caché tiene 2n bloques Tag= 32 – (n+2) bits Numero Total de Bits= 2n * (tamaño del bloque +tamaño tag+tamaño validez) Numero Total de Bits= 2n* (32+(32-n-2) +1= 2n * (63-n) Caché de Mapeo Directo • ¿Cuantos bits se necesitan para realizar una caché de mapeo directo con 64KB de datos y bloques de una palabra, suponiendo direcciones de 32 bits? • Las direcciones son de 32 bits • Los bloques son de 4 bytes • La caché tiene 214 bloques (64 KB son 16KW) Numero Total de Bits= 214* (32+(32-14-2) +1= 214 * 49=784Kbits 784Kbits=98KB • Respuesta: Para implementar una caché de 64KB se necesita almacenar 98KBè1,5 veces mas que los datos Memoria Caché en nuestra máquina • Para implementar cachéè reemplazamos las memorias del camino de datos por cachés de datos y de instrucciones • Un acierto....es fácil de implementar por el control. • Un fallo: – Parar la CPU: congelar los valores de los registros – Un control separado realiza el acceso a memoria – Una vez que los datos están presentes, se reanuda la CPU en el ciclo en que se había bloqueado Memoria Caché en nuestra máquina • Supongamos un fallo de instrucción – Los contenidos de IR no son válidos – La dirección que provocó el fallo es PC-4 (se puede calcular usando una UF y guardándolo en los registros de segmentación) – Se accede a la memoria principal – La CPU espera que el acceso esté finalizado, y – Escribe el dato en la caché: • • • • Se indexa con los bits bajos (menos los 2 de menos peso) lo que viene de la memoria externa, se escribe en la parte de datos Lo que sale de la ALU (los bits más altos) en el tag Poner a válida la entrada – Reiniciar la ejecución de la instrucción en el primer paso (Fetch) Un ejemplo: La caché de DECStation 3100 Byte offset Hit 14 16 Data Tag • Utiliza el MIPS R2000 • Caché de 64KB • Memorias cachés separadas de instrucciones y datos Index Index Valid Tag Data 0 1 2 214-1 16 32 0 Un ejemplo: La caché de DECStation 3100 • Lecturas: (a cualquier caché) • Enviar dirección (PC o ALU) • Si es hità dato presente en las líneas de datos • Si es missà enviar dirección a memoria principal, esperar los datos y escribirlos en caché • Escrituras: (a cualquier caché) • Enviar dirección • Si es hità escribir los datos en caché y en memoria principal (porque sino, quedan incoherentes): escritura a través (write through) • Si es missà¿para que leer de memoria principal? Escribir los datos y también el tag en caché, escribir en memoria principal. Un ejemplo: La caché de DECStation 3100 • Problemas con la política de escrituras: • Se tarda mucho tiempo escribiendo en memoria principalà solución: usar buffers de escritura • Una vez que se escribió en caché y en los buffers, la ejecución puede reanudar. • Cuando la escritura en memoria finaliza, se libera el buffer: el DECStation tiene un buffer de 4 palabras • Alternativa a la política write through para lecturas • Sólo se escribe en memoria principal cuando hay reemplazo de bloque....(hablamos de reemplazos?) • Reemplazo de Bloque: • Cuando hay un miss, y se trae el nuevo bloque, y la posición donde este debe ser ubicado está ocupada, se debe desalojar la línea vieja. Caché de Mapeo Directo • Aprovechar la localidad espacial: – Aumentando el tamaño del bloque, en caso de fallo se trae no sólo la palabra que produjo el fallo, sino también las subsiguientes. Address (showing bit positions) 31 16 15 4 32 1 0 Hit 16 Tag 12 2 Byte offset Data Index V Block offset 16 bits 128 bits Tag Data 4K entries 16 32 32 32 Mux 32 32 Caché de Mapeo Directo • Aprovechar la localidad espacial: – Aumentando el tamaño del bloque, en caso de fallo se trae no sólo la palabra que produjo el fallo, sino también las subsiguientes. • Que cambia? – En el caso de write miss, • hay que leer la línea de memoria principal: escribir los datos y el tag • Luego, realizar la escritura del dato que provocó el miss • Escribir también memoria principal (o en los buffers) Rendimiento • Aumentar el tamaño del bloque hace descender la tasa de fallos • Si los bloques son muy grandes en relación al tamaño total de la caché, entonces habrá mucha competencia por el lugarè muchos desalojos antes de poder referenciar las palabras de los bloques. 40% 35% • Miss Rate (tasa de misses)= Número de Misses/Total de Accesos Miss rate 30% 25% 20% 15% 10% 5% 0% 4 16 64 Block size (bytes) 256 1 KB 8 KB 16 KB 64 KB 256 KB Rendimiento • Hay más localidad espacial en el código: es más sensible al aumento del tamaño del bloque. • Podría ser mejor usar cachés separadas y darles a cada una el tamaño de bloque idóneo. Program gcc spice Block size in words 1 4 1 4 Instruction miss rate 6.1% 2.0% 1.2% 0.3% Data miss rate 2.1% 1.7% 1.3% 0.6% Effective combined miss rate 5.4% 1.9% 1.2% 0.4% Rendimiento • Modelo Simplificado: tiempo ejecución = (ciclos ejecución + ciclos bloqueo) × tiempo ciclo ciclos bloqueo = # de instrucciones M × tasa de miss × penalización del miss ciclos bloqueo = # de instrucciones× tasa de miss/Instrucciones × penalización del miss Rendimiento • Ejemplo: Determinar cuanto más rápida sería una máquina con una caché ideal respecto a esta: – Para gcc se asume: • Tasa de fallos de instrucciones del 2% • Tasa de fallos de datos del 4% – CPI =2 sin bloqueos de memoria – Penalización por fallo=40 ciclos – Frecuencia de instrucciones del gcc: • 36% de lecturas/escrituras ciclos bloqueo debidos a instrucciones= I*2%*40=0.80*I ciclos bloqueo debidos a datos= I*36%*4%*40=0.56*I ciclos bloqueo totales= 1.36*I CPI con bloqueos= 2+1.36=3.36 I * CPI bloqueo * ciclo 3.36 Tiempo CPU sin bloqueo = = = 1.68 Tiempo CPU caché perfecta I * CPI perfecta * ciclo 2 Rendimiento • Ejemplo: Supongamos que se incrementa el rendimiento de la máquina del ejemplo anterior doblando la frecuencia de reloj, sin embargo la velocidad de la memoria principal no cambia (muy posible). Es decir, no cambia el tiempo absoluto de tratar un fallo. ¿cuánto más rápida es esta máquina que la anterior, con el mismo porcentaje de fallos? Nueva penalización por fallos=80 ciclos (el doble de ciclos) ciclos bloqueo totales= I*2%*80 + I*36%*4%*80 =2,75*I CPI con bloqueos= 2+2,75=4,75 I * CPI lenta * ciclo Tiempo CPU lenta 3.36 = = = 1.41 ciclo 4.75 Tiempo CPU rápida I * CPI rápida * 2 2 Rendimiento • Las penalizaciones relativas a la caché se incrementan cuando la máquina es más rápida. • Cuanto mas bajo es el CPI, más pronunciado será el efecto del bloqueo • El sistema de memoria no mejora tan rápidamente como el tiempo de ciclo del procesadorè una CPU con un reloj más rápido tendrá una penalización por fallo más larga. Rendimiento • Dos formas de mejorar el rendimiento: – Reduciendo la tasa de misses – Reduciendo la penalidad por misses • Una manera de reducir la tasa de misses es aumentando el tamaño del bloque – Sin embargo, esto puede aumentar la penalidad por misses: es el tiempo requerido para ir a buscar un bloque en el siguiente nivel y cargarlo en la caché. – Este tiempo tiene dos componentes: • Latencia de la primera palabra • Tiempo de transferencia del resto del bloque: este se incrementa a medida que crece el tamaño del bloque – Algunas soluciones para este problema: • Diseño de un sistema de memoria que permita transferir grandes bloques de manera mas eficiente • Ocultar el tiempo de transferencia reanudando la ejecución tan pronto como sea posible (cuando ya esté la palabra pedida) sin esperar que todo el bloque haya sido transferido. Otras formas de reducir los fallos de caché • Cambiando la manera en que se mapea un bloque en la memoria caché. • Por ejemplo: – Que un bloque pueda ir a cualquier posición de la caché: mapeo totalmente asociativo – Reduce los misses por conflicto: aquellos bloques que ya estaban pero fueron desalojados porque otro bloque lo reemplazó. – Implementación: • Para buscar un bloque se debe recorrer TODA la cachéèun comparador por cada entrada, para hacer todas las comparaciones en paralelo. • Inconveniente: incremento del costo en hardware. • Solución: cachés con pocos bloques O bien: buscar un término medio: asociativas por conjuntos One- way set associative (direct mapped) Block Tag Data 0 1 2 Two- way set associative Set 3 0 4 1 5 2 6 3 Tag Data Tag Data 7 Four-way set associative Set Tag Data Tag Data Tag Data Tag Data 0 1 Eight -way set associative (fully associative) Tag Data Tag Data Tag Data Tag Data Tag Data Tag Data Tag Data Tag Data Asociativa por conjuntos • Dentro de cada conjunto (set), la asignación de entradas es totalmente asociativa. • Los conjuntos son de n-vias: es decir, el bloque se asigna en cualquiera de las n vías del conjunto • La asignación de un bloque a un conjunto es por mapeo directo. Implementación Address 31 30 12 11 10 9 8 8 22 Index 0 1 2 V Tag Data V 3210 Tag Data V Tag Data V Tag Data 253 254 255 22 4-to-1 multiplexor Hit Data 32 Asociatividad en Cachés • Ejemplo: Se tienen 3 cachés pequeñas, cada una consistente en cuatro bloques de una palabra. Una es totalmente asociativa, la segunda es asociativa de 2 vías por conjunto, y la tercera es de mapeo directo. Encontrar el número de fallos para cada organización de la caché para la siguiente secuencia de direcciones de bloque: 0,8,0,6,8. • Mapeo Directo: • Dirección Dirección de Bloque en Caché 0 0 módulo 4=0 8 8 módulo 4=0 6 6 módulo 4=2 • Fallos: los cinco son fallos. Asociatividad en Cachés • Totalmente Asociativa: • Hay cuatro bloques, y cualquier bloque de memoria puede estar en cualquier bloque. • 0 fallo,8 fallo,0 acierto,6 fallo,8 acierto • Asociativa por dos conjuntos de 2 vías: • Dirección Dirección de Bloque en Caché 0 0 módulo 2=0 8 8 módulo 2=0 6 6 módulo 2=0 • 0 fallo, 8 fallo, 0 acierto, 6 fallo (desplaza al 8), 8 fallo Rendimiento • La asociatividad aumenta el rendimiento, es decir, disminuye la tasa de fallos, pero aumenta el tiempo del acierto (circuitería). El mayor beneficio se obtiene al pasar de una de mapeo directo a una asociativa de 2 vías. 15% 12% Miss rate 9% 6% 3% 0% One-way Two-way Four-way Associativity Eight-way 1 KB 16 KB 2 KB 32 KB 4 KB 64 KB 8 KB 128 KB Algoritmos de reemplazo • ¿Que bloque tiene que ser reemplazado? – Es una pregunta para las cachés asociativas. En las totalmente asociativas, cualquier bloque es el candidato, en las asocaitivas de n-vías alguno de los n. – Algoritmos: • Aleatorio • LRU (least recently used): es costoso para mas de 4 víasè se usa un aproximado. • El algoritmo de reemplazo para cachés se realiza mediante hardware, por eso debe ser sencillo Una alternativa para disminuir la penalización por fallo • Cachés Multinivel: agregar un segundo nivel de caché – La caché primaria (nivel 1) está en el mismo chip que el procesador. – Se implementa con memoria SRAM otro nivel de memoria entre la principal y el nivel 1. – Si no está en L1, es probable que esté en L2, y el tiempo de acceso a L2 es menor que el tiempo de acceso a memoria principal. Cachés Multinivel Ejemplo: – Sea una CPU con un reloj de 500 Mhz, un CPI de 1.0, una tasa de fallos del 5% y 200ns de acceso a DRAM. – Le agregamos una caché de nivel 2 con 20ns de tiempo de acceso y una tasa de fallos a memoria principal del 2% – Cuanto mas rápida es la máquina con los dos niveles de caché? CON UN NIVEL DE CACHÉ Penalización por fallos a MP, en ciclos: 200 nseg/(2nseg/ciclo)=100 ciclos CPI con bloqueos por memoria= 1 + 5%*100=6 CON DOS NIVELES DE CACHÉ Penalización por fallos a L2, en ciclos: 20 nseg/(2nseg/ciclo)=10 ciclos Penalización por fallos a MP en ciclos: 10 ciclos + 100 ciclos=110 ciclos CPI con bloqueos por memoria= 1 + bloqueos del nivel 1 + bloqueos del nivel 2 CPI total= 1 + 0,05 (10 ciclos * 0,98 + 110 ciclos*0,02)=1,6 FIN Jerarquía de Memoria