Qué ocurre si cache está llena y queremos traer algo nuevo?
Reemplazo del bloque
Qué ocurre si queremos traer algo nuevo y el lugar donde queremos ponerlo ya está ocupado? estrategia de escritura
Reemplazo de bloque
Cache de traducción directa
No hay elección: sólo una línea disponible
Cache completamente asociativo
Todas las líneas disponibles, elegir la mejor
Cache asociativo por conjuntos
Todas las líneas dentro del conjunto disponibles, elegir la mejor
Elección de la línea a reemplazar
Objetivo
Reemplazar la línea que va a ser utilizada más lejos en el futuro
Algoritmos de reemplazo
Random: elegir línea al azar
LRU (least recently used): elegir línea menos recientemente utilizada
Asociatividad 2-way 4-way 8-way Ejemplo: Tasas de fallo medidas en un benchmark 1.12% 1.12% 1.13% 1.13% 1.17% 1.15% 256KB 1.5% 1.4% 1.7% 1.5% 2.0% 1.9% 64KB 5.0% 4.4% 5.3% 4.7% 5.7% 5.2% 16KB Random LRU Random LRU Random LRU Tamaño
Algunas preguntas Alternativas de diseño
Cómo sabemos si está en cache?
Identificación del bloque
Dónde lo ponemos en cache?
U bicación del bloque
Qué ocurre si cache está llena y queremos traer algo nuevo?
Reemplazo del bloque
Qué ocurre si queremos traer algo nuevo y el lugar donde queremos ponerlo ya está ocupado? estrategia de escritura
Estrategia de escritura
Escritura sincrónica (write-through)
Escribir en el cache y en el nivel siguiente de la jerarquía
Escritura asincrónica (write-back)
Escribir sólo en el cache, escribir en nivel siguiente sólo al reemplazar el bloque
Requiere un bit de estado adicional en el cache para indicar que bloque ha sido modificado (bit M)
Comparación
WT
Pro: fallo de lectura no produce escrituras
Con: alto costo de escritura a menos que se use un buffer
Buffer siempre se usa para no esperar por DRAM
WB
Pro: evitar escrituras múltiples del mismo bloque a DRAM
Con: Más complejo, fallo de lectura puede producir escritura
Buffer de escritura para write-through
Buffer almacena escrituras pendientes
Procesador escribe en buffer y cache
Controlador de memoria escribe contenidos del bloque a memoria
Buffer de escritura es FIFO
Número típico de entradas: 4-8
Nota: buffer de escritura puede producir conflicto RAW
Fallo de lectura antes de que el buffer haya escrito en DRAM
Soluciones
Esperar a buffer vacío antes de servir el fallo de lectura
Al servir fallo de lectura, verificar contenidos del buffer antes de ir a DRAM (búsqueda asociativa en buffer)
CPU Cache Buffer de escritura DRAM
Política ante fallo de escritura
¿Qué hacer si store produce un fallo?
Traer bloque al cache (write-allocate)
Evita fallo posterior si se lee del mismo bloque
Pero si no se lee, habríamos sacado del cache un bloque potencialmente importante
Sólo escribir a DRAM (write-around)
Ahorra espacio en el cache si el bloque escrito no se accesa de nuevo en un tiempo largo
Mejoras al desempeño
¿Cómo mejorar el desempeño?
Reducir tasa de fallos
Reducir penalidad de fallos
Reducir tiempo de acierto
Desempeño dado por Tiempo Promedio de Acceso a Memoria En inglés Average Memory Access Time AMAT = tasa de aciertos*tiempo de acierto + (1- tasa de fallos)*penalidad de fallo AMAT = (1 - tasa de fallos) * tiempo de acierto + tasa de fallos * penalidad de fallo
Mejoras al desempeño
¿Cómo mejorar el desempeño?
Reducir tasa de fallos
Reducir penalidad de fallos
Reducir tiempo de acierto
Desempeño dado por Tiempo Promedio de Acceso a Memoria En inglés Average Memory Access Time AMAT = tasa de aciertos*tiempo de acierto + (1- tasa de fallos)*penalidad de fallo AMAT = (1 - tasa de fallos ) * tiempo de acierto + tasa de fallos * penalidad de fallo
Reducir tasa de fallos (I)
Explotar localidad espacial con bloques más grandes
Pero incrementa penalidad de fallo
También incrementa fallos por conflicto (menos bloques)
Tasa fallos cache directo tamaño N = tasa fallos cache APC de 2 vías tamaño N/2
Pero recordar que tiempo de acierto es mayor.
Conflict Cache Size (KB) Miss Rate per Type 0 0.02 0.04 0.06 0.08 0.1 0.12 0.14 1 2 4 8 16 32 64 128 1-way 2-way 4-way 8-way Capacity Compulsory
Reducir tasa de fallos (III)
Cache de víctimas (victim cache)
Pequeño buffer asociativo almacena bloques recientemente eliminados del cache
Reduce fallos por conflicto en cache directo manteniendo acceso rápido
Jouppi[1990]: cache de víctimas de 4 entradas elimina 20%-95% de fallos de conflicto en cache directo de 4KB
Utilizado en procesadores DEC Alpha y HP
Al siguiente nivel de jerarquía Datos Tags Tag + comp Tag + comp Tag + comp Tag + comp Línea datos Línea datos Línea datos Línea datos
Operación con Cache Víctima
1. Acierto en L1, no se necesita accesar a cache víctima
2. Fallo en L1 por bloque en ubicación b, acierto en cache víctima en ubicación v, intercambiar contenido de b y v (toma un ciclo extra)
3. Fallo en L1, fallo en cache víctima, cargar bloque del siguiente nivel en jerarquía y ponerlo en L1, poner bloque que estaba en L1 en cache víctima, si cache víctima esta llena, reemplazar una de las entradas
Buffer víctima de 4 u 8 entradas para una cache mapeada directa funciona bien
Cache víctima Fallo en L1 Fallo CV CPU dirección b DRAM Cache CV (1) Fallo L1 (2) Fallo CV
Cache víctima Fallo en L1 Fallo CV CPU dirección b DRAM m Cache CV (3) Acierto DRAM Dato en bloque m
Cache víctima Fallo en L1 Fallo CV CPU dirección m DRAM m Cache CV (4) Copia bloque m En donde estaba b Y b en cache CV b
Cache víctima Fallo en L1, Acierto en CV CPU dirección b DRAM Cache CV Acierto En CV (2) Fallo en L1 (1) v
Reducir tasa de fallos (IV)
Prefetch
Traer bloques al cache antes de que el programa los requiera
Reduce fallos obligatorios (compulsory)
Útil cuando localidad espacial es muy buena (instrucciones y datos), pero requiere predicción de saltos
Cache de trazas (trace cache)
Integrar prefetch y predicción: instrucciones en cache en orden de ejecución
Utilizado en arquitectura Netburst de Intel (Pentium 4)
Acceso a datos (ayuda por software): Instrucciones “touch”
Similar a load, pero indica al cache que dato se accesará pronto
Presentes en procesadores IBM Power PC
Mejoras al desempeño
¿Cómo mejorar el desempeño?
Reducir tasa de fallos
Reducir penalidad de fallos
Reducir tiempo de acierto
Desempeño dado por Tiempo Promedio de Acceso a Memoria En inglés Average Memory Access Time AMAT = tasa de aciertos*tiempo de acierto + (1- tasa de fallos)*penalidad de fallo AMAT = (1 - tasa de fallos) * tiempo de acierto + tasa de fallos * penalidad de fallo
Reducir penalidad de fallos (I)
Mejorar desempeño de sistema de memoria principal (DRAM)
Bus de acceso a memoria más rápido, más ancho
Buses anchos tienen problemas de skew, preferible aumentar velocidad (ej. DDR, double-pumped Front Side Bus)
Pentium 4 utiliza un bus de 200MHz – 266MHz pero transfiere datos 4 veces por ciclo para un ancho de banda efectivo de 800MHz – 1066MHz (quad-pumped)
Acceso por bloques entrelazado, paginado, sincrónico
Usado en servidores (chipset intel Orion) por costo de implem.
En caso de fallo, traer al cache dato requerido primero, y resto del bloque después
Latencia es alta de todas maneras
Útil sólo en bloques grandes
Localidad espacial: probablemente hay que esperar el siguiente dato de todas formas
Reducir penalidad de fallo (II)
Buffer de escritura
Almacena escrituras a memoria pendientes
Fallo de lectura tiene prioridad sobre buffer de escritura para acceso a DRAM
Resolver conflictos RAW: buscar bloque en buffer de escritura antes de traer de DRAM
Fallos sin bloqueo
Permitir que procesador ejecute otras instrucciones mientras se resuelve el fallo
Ejecución desordenada de instrucciones
Útil en procesadores superescalares o multihebra
Problema: puede producirse otro fallo antes de resolver el primero
Pentium 4 puede manejar hasta 4 fallos simultáneos
Múltiples bancos de memoria mejoran desempeño
Mejoras al desempeño
¿Cómo mejorar el desempeño?
Reducir tasa de fallos
Reducir penalidad de fallos
Reducir tiempo de acierto
Desempeño dado por Tiempo Promedio de Acceso a Memoria En inglés Average Memory Access Time AMAT = tasa de aciertos*tiempo de acierto + (1- tasa de fallos)*penalidad de fallo AMAT = (1 - tasa de fallos) * tiempo de acierto + tasa de fallos * penalidad de fallo
Reducir tiempo de acierto
Parámetro crítico para L1
Utilizar L1 directo + cache de víctimas o L2
Segmentar (pipeline) acceso a L1
Etapa 1: determinar hit/miss
Etapa 2: transferir dato a CPU
Tratar conflictos estructurales por acceso a L1
Cache unificado: Un cache L1 para datos e instrucciones
Ventaja: mejor tasa de acierto
Desventaja: conflictos estructurales (stalls)
Arquitectura Harvard: Dos cache L1 independientes para datos e instrucciones
Ventaja: elimina conflictos estructurales
Desventaja: división del cache aumenta tasa de fallos
Minimizar fallos: ubicación de páginas completamente asociativa
Política de escritura asincrónica (write-back)
Páginas grandes: 4KB – 16MB
Disco tiene alta latencia pero mejor ancho de banda: bajo costo incremental de accesar bloques más grandes
Traducción de direcciones por hardware, manejo de fallos por software
Sistema operativo ordena acceso a disco e implementa algoritmo de reemplazo
Penalidad de fallo demasiado alta para esperar: entregar CPU a otro proceso (o hebra) hasta que página esté en memoria
Implementación de Memoria Virtual
Paginación
DRAM dividida en porciones iguales denominados marcos de páginas
En MV denominadas páginas o página virtual
Usa tabla de página traducción de direcciones
Espacio físico de direcciones Espacio virtual de direcciones Disco página Marco página
Tabla de páginas
Traducción de direcciones utiliza tabla de páginas en memoria
Dirección virtual (menos offset) utilizada como índice en tabla
Registro especializado contiene dirección de inicio de tabla en memoria (por proceso)
Entrada en la tabla (PTE: Page Table Entry)
Bit presente/ausente o válido
Bit de modificación
Bits de protección
Dirección de marco real o bloque de disco
Página virtual offset V Marco/Bloque M Prot. Dir. Virtual Tabla Pág. Dir. Base V Prot. Marco Pág. Virtual offset 10 Marco real offset 10 Dir. Física
Costo de traducción de un nivel
Tabla de páginas de un nivel: una entrada (PTE) por página virtual
Una tabla de páginas por proceso
Tamaño de tabla
Asumir PTE de 4 bytes
Ej. Página de 4KB, espacio de direcciones de 32 bits
# páginas virtuales = 2 32 /2 12 = 2 20
Tamaño tabla = 2 20 * 4 = 4MB por proceso
Ej. Página de 4KB, espacio de direcciones de 64 bits
# páginas virtuales = 2 64 /2 12 = 2 52
Tamaño tabla = 2 52 * 4 = Más de 16.000.000GB por proceso!!
Tablas de páginas de un nivel demasiado grandes
Además, un gran porcentaje de las entradas nunca se accesan
Impráctico mantener tabla completa en memoria
Ilustración con tablas de páginas Programa A Programa B Memoria física V.p.0 V.p.0 V.p.1 V.p.1 V.p.2 V.p.2 V.p.3 V.p.n V.p.q Frame 0 Frame 1 Frame 2 Frame m 1 1 0 1 2 m 0 Tabla página Programa A Bit válido Tabla Página Programa B 0 1 1 1 0
Traducción de dos niveles
Dos niveles de tablas
Tabla de nivel 1
PTE indica ubicación de tabla de nivel 2
Siempre en memoria
Tablas de nivel 2
PTE indica marco real, protecciones, etc.
Pueden ser paginadas a disco
Utilizado por mayoría de microprocesadores comerciales (ej. Intel)
Dirección virtual de 32 bits 4 bytes 4 bytes 4KB Tabla N1 Tablas N2 Páginas memoria Índice PTE1 offset Índice PTE2 10 10 12 Tabla Nivel 1: 1K PTE Espacio total Tabla N1: 4KB Tabla Nivel 2: 1K PTE 4KB Espacio total Tabla N2: 1K * 4KB = 4MB
Desventajas Tablas de Páginas
Típicamente una o múltiples tablas por proceso.
Caro por uso de memoria sólo para traducción
Otras alternativas para mejorar uso de memoria
Tabla de páginas invertidas
Tablas de páginas usando hashing
Procesadores como IBM System 38, UltraSparc y PowerPC usan este tipo de implementación
No las veremos en este curso
Tabla de páginas invertida
Sólo mantener PTEs de páginas presentes en memoria física
Tabla invertida organizada como tabla hash en memoria principal
Buscar asociativamente por número de página virtual
Si está presente en tabla, extraer marco de página y protecciones
Si no está presente en tabla, corresponde a un fallo de página
Utilizado por IBM System 38 (AS 400), UltraSparc, PowerPC
Pag. V Tabla hash Pág. Virtual = Marco, etc Acierto/fallo Tabla de páginas invertida
Tiempo de traducción de direcciones
Necesario traducir dirección en cada acceso a memoria
Uno o dos accesos más a memoria
Posible fallo de página
Todo esto antes de ir al cache a ver si el dato está ahí
Solución
Cache de traducciones
También llamado TLB (Translation Lookaside Buffer)
Completamente asociativo
CPU MMU Cache Mem. Principal VA PA miss hit dato
TLB
Almacena traducciones de página más recientes
Cache de traducciones
Implementado como pequeña memoria asociativa
Funciona bien porque localidad de traducciones es tremendamente alta (página de 4KB – 16MB muchos accesos a la misma página)
Basta con ~64 entradas
Reemplazo por hardware o software
TLB Tabla Pág marco p.v. Dir. física Espacio físico de direcciones Espacio virtual de direcciones Disco 2 2 0 5 2 0 1 3 Dir. virtual p.v. off marco off
Cache en espacio de direcciones reales
Necesario traducir dirección antes de accesar el cache
Acceso simultáneo a TLB y cache
Reducir tiempo de acceso a dato en memoria
Sólo posible si índice de acceso a cache es parte del “offset” de la dirección virtual
TLB provee marco de página (tag para el cache)
TLB Cache 1K líneas 10 2 00 4 bytes índice 1 K Pág. virtual offset 20 búsqueda asociativa 64 Hit/ Miss Tag Dato = marco Cache directo, bloque de 4 bytes Hit / Miss
TLB Offset Número página virtual tag Número marco v d prot Copia de PTE Dirección De CPU Offset
Memoria Virtual y Caches
Cache en espacio virtual de direcciones datos CPU MMU Cache Memoria principal P.V. hit Marco
Cache trabaja con direcciones virtuales, no físicas
No es necesario traducir antes de accesar cache
Sólo traducir en caso de fallo en el cache
Problemas
Necesario vaciar el cache al entregar CPU a otro proceso, o incluir identificador de proceso/usuario en cache
¿Qué pasa con páginas de memoria física compartidas?
Misma página real, diferentes páginas virtuales
¿Cómo mantener memoria consistente?
Segmentación
Problemas con espacios de memoria virtual planos
Utilización de espacio plano de 32/64 bits no es completa
Diferentes áreas de memoria necesitan diferentes protecciones (ej. código, datos, stack, heap, sistema operativo)
Segmentación
Dividir espacio de direcciones en segmentos
Cada segmento tiene asociado una posición en memoria real, un tamaño y protecciones
Programas pueden compartir segmentos con acceso controlado
No confundir con segmentación (pipelining)
código datos stack constantes Espacio de memoria plano Espacio de memoria segmentado Sólo ejecución Lectura/escritura Sólo lectura Lectura/escritura
Implementación de segmentación
Unidad de manejo de memoria (MMU) traduce dirección a espacio plano y verifica permisos de acceso y tamaño del segmento
Protecciones de segmento
Descriptor de segmento (entrada en tabla de segmentos) contiene protecciones, dirección base del segmento y tamaño
Ej. Procesadores Intel
Segmentación + paginación
Cada segmento tratado como espacio de memoria virtual paginado
0 comments
Post a comment