- Aprender
- Informática
- Ciencias de la computación
- Organización y arquitectura de computadores
- Jerarquía de memoria y cachés
Jerarquía de memoria y cachés
IntermedioUnidad 5 de 6 del curso Curso de Organización y arquitectura de computadores
Lo que aprenderás
- Describe cómo los programas reutilizan datos y código, compara las tecnologías de memoria que los almacenan y explica cómo colaboran los niveles pequeños y rápidos con los niveles grandes y lentos.
- Reconoce la localidad temporal y espacial en los programasIdentifica los dos tipos de localidad en los accesos a código y datos y explica por qué permiten que una memoria pequeña y rápida atienda la mayoría de los accesos.
- Compara las memorias SRAM, DRAM y flashDescribe cómo almacenan bits las memorias SRAM, DRAM y flash y compara su velocidad, densidad, coste por bit, volatilidad y posición típica en la jerarquía.
- Describe cómo colaboran los niveles de la jerarquíaNombra los niveles desde los registros hasta el almacenamiento, usa el vocabulario de aciertos y fallos y explica cómo la jerarquía da la ilusión de una memoria grande y rápida.
- Reconoce la localidad temporal y espacial en los programas
- Usa los campos de etiqueta, índice y desplazamiento de una dirección para localizar un bloque, sigue secuencias de accesos y compara organizaciones de caché desde la correspondencia directa hasta la asociación completa.
- Divide una dirección en etiqueta, índice y desplazamientoCalcula los tamaños de los campos de una caché de correspondencia directa a partir de su capacidad y tamaño de bloque, divide una dirección en sus campos y cuenta el almacenamiento que necesita la caché.
- Sigue los accesos a través de una caché de correspondencia directaSigue una secuencia de direcciones a través de una pequeña caché de correspondencia directa, registra cada acierto o fallo y el contenido de la caché, e identifica los bloques que se expulsan entre sí.
- Usa cachés asociativas por conjuntos y completamente asociativasLocaliza bloques en cachés asociativas por conjuntos de n vías y completamente asociativas, elige una víctima con una política de reemplazo y sopesa las menores tasas de fallos frente al coste de hardware y el tiempo de acierto.
- Divide una dirección en etiqueta, índice y desplazamiento
- Describe qué ocurre en un fallo, clasifica los fallos por su causa, relaciona el tamaño de la caché, el tamaño de bloque y la asociatividad con la tasa de fallos, y compara las formas en que las cachés gestionan las escrituras.
- Gestiona los fallos de caché y clasifica sus causasDescribe los pasos de un fallo de caché, clasifica los fallos en obligatorios, de capacidad y de conflicto, y explica cómo el tamaño de la caché, el tamaño de bloque y la asociatividad modifican cada tipo.
- Compara las políticas de escritura de las cachésExplica cómo las cachés de escritura directa y diferida mantienen actualizada la memoria, qué hacen los búferes de escritura y los bits de modificación, y cómo gestionan los fallos de escritura las políticas con y sin asignación en escritura.
- Gestiona los fallos de caché y clasifica sus causas
- Calcula tasas de aciertos, el tiempo medio de acceso a memoria y los ciclos de parada de memoria, inclúyelos en el CPI y el tiempo de ejecución y analiza sistemas con varios niveles de caché.
- Calcula la tasa de aciertos y el tiempo medio de acceso a memoriaCalcula las tasas de aciertos y fallos y el tiempo medio de acceso a memoria de una caché, incluidas mezclas de accesos a instrucciones y datos, y úsalos para comparar diseños.
- Incluye las paradas de memoria en el CPI y el tiempo de ejecuciónAñade los ciclos de parada de memoria a la ecuación de rendimiento de la CPU, determina cuánto le cuesta una caché a un programa y explica por qué los procesadores más rápidos sufren más por la memoria lenta.
- Analiza las cachés multinivelExplica por qué los procesadores usan varios niveles de caché, distingue las tasas locales y globales de fallos y calcula el tiempo medio de acceso a memoria y el CPI para jerarquías de dos y tres niveles.
- Calcula la tasa de aciertos y el tiempo medio de acceso a memoria
- Describe cómo se traducen las direcciones virtuales a direcciones físicas mediante una tabla de páginas, por qué un fallo de página es un fallo gestionado por el sistema operativo y cómo el TLB acelera la traducción.
- Traduce una dirección virtual mediante una tabla de páginasExplica qué proporciona la memoria virtual, divide una dirección virtual en número de página y desplazamiento, tradúcela mediante una entrada de la tabla de páginas y describe qué ocurre en un fallo de página.
- Acelera la traducción con un TLBExplica cómo el búfer de traducciones anticipadas almacena traducciones en caché, sigue un acceso a través del TLB, la tabla de páginas y la caché, y observa cómo se solapan la caché y la traducción.
- Traduce una dirección virtual mediante una tabla de páginas
- Organiza bucles y estructuras de datos para que los programas aprovechen bien la jerarquía de memoria, y aplica el procesamiento por bloques y la precarga para reutilizar los datos mientras están en la caché.
- Organiza los bucles y los datos para aprovechar la localidadOrdena los bucles de acuerdo con el almacenamiento de los arreglos, evita pasos de acceso perjudiciales y elige organizaciones de datos que traigan a la caché solo datos útiles.
- Organiza los cálculos por bloques y usa la precargaReestructura los bucles en bloques que permanecen en la caché mientras se reutilizan, elige un tamaño de bloque y explica cómo la precarga por hardware y software oculta la latencia de memoria.
- Organiza los bucles y los datos para aprovechar la localidad
Guía de estudio de Jerarquía de memoria y cachés
1Explica por qué los sistemas informáticos usan una jerarquía de memoria
Los programas usan repetidamente una pequeña parte de su código y sus datos. Esa reutilización explica por qué una caché pequeña puede atender la mayoría de los accesos incluso cuando el programa completo es mucho más grande. Distingue la reutilización en el tiempo de las direcciones cercanas, compara las celdas que forman la SRAM, la DRAM y la memoria flash, y relaciona esas tecnologías con los aciertos, los fallos y las transferencias a través de la jerarquía. Más adelante, el mismo patrón de acceso determinará si ayuda un diseño de caché o una transformación de bucles.
1.1 Cómo reutilizan los programas los datos cercanos
Una caché funciona porque el siguiente acceso a memoria suele estar relacionado con uno reciente. Durante un intervalo breve, la mayoría de los programas usan solo una pequeña parte de su espacio de direcciones. Este patrón es la localidad. Una caché mantiene esa parte activa cerca del procesador, donde puede atender los accesos rápidamente.
Reutilización en el tiempo y el espacio
La localidad temporal significa reutilizar un elemento poco después de acceder a él. Un bucle busca repetidamente las instrucciones de su cuerpo. Un total acumulado se lee y actualiza muchas veces. Mantener esos elementos disponibles evita buscarlos de nuevo en un nivel más lento.
La localidad espacial significa acceder a elementos en direcciones cercanas. Un recorrido de un arreglo lee elementos adyacentes y el código de ejecución secuencial busca instrucciones sucesivas. Una caché aprovecha esto buscando un bloque completo, también llamado línea de caché, cuando se produce un fallo. Los bytes cercanos llegan antes de que el programa los solicite.
Estos patrones pueden darse juntos. Las instrucciones de un bucle son adyacentes y se ejecutan repetidamente, por lo que el flujo de instrucciones tiene localidad tanto espacial como temporal. Un elemento de un arreglo que se lee exactamente una vez no tiene reutilización temporal, aunque el recorrido del arreglo que lo rodea tenga localidad espacial.
Cuenta los bloques en un recorrido de un arreglo
Considera este bucle de C con enteros de 4 bytes y bloques de caché de 64 bytes:
for (int i = 0; i < 1000; i++) {
sum += a[i];
}
Un bloque contiene enteros. El arreglo ocupa bytes. Si su primer elemento está alineado con un bloque, el recorrido toca bloques: 62 bloques completos y uno parcial.
En una caché inicialmente vacía, sin precarga ni interferencias, el primer acceso a cada bloque falla. Los elementos restantes de ese bloque aciertan. Así, el arreglo causa 63 fallos en 1000 accesos, aproximadamente el 6,3 %. Contar un fallo por elemento pasaría por alto todos los datos vecinos útiles que se traen con cada fallo.
Las variables del código fuente sum e i se reutilizan con frecuencia. Sin embargo, un compilador suele mantenerlas en registros, por lo que su reutilización en el código fuente no tiene por qué producir accesos a la caché de datos. Analiza los accesos a memoria que ejecuta el programa compilado al estimar el tráfico de caché.
El conjunto de trabajo debe caber y coexistir
El conjunto de trabajo es la colección de bloques usados durante un intervalo de tiempo elegido. Si caben en la caché y las reglas de ubicación permiten que coexistan, los accesos repetidos aciertan en su mayoría después de las cargas iniciales. El intervalo de tiempo importa: un programa completo puede ser enorme mientras que un bucle activo usa solo unos pocos bloques.
La capacidad por sí sola no basta. Dos bloques muy usados pueden asignarse a una misma entrada de correspondencia directa y expulsarse entre sí mientras otras entradas permanecen vacías. Por tanto, un conjunto de trabajo puede caber por número de bytes y, aun así, no permanecer en caché.
Los nodos dispersos de una lista enlazada y las consultas aleatorias de una tabla hash grande suelen tener poca localidad espacial. Un recorrido por columnas de un arreglo almacenado por filas también salta muchos elementos cercanos. Estos patrones traen bytes que pueden quedar sin usar antes de la expulsión. El hardware aprovecha la localidad que aporta el patrón de acceso; cambiar la organización o el recorrido del programa puede hacer que se aproveche una mayor parte de cada bloque buscado.
Puntos clave
- La localidad temporal reutiliza un elemento; la localidad espacial accede a direcciones cercanas.
- Buscar un bloque completo permite que los accesos posteriores a bytes cercanos acierten.
- Un conjunto de trabajo debe caber en la capacidad disponible y coexistir según las reglas de ubicación de la caché.
- Las variables del código fuente que se mantienen en registros no generan accesos a la caché de datos.
1.2 Celdas de memoria, transferencias y compromisos
Las tecnologías de memoria implican compromisos entre velocidad, densidad, coste y persistencia. El procesador necesita acceso rápido a una pequeña cantidad de datos y espacio asequible para muchos más. La SRAM, la DRAM y la memoria flash satisfacen distintas partes de esa necesidad.
Compara las celdas
| Tecnología | Cómo se almacena un bit | Refresco y alimentación | Función principal |
|---|---|---|---|
| SRAM | Un circuito estable, normalmente de seis transistores | Sin refresco; pierde los datos sin alimentación | Cachés integradas en el chip |
| DRAM | Carga en un condensador, al que se accede mediante un transistor | Refresco periódico; pierde los datos sin alimentación | Memoria principal |
| Memoria flash NAND | Una celda no volátil cuyo estado se programa eléctricamente | Conserva los datos sin alimentación; resistencia limitada a las escrituras | Almacenamiento |
Una celda de SRAM es rápida, pero ocupa una superficie considerable, lo que hace que la SRAM sea relativamente cara por bit. Las celdas de DRAM son más pequeñas, por lo que la DRAM ofrece más capacidad a un menor coste por bit. Su carga se pierde. El refresco lee y restaura las filas dentro de un intervalo fijo; DDR4 a temperatura normal usa un intervalo de 64 ms. «Estática» en SRAM significa que no necesita refresco, no que conserve los datos tras perder la alimentación.
Por qué varía el tiempo de acceso a la DRAM
La DRAM se organiza en bancos, con filas y columnas en cada banco. Activar una fila la copia a un búfer de fila. Las lecturas y escrituras seleccionan después columnas de esa fila abierta. Para abrir una fila diferente en el mismo banco, primero debe precargarse el banco. Un acceso a una fila ya abierta evita ese trabajo de cambio de fila.
Las columnas consecutivas pueden transferirse en una ráfaga, lo que favorece la búsqueda de un bloque de caché. Distribuir las solicitudes entre bancos y canales permite solapar las transferencias. La memoria DDR transfiere datos en ambos flancos del reloj. Estas características aumentan la tasa de entrega de datos sin eliminar la espera por los primeros datos.
Distingue la latencia del ancho de banda
La latencia es la demora hasta que llegan los primeros datos. El ancho de banda es la cantidad transferida por unidad de tiempo. Una interfaz de gran ancho de banda puede seguir teniendo una larga demora inicial.
Por ejemplo, un canal DDR5-4800 con un camino de datos agregado de 64 bits transporta 8 bytes por transferencia. Su tasa máxima teórica es bytes/s, o 38,4 GB/s. El ancho de banda sostenido de una aplicación puede ser menor porque los comandos, los cambios de fila y otras tareas consumen tiempo.
Si una solicitud espera 60 ns y después recibe un bloque de 64 bytes a 16 GB/s, la tasa de transferencia es de 16 bytes/ns. La transferencia tarda ns, lo que da unos 64 ns en total. Mejorar solo el ancho de banda reduce la parte de 4 ns, no los 60 ns iniciales.
La memoria flash conserva los datos, pero gestiona las escrituras de otra manera
La memoria flash NAND lee y programa páginas de varios KiB. Para reutilizar una página programada es necesario borrar su bloque de borrado más grande, que contiene muchas páginas. Las lecturas de páginas suelen tardar decenas de microsegundos, la programación desde cientos de microsegundos hasta unos pocos milisegundos y el borrado milisegundos.
Los ciclos de programación y borrado desgastan las celdas. La memoria flash densa de varios bits suele soportar unos pocos miles de ciclos, mientras que las celdas de un solo bit pueden soportar alrededor de 100 000. Los controladores usan la nivelación del desgaste para repartir las escrituras entre los bloques.
Como referencia, el acceso a la SRAM tarda aproximadamente 1 ns; a la DRAM, aproximadamente 50–100 ns; las lecturas de memoria flash NAND, aproximadamente 25–100 µs; y el acceso a disco, aproximadamente 5–10 ms. Los dispositivos reales varían. La jerarquía combina estas tecnologías porque una sola no puede ofrecer a la vez sus ventajas de velocidad, capacidad y precio.
Puntos clave
- La SRAM y la DRAM son volátiles; la memoria flash conserva los datos sin alimentación.
- El refresco de la DRAM restaura la carga que se pierde, mientras que los búferes de fila y las ráfagas mejoran la eficiencia de acceso.
- La latencia mide el tiempo de espera inicial; el ancho de banda mide la tasa de transferencia.
- La memoria flash programa páginas y borra bloques más grandes.
- La nivelación del desgaste reparte el desgaste por programación y borrado entre los bloques de memoria flash.
1.3 Sigue un acceso a través de la jerarquía
La jerarquía de memoria sitúa el almacenamiento pequeño y rápido cerca del procesador y el almacenamiento progresivamente más grande, más lejos. La localidad permite que los niveles pequeños atiendan una gran fracción de las solicitudes, mientras que los niveles inferiores proporcionan capacidad.
Niveles y unidades de transferencia
Un recorrido típico pasa por los registros, L1, L2, L3, la memoria principal y el almacenamiento. L1 suele tener cachés separadas de instrucciones y datos de alrededor de 32–64 KiB cada una por núcleo. L2 suele tener de cientos de KiB a unos pocos MiB por núcleo, mientras que L3 suele ser compartida y contener de varios a decenas de MiB. La memoria principal contiene muchos GiB y el almacenamiento contiene cientos de GB o más. Los diseños difieren en tamaño y en cómo se comparten.
En un procesador cercano a 3 GHz, las latencias de carga representativas son de unos 4–5 ciclos para L1, 12–15 para L2, 30–50 para L3 y 200–300 para la DRAM. Una L1 puede aceptar una nueva solicitud en cada ciclo aunque una solicitud necesite varios ciclos para completarse: la productividad y la latencia describen propiedades diferentes.
Los datos viajan por las cachés en bloques, normalmente de 64 bytes. La memoria virtual usa páginas, normalmente de 4 KiB, al mover el contenido de las páginas entre la memoria y el almacenamiento. Una línea de caché y una página cumplen funciones de agrupación similares a diferentes escalas; no son la misma unidad de transferencia.
Aciertos, fallos y tiempos
Un acierto significa que un nivel contiene los datos solicitados. Un fallo significa que debe obtener los datos de un nivel inferior. Ambas palabras se refieren al nivel que se comprueba: un fallo de L1 todavía puede ser un acierto de L2.
La tasa de aciertos es el número de aciertos dividido entre el número de accesos, y la tasa de fallos es uno menos la tasa de aciertos. El tiempo de acierto incluye la comprobación del nivel y la decisión de si la solicitud acierta. La penalización por fallo es el tiempo adicional necesario en un fallo para obtener y entregar el bloque.
Supón que una caché simplificada tiene un tiempo de acierto de 1 ciclo, una tasa de aciertos del 97 % y una penalización adicional por fallo de 100 ciclos. Cada acceso paga 1 ciclo, mientras que el 3 % paga otros 100:
Un fallo tarda 101 ciclos en este ejemplo. Usar 100 como tiempo completo del fallo contabilizaría de forma incoherente la búsqueda inicial. Incluso una tasa de aciertos alta deja que los fallos costosos se reflejen en el promedio.
¿Quién gestiona cada nivel?
El compilador asigna valores adecuados a los registros. El hardware de caché mueve bloques automáticamente durante las cargas, los almacenamientos y las búsquedas de instrucciones. Los programas usan direcciones; no seleccionan entradas de caché. El sistema operativo gestiona las correspondencias de memoria virtual con apoyo del hardware y se ocupa de las páginas que deben llevarse a la memoria principal.
Separar las instrucciones de los datos en L1 permite que un cauce de segmentación busque una instrucción y acceda a datos a la vez sin competir por un mismo puerto de caché. Las cachés inferiores suelen estar unificadas y almacenan bloques tanto de instrucciones como de datos.
Algunas jerarquías son inclusivas: un bloque presente en un nivel superior también tiene una copia en el inferior. Otras son exclusivas o no inclusivas, por lo que no se garantiza una copia en cada caché inferior. Dibuja una jerarquía como un recorrido de búsqueda y transferencia, no como una garantía de que todos los niveles contienen subconjuntos idénticos.
Hacer L1 más grande puede reducir los fallos, pero aumentar el retardo de acceso y la energía. Añadir cachés inferiores más grandes permite mantener rápida L1 y atender muchos de sus fallos antes de llegar a la DRAM. Evalúa ese compromiso mediante el tiempo de acceso, no solo mediante la capacidad.
Puntos clave
- Un acierto o fallo es relativo al nivel que se comprueba.
- El tiempo de acierto se paga en cada búsqueda; la penalización por fallo es tiempo adicional en los fallos.
- Las cachés transfieren bloques, mientras que la memoria virtual usa páginas.
- Las cachés L1 separadas de instrucciones y datos permiten accesos simultáneos del cauce de segmentación.
- La inclusión de caché es una elección de diseño.
- Una mayor capacidad debe sopesarse frente al tiempo de acierto y la energía.
2Localiza datos en cachés de correspondencia directa y asociativas por conjuntos
Una dirección de memoria debe indicar a una caché dónde buscar y qué bytes devolver. Divide las direcciones en campos, sigue cómo las solicitudes reemplazan bloques y después ofrece a cada bloque más opciones de ubicación mediante conjuntos y vías. Las trazas pequeñas muestran las reglas del hardware: un byte diferente puede acertar en un bloque cargado, mientras que un bloque usado repetidamente puede fallar tras un conflicto. Estas reglas de búsqueda también determinan cuántas etiquetas y bits de control debe almacenar la caché.
2.1 Identifica la etiqueta, el índice y el desplazamiento
Una dirección de byte identifica un byte de la memoria. Una caché busca un bloque completo, por lo que la búsqueda primero identifica ese bloque y después selecciona los bytes solicitados dentro de él. En una caché de correspondencia directa, cada bloque tiene exactamente una entrada posible.
Divide la dirección según la función
Para un tamaño de bloque de bytes, los bits menos significativos de la dirección forman el desplazamiento. Dividir la dirección de byte entre el tamaño de bloque y descartar el resto da la dirección de bloque. El resto es el desplazamiento.
Si la caché tiene entradas, el índice de entrada es
Cuando el número de entradas es una potencia de dos, el índice es el grupo de bits de la dirección situado inmediatamente por encima del desplazamiento. Los bits más significativos restantes forman la etiqueta, que indica a la caché cuál de los muchos bloques que comparten un índice está presente.
El orden de los campos, de los bits más significativos a los menos significativos, es etiqueta | índice | desplazamiento. Para una anchura de dirección de bits:
Usa el número de entradas para calcular el índice. Tomar el logaritmo de la capacidad en bytes contaría los bits de desplazamiento por segunda vez.
Resuelve un ejemplo de 16 KiB
Una caché de correspondencia directa de 16 KiB con bloques de 64 bytes tiene entradas. El desplazamiento ocupa 6 bits, el índice 8 bits y la etiqueta bits para direcciones de 32 bits.
Para la dirección de byte 0x1234ABCD, los 6 bits menos significativos dan el desplazamiento 13, o 0x0D. Al quitar esos bits se obtiene la dirección de bloque 0x48D2AF. Sus 8 bits menos significativos son 0xAF, por lo que el índice es 175. Los bits restantes dan la etiqueta 0x48D2.
La dirección de byte puede reconstruirse a partir de estos campos: concatena la etiqueta, el índice de 8 bits y el desplazamiento de 6 bits. Las anchuras de los campos importan porque un dígito hexadecimal representa 4 bits; los límites no tienen por qué quedar entre dígitos hexadecimales.
Una etiqueta coincidente necesita una entrada válida
Cada entrada almacena datos, una etiqueta y un bit de validez. El índice selecciona la entrada. Un acierto requiere tanto un bit de validez activado como la igualdad entre la etiqueta almacenada y la etiqueta solicitada. Al inicio, una entrada puede contener bits arbitrarios; el bit de validez impide que esos bits se confundan con un bloque cargado.
Una vez que el bloque está presente, los accesos a otros bytes de ese bloque también aciertan. Un acierto no requiere la misma dirección de byte que se usó para buscar el bloque.
Cuenta los metadatos por separado
La capacidad indicada de la caché normalmente cuenta solo los datos. Aquí cada entrada contiene 512 bits de datos, 18 bits de etiqueta y 1 bit de validez, es decir, 531 bits. El almacenamiento total es
Solo los datos usan 131 072 bits. Las etiquetas y la validez añaden 4864 bits, aproximadamente el 3,7 % del almacenamiento de datos. Un diseño de escritura diferida también necesita bits de modificación; los diseños más complejos necesitan más información de control.
El índice usa los bits menos significativos de la dirección de bloque para que los bloques sucesivos se distribuyan en entradas sucesivas. Una dirección más ancha deja sin cambios las anchuras del desplazamiento y del índice cuando la capacidad y el tamaño de bloque se mantienen fijos; los bits adicionales amplían la etiqueta.
Puntos clave
- Calcula el número de entradas dividiendo la capacidad de datos entre el tamaño de bloque.
- Los bits menos significativos de la dirección seleccionan el desplazamiento de byte; los bits siguientes seleccionan la entrada.
- Un acierto requiere una entrada válida y una etiqueta coincidente.
- La capacidad de datos anunciada excluye las etiquetas y los bits de control.
2.2 Sigue una traza de caché de correspondencia directa
Una traza de caché registra cómo cambia cada acceso los bloques almacenados. Mantén un estado separado para cada entrada y actualízalo inmediatamente después de cada fallo. La siguiente solicitud usa la caché actualizada, no la caché tal como estaba al principio.
Prepara la traza
Toma una caché de correspondencia directa de 64 bytes con cuatro entradas de 16 bytes. Comienza vacía. Para cada dirección de byte, divide entre 16 para hallar el bloque y después calcula el bloque módulo 4 para obtener el índice. La etiqueta es el número de bloque dividido entre 4, con la parte fraccionaria descartada. Hay 4 bits de desplazamiento y 2 bits de índice.
En una lectura, examina la entrada seleccionada. Si es válida y la etiqueta coincide, registra un acierto. En caso contrario, registra un fallo, reemplaza el bloque y la etiqueta de esa entrada y activa su bit de validez. En una caché de correspondencia directa no hay opción de reemplazo.
Sigue los ocho accesos
| Dirección de byte | Bloque | Índice | Etiqueta | Resultado | Bloque que queda en la entrada seleccionada |
|---|---|---|---|---|---|
0x00 | 0 | 0 | 0 | Fallo | 0 |
0x04 | 0 | 0 | 0 | Acierto | 0 |
0x40 | 4 | 0 | 1 | Fallo | 4 |
0x00 | 0 | 0 | 0 | Fallo | 0 |
0x14 | 1 | 1 | 0 | Fallo | 1 |
0x44 | 4 | 0 | 1 | Fallo | 4 |
0x08 | 0 | 0 | 0 | Fallo | 0 |
0x84 | 8 | 0 | 2 | Fallo | 8 |
El primer acceso llena la entrada 0 con el bloque 0. La dirección siguiente, 0x04, sigue dentro de ese bloque de 16 bytes, por lo que acierta pese a señalar un byte diferente. 0x40 pertenece al bloque 4. Tiene el mismo índice que el bloque 0, pero una etiqueta diferente, por lo que reemplaza al bloque 0.
Por tanto, el segundo 0x00 falla. El uso anterior por sí solo no puede garantizar un acierto: el bloque debe seguir presente. La solicitud a 0x14 carga el bloque 1 en la entrada 1 y deja la entrada 0 sin cambios.
A continuación, 0x44 vuelve a cargar el bloque 4 en la entrada 0. 0x08 necesita el bloque 0 y expulsa al bloque 4. Por último, 0x84 carga el bloque 8 en esa misma entrada. Al final, la entrada 0 contiene el bloque 8 y la entrada 1 contiene el bloque 1; las entradas 2 y 3 siguen siendo inválidas.
Interpreta el comportamiento
Hay un acierto y siete fallos, por lo que la tasa de aciertos es . Los bloques 0, 4 y 8 compiten por la entrada 0. La caché tiene cuatro entradas, pero este patrón de acceso usa solo dos de ellas. Las expulsiones repetidas se deben a conflictos de asignación, no a una falta de almacenamiento total para los cuatro bloques distintos.
La carga de un bloque pone a disposición todos sus bytes. Por tanto, en un recorrido secuencial, un fallo puede servir para muchos de los elementos siguientes. Aquí los accesos en conflicto eliminan repetidamente ese beneficio antes de que se solicite el siguiente byte cercano.
Para obtener trazas fiables, identifica explícitamente las direcciones de byte y los números de bloque. Aplicar módulo 4 directamente a la dirección de byte omite la división entre el tamaño de bloque y envía las solicitudes a entradas equivocadas. Registra el reemplazo incluso cuando el nuevo bloque se haya cargado antes: cada fallo instala el bloque solicitado y su etiqueta en la entrada seleccionada.
Puntos clave
- Actualiza el contenido de la caché después de cada fallo.
- Las direcciones de byte diferentes dentro de un mismo bloque presente en caché aciertan.
- Un bloque al que se ha accedido antes puede fallar después de ser expulsado.
- Los conflictos de asignación pueden causar fallos mientras otras entradas permanecen vacías.
- El ejemplo tiene un acierto en ocho accesos, una tasa de aciertos del 12,5 %.
2.3 Da a los bloques más opciones de ubicación
Una caché asociativa por conjuntos ofrece a un bloque varias entradas posibles sin buscar en toda la caché. El índice selecciona un conjunto y el bloque puede ocupar cualquier vía de ese conjunto. Esto reduce los conflictos entre bloques que comparten un índice.
Calcula los conjuntos y los campos
Para una capacidad de datos , un tamaño de bloque y una asociatividad :
El índice de conjunto es la dirección de bloque módulo el número de conjuntos. El desplazamiento sigue dependiendo solo del tamaño de bloque. La etiqueta contiene los bits más significativos restantes.
Una caché de 32 KiB y 8 vías con bloques de 64 bytes tiene 512 bloques y 64 conjuntos. Con direcciones de 32 bits, las anchuras del desplazamiento, el índice y la etiqueta son de 6, 6 y 20 bits. La dirección 0x1234ABCD tiene desplazamiento 13, conjunto 47 y etiqueta 0x1234A.
Con capacidad y tamaño de bloque fijos, duplicar la asociatividad reduce a la mitad el número de conjuntos. Un bit de índice se convierte en un bit de etiqueta; no se añade capacidad de datos.
| Organización | Ubicación permitida | Índice |
|---|---|---|
| Correspondencia directa | Una entrada | Selecciona esa entrada |
| n vías | Cualquiera de las n vías de un conjunto | Selecciona ese conjunto |
| Completamente asociativa | Cualquier entrada de la caché | Sin campo de índice |
La búsqueda compara la etiqueta en paralelo con todas las etiquetas válidas del conjunto elegido. Una vía coincidente suministra los datos mediante un selector. Más vías requieren más comparaciones y hardware de selección, lo que puede aumentar el tiempo de acierto y la energía.
Reemplaza un bloque solo cuando el conjunto está lleno
Usa primero una vía inválida. Cuando todas las vías están ocupadas, LRU, o reemplazo del bloque usado menos recientemente, expulsa el bloque cuyo acceso más reciente es el más antiguo. Actualiza la información de uso reciente tanto en los aciertos como en las cargas. Un conjunto de 2 vías solo necesita un bit para registrar su vía LRU; los conjuntos más grandes suelen usar aproximaciones pseudo-LRU.
FIFO expulsa el bloque cargado antes, aunque se haya accedido a él recientemente. El reemplazo aleatorio elige una víctima sin mantener toda la información de uso reciente. Es sencillo y puede rendir de forma similar a LRU en cachés grandes.
Revisa la traza pequeña con dos vías
La caché de 64 bytes con bloques de 16 bytes tiene ahora dos conjuntos de dos vías. Los bloques 0, 4 y 8 se asignan al conjunto 0, mientras que el bloque 1 se asigna al conjunto 1. Para 0x00, 0x04, 0x40, 0x00, 0x14, 0x44, 0x08, 0x84, los resultados son fallo, acierto, fallo, acierto, fallo, acierto, acierto, fallo.
Los bloques 0 y 4 pueden coexistir, por lo que los accesos repetidos a ellos aciertan. Justo antes del último acceso, el bloque 0 se usó más recientemente que el bloque 4. Al cargar el bloque 8, LRU expulsa el bloque 4. Cuatro de ocho accesos aciertan, frente a uno en la versión de correspondencia directa.
La asociatividad no puede eliminar los fallos obligatorios ni hacer que quepa un conjunto de trabajo mayor que la capacidad. Tampoco puede evitar los conflictos cuando más de n bloques muy usados compiten por un conjunto de n vías. Un ciclo repetido de n+1 bloques de este tipo puede hacer que LRU falle cada vez. Añadir relleno a los arreglos puede cambiar su asignación a conjuntos; elegir más vías es solo una posible respuesta a un problema de conflictos.
Puntos clave
- El número de conjuntos es la capacidad de datos dividida entre el tamaño de bloque y el número de vías.
- Una mayor asociatividad cambia la flexibilidad de ubicación, no la capacidad de datos.
- LRU registra los accesos; FIFO registra el orden de inserción.
- Llena las vías inválidas antes de reemplazar bloques válidos.
- Las cachés completamente asociativas no tienen campo de índice, pero siguen teniendo fallos de arranque en frío y de capacidad.
- Más vías pueden reducir los fallos de conflicto a costa de hardware y tiempo.
3Explica los fallos de caché y las políticas de escritura
Un fallo puede deberse al primer uso, a una capacidad limitada o a bloques que compiten por las mismas posiciones. Identificar su causa ayuda a explicar qué cambios de diseño pueden reducirlo. Los almacenamientos añaden un segundo problema: la jerarquía debe decidir cuándo llegan los datos modificados al nivel siguiente y qué ocurre si el bloque está ausente. Sigue la atención de fallos de lectura, las políticas de escritura, los búferes y las expulsiones de bloques modificados para relacionar el estado de la caché con el tráfico y las demoras que produce.
3.1 Explica qué causó un fallo
Un fallo de caché es un evento que tiene tanto un mecanismo como una causa. El mecanismo describe cómo se atiende la solicitud. La causa explica por qué faltaba el bloque necesario y qué cambio de diseño podría ayudar.
Gestiona un fallo de lectura
En un cauce de segmentación sencillo con ejecución en orden, la caché detecta una entrada inválida o una etiqueta que no coincide y el procesador se detiene. La caché solicita el bloque al nivel siguiente. Si la víctima elegida está modificada, sus datos cambiados deben conservarse escribiéndolos en el nivel inferior. El bloque que llega se instala con su etiqueta y bit de validez, y se completa el acceso pendiente. Un fallo de la caché de instrucciones también espera el bloque de la instrucción y después busca de nuevo la instrucción.
La transferencia de la palabra crítica primero solicita primero la palabra necesaria del bloque que se devuelve. La reanudación anticipada permite reanudar la ejecución en cuanto llega esa palabra. Una caché no bloqueante puede atender otros aciertos y llevar el seguimiento de los fallos pendientes mientras un procesador con ejecución fuera de orden realiza trabajo independiente. Estos mecanismos reducen la espera; no hacen desaparecer la dependencia de datos original.
Usa las tres C
| Clase de fallo | Por qué falta el bloque | Prueba de diagnóstico |
|---|---|---|
| Obligatorio | Es su primer acceso | Fallaría incluso con capacidad ilimitada |
| De capacidad | Los bloques activos superan el espacio disponible | Una caché LRU completamente asociativa del mismo tamaño también falla |
| De conflicto | Las restricciones de ubicación lo expulsaron | Una caché LRU completamente asociativa del mismo tamaño acierta |
Aplica primero la prueba del primer acceso. El primer acceso a un bloque es obligatorio aunque su entrada de destino ya esté ocupada. Para los fallos posteriores, compara la caché real con una caché LRU completamente asociativa de igual capacidad de datos y tamaño de bloque, ambas con el mismo historial de accesos.
En la traza anterior de cuatro entradas, los bloques 0, 4, 1 y 8 causan cada uno un fallo obligatorio. La caché de correspondencia directa también falla en los accesos repetidos a los bloques 0 y 4. Una caché completamente asociativa de cuatro entradas puede conservar los cuatro bloques distintos, por lo que esos tres fallos repetidos son de conflicto. No hay fallos de capacidad.
Elige un cambio que aborde la causa
Aumentar la capacidad puede permitir conservar un conjunto de trabajo mayor. Aumentar la asociatividad puede permitir que coexistan bloques en conflicto. Aumentar el tamaño de bloque puede aprovechar la localidad espacial al traer más elementos vecinos útiles con cada carga.
El tamaño de bloque tiene efectos contrapuestos. Con una capacidad de datos fija, los bloques más grandes implican menos bloques presentes. Los bytes no utilizados consumen espacio de caché, pueden desplazarse bloques útiles no relacionados y cada transferencia puede tardar más. La tasa de fallos suele bajar inicialmente al crecer el tamaño de bloque y después subir cuando estos costes superan el beneficio de la localidad espacial.
Una caché más grande también puede tener una búsqueda más larga, y las vías adicionales requieren más hardware de comparación. Evalúa los cambios mediante el tiempo medio de acceso, incluidos el tiempo de acierto y la penalización por fallo, en vez de suponer que una menor tasa de fallos garantiza un diseño más rápido.
En sistemas multinúcleo, la invalidación tras una escritura de otro núcleo puede causar fallos de coherencia. La precarga puede traer un bloque antes de su primer acceso por demanda, ocultando un fallo por demanda que la capacidad adicional por sí sola no puede evitar.
Puntos clave
- Clasifica los primeros accesos como obligatorios antes de comprobar otras causas.
- Usa una caché LRU completamente asociativa del mismo tamaño para distinguir los fallos de capacidad de los de conflicto.
- Los bloques más grandes ofrecen más localidad espacial útil a cambio de menos bloques presentes y transferencias más largas.
- La reanudación anticipada, la transferencia de la palabra crítica primero y las cachés no bloqueantes reducen la espera de distintas formas.
- Compara el tiempo de acceso completo al evaluar una mejora de la tasa de fallos.
3.2 Decide cuándo llegan los almacenamientos al nivel siguiente
Una instrucción de almacenamiento cambia un valor, por lo que la jerarquía necesita una regla para transmitir ese cambio hacia abajo. Hay dos decisiones separadas: qué hacer cuando un almacenamiento acierta y qué hacer cuando falla.
Escritura directa y escritura diferida
| Política | Acción ante un acierto de escritura | Efecto en el nivel siguiente |
|---|---|---|
| Escritura directa | Actualiza la caché y envía el almacenamiento al nivel inferior | Cada almacenamiento genera una actualización en el nivel inferior |
| Escritura diferida | Actualiza la caché y marca su bloque como modificado | Un bloque modificado se envía al nivel inferior cuando se expulsa |
Un bit de modificación registra que un bloque de escritura diferida contiene cambios que aún no se han escrito en el nivel siguiente. Una víctima limpia no necesita escritura diferida al nivel inferior. Los datos modificados de una víctima deben conservarse antes de poder reutilizar su entrada. Las cargas del procesador obtienen el valor nuevo de la caché incluso mientras la copia inferior es más antigua.
Para 100 almacenamientos en una variable de 4 bytes alojada en caché, la escritura directa sin combinar envía 100 escrituras, o 400 bytes de datos útiles. La escritura diferida puede combinar esos cambios en una escritura de un bloque de 64 bytes al expulsarlo. Esta comparación cuenta los datos útiles de actualización y excluye la carga inicial y la sobrecarga del protocolo.
El beneficio depende de la reutilización. Las escrituras repetidas en un bloque dan a la escritura diferida la oportunidad de combinar actualizaciones; las escrituras dispersas en muchos bloques pueden provocar muchas expulsiones de bloques modificados. Las cachés inferiores suelen usar escritura diferida para limitar el tráfico hacia la DRAM. Las cachés de datos L1 pueden usar cualquiera de las dos políticas.
Un búfer de escritura oculta la espera, no el tráfico
Un búfer de escritura pone en cola las escrituras pendientes hacia el nivel inferior. Con escritura directa, el procesador puede continuar en cuanto un almacenamiento entra en el búfer, en vez de esperar a que termine la escritura en la memoria inferior. El nivel inferior se pone al día a medida que se vacían los almacenamientos del búfer; puede quedar temporalmente por detrás del valor de la caché.
El búfer tiene capacidad finita. Si los almacenamientos llegan más rápido de lo que el nivel inferior los acepta durante suficiente tiempo, se llena y el procesador se detiene. Un búfer cambia cuándo espera el procesador, no el ancho de banda sostenido del destino.
Sin búfer ni solapamiento, si el 10 % de las instrucciones son almacenamientos y cada almacenamiento añade 100 ciclos de espera, un CPI base de 1 pasa a ser . El uso de un búfer puede ocultar gran parte de esta demora cuando el destino mantiene el ritmo en promedio.
Trata por separado un fallo de escritura
La asignación en escritura busca el bloque ausente y lo lleva a la caché; después aplica el almacenamiento. Combina de forma natural con la escritura diferida porque los accesos y escrituras posteriores pueden reutilizar ese bloque. La política sin asignación en escritura, también llamada escritura alrededor de la caché (write-around), envía el almacenamiento al nivel inferior sin cargar el bloque en esta caché. Combina de forma natural con la escritura directa y puede evitar el desplazamiento de bloques útiles durante un flujo de salida de una sola vez.
Estas son decisiones de política independientes. Saber que una caché es de escritura directa no indica por sí solo si un fallo de escritura asigna una línea; una traza debe especificar ambas políticas.
Un fallo de escritura diferida que selecciona una víctima modificada implica datos salientes además de la carga entrante, lo que aumenta la penalización salvo que los búferes o el solapamiento oculten parte del trabajo. Otros núcleos y dispositivos de entrada y salida también necesitan una visión coherente cuando la memoria inferior está desactualizada. La coherencia y los mecanismos del sistema coordinan esa visibilidad; un bit de modificación por sí solo registra los cambios pendientes.
Puntos clave
- La escritura directa envía cada almacenamiento al nivel inferior; la escritura diferida retrasa los cambios hasta que se escribe el bloque modificado.
- Un bit de modificación distingue los bloques modificados de los limpios.
- Los búferes de escritura ocultan la latencia hasta que se llenan; no crean ancho de banda.
- Las políticas con y sin asignación en escritura especifican el comportamiento ante fallos de escritura independientemente de la política ante aciertos.
- La expulsión de un bloque modificado añade tráfico saliente a la gestión del fallo.
- La escritura directa con búfer puede dejar temporalmente desactualizado el nivel inferior.
4Calcula el rendimiento de la caché
Un diseño de caché es útil solo si sus aciertos y fallos dan lugar a un mejor tiempo de ejecución. Combina el tiempo de búsqueda, la frecuencia de fallos y la demora adicional por fallo, y después relaciona los costes de acceso con las paradas por instrucción. Separa el tráfico de instrucciones y datos, mantén la coherencia entre los ciclos y el tiempo de reloj y anida los costes de las cachés inferiores usando la fracción de solicitudes que llega a cada nivel. Estos cálculos muestran por qué una tasa de fallos menor o un reloj más rápido pueden dar un beneficio menor del esperado.
4.1 Calcula el tiempo medio de acceso a memoria
Una tasa de aciertos alta es útil, pero no es una medida completa del rendimiento. Un pequeño número de fallos costosos puede dominar el promedio, y un diseño que evita más fallos puede aun así resultar peor si su búsqueda se vuelve demasiado lenta.
Empieza por las definiciones de tasas y tiempos
Las dos fracciones suman uno. Convierte los porcentajes en fracciones antes de multiplicar: el 5 % es 0,05.
El tiempo medio de acceso a memoria, o AMAT, es
Toda solicitud comprueba la caché, incluidas las solicitudes que fallan. La penalización es la demora adicional después de esa búsqueda. De forma equivalente, pondera el tiempo de acierto por la fracción de aciertos y el tiempo total de fallo por la fracción de fallos; al desarrollar la expresión se obtiene la misma fórmula.
Con un tiempo de acierto de 1 ciclo, un 5 % de fallos y una penalización adicional de 100 ciclos, el AMAT es ciclos. A 2 GHz, cada ciclo dura 0,5 ns, por lo que son 3 ns. Haz todos los cálculos en ciclos o todos en unidades de tiempo y después convierte el resultado final si es necesario.
Compara diseños completos
La caché A tiene una búsqueda de 1,0 ns y un 5 % de fallos. La caché B tiene una búsqueda de 1,2 ns y un 3,5 % de fallos. Con una penalización de 50 ns:
B gana porque evitar fallos costosos compensa con creces su búsqueda más lenta. Si la penalización baja a 10 ns, A tarda 1,5 ns y B tarda 1,55 ns. Ahora gana A. El valor de una mejora de la tasa de fallos es proporcional a la penalización que evita.
Pondera correctamente los accesos a instrucciones y datos
Supón que cada instrucción produce una búsqueda de instrucción y 0,3 accesos a datos en promedio. La tasa de fallos de instrucciones es del 2 % y la tasa de fallos de datos es del 4 %. En 100 instrucciones hay 100 búsquedas y 30 accesos a datos. Los fallos esperados son de 130 accesos.
La fracción combinada de fallos es, por tanto, Con tiempos de acierto iguales de 1 ciclo y penalizaciones de 100 ciclos, el AMAT es de unos 3,46 ciclos por acceso a memoria. Promediar directamente el 2 % y el 4 % daría incorrectamente el mismo peso a los dos tipos de acceso.
Estima una penalización de transferencia
Una solicitud de bloque puede incluir una latencia inicial seguida del tiempo de transferencia. Con una latencia de 60 ns, una línea de 64 bytes y un ancho de banda de 16 GB/s, la transferencia tarda 4 ns, lo que hace que la penalización adicional sea de unos 64 ns. A 3 GHz hay 3 ciclos/ns, por lo que equivale a 192 ciclos.
Comprueba qué incluye el tiempo indicado en un problema. Si proporciona un tiempo completo de acceso con fallo, resta la búsqueda inicial antes de tratar esa cifra como una penalización adicional por fallo. Contar la búsqueda dos veces sobreestima el AMAT.
Puntos clave
- El AMAT suma la búsqueda inicial al coste adicional esperado de los fallos.
- Usa fracciones decimales para los fallos y una unidad de tiempo coherente.
- Pondera las tasas de instrucciones y datos según sus números de accesos.
- Una tasa de fallos menor puede dar peor resultado si el tiempo de acierto es suficientemente más lento.
4.2 Convierte los fallos en tiempo de ejecución
El AMAT mide el tiempo por acceso a memoria. El CPI mide los ciclos por instrucción ejecutada. Para relacionarlos, cuenta cuántas solicitudes de instrucciones y datos produce cada instrucción y cuántos ciclos de parada añaden esas solicitudes.
Suma los términos de parada
Para un procesador sencillo con ejecución en orden cuyos aciertos de caché están incluidos en el CPI base, un fallo que no se solapa añade su penalización adicional. Con una tasa de fallos de instrucciones , accesos a datos por instrucción , una tasa de fallos de datos y una penalización en ciclos:
Cada instrucción tiene una solicitud de búsqueda de instrucción en este modelo. Solo las cargas y los almacenamientos hacen solicitudes de datos, por lo que debes multiplicar su tasa de fallos por su frecuencia. Si sus penalizaciones difieren, usa una penalización distinta en cada término.
Pasa de las solicitudes a las paradas
Sea el CPI base 1,0, la tasa de fallos de instrucciones del 2 %, la frecuencia de cargas y almacenamientos del 30 %, la tasa de fallos de datos del 4 % y la penalización por fallo de 100 ciclos. Las paradas por instrucciones son ciclos por instrucción. Las paradas por datos son . El CPI total es 4,2.
Con una caché perfecta, el CPI volvería a 1,0. Con el mismo reloj y número de instrucciones ejecutadas, eso daría un factor de aceleración de 4,2. La tasa de fallos de datos es el doble de la tasa de fallos de instrucciones, pero los fallos de instrucciones cuestan más tiempo en total porque se busca cada instrucción y solo el 30 % accede a datos.
No introduzcas el AMAT directamente como CPI. El AMAT es por acceso e incluye el tiempo de servicio de los aciertos. El cálculo del CPI aquí añade solo las paradas que exceden la ejecución base ya contabilizada.
Un reloj más rápido hace que cada espera de memoria cueste más ciclos
La latencia de la DRAM en nanosegundos no disminuye cuando aumenta la frecuencia del reloj del procesador. Duplicar la frecuencia convierte la misma espera de memoria de 100 ciclos en 200 ciclos con el nuevo reloj. El CPI del ejemplo pasa a ser
Cada nuevo ciclo dura la mitad, por lo que el tiempo de ejecución relativo pasa de 4,2 ciclos antiguos por instrucción al equivalente de 3,7 ciclos antiguos. El factor de aceleración es , muy por debajo de dos.
Las mejoras desplazan el cuello de botella
Si el CPI base baja de 1,0 a 0,5 mientras las paradas de memoria permanecen en 3,2, el CPI total pasa a ser 3,7. Las paradas consumen ahora de los ciclos. Mejorar el núcleo hace que la demora de memoria sin cambios ocupe una mayor proporción del tiempo de ejecución, un ejemplo de la ley de Amdahl.
El modelo sencillo cuenta todas las demoras por fallos como paradas. La ejecución fuera de orden y las cachés no bloqueantes pueden solapar los fallos con trabajo útil u otros fallos. Se necesitan contadores de hardware y mediciones del tiempo de ejecución para evaluar ese solapamiento en una máquina real. Al comparar diseños con este modelo, mantén el mismo flujo de instrucciones e indica qué demoras ya están incluidas en el CPI base.
Puntos clave
- Cuenta los fallos de instrucciones para cada instrucción y los fallos de datos solo para los accesos a datos.
- Añade las paradas adicionales por fallos a un CPI base que ya incluye los aciertos.
- Vuelve a convertir el tiempo de memoria a ciclos cuando cambia la frecuencia de reloj.
- Compara el tiempo de ejecución mediante el CPI multiplicado por la duración del ciclo, no solo mediante el CPI.
- El solapamiento puede hacer que las paradas reales sean menores que la suma sencilla de las penalizaciones por fallo.
4.3 Anida los costes de varios niveles de caché
Una caché inferior reduce la penalización que se paga cuando L1 falla. Tiene su propio tiempo de búsqueda y tasa de fallos, por lo que el coste esperado de la jerarquía debe seguir la fracción de solicitudes que llega a cada nivel.
Ten en cuenta el denominador de cada tasa
La tasa local de fallos de un nivel es su número de fallos dividido entre las solicitudes a ese nivel. Su tasa global de fallos es su número de fallos dividido entre todas las solicitudes de memoria del procesador.
Si L1 falla el 4 % de las veces y L2 falla en el 25 % de esas solicitudes, solo , o el 1 % de las solicitudes originales, llega a memoria. Una tasa local de fallos de L2 del 25 % no dice por sí sola qué fracción de todas las solicitudes llega a memoria: L1 filtró primero el flujo.
Para dos niveles comprobados secuencialmente:
Aquí y son tiempos de búsqueda, y son fracciones locales de fallos y es la penalización adicional de memoria. Solo los fallos de L1 pagan la búsqueda de L2. Solo los fallos en ambos niveles pagan la penalización de memoria.
Evalúa desde dentro hacia fuera
Usa un tiempo de acierto de L1 de 1 ciclo, una tasa de fallos de L1 del 4 %, un tiempo de acierto de L2 de 12 ciclos, una tasa local de fallos de L2 del 25 % y una penalización de memoria de 200 ciclos. Una solicitud que llega a L2 tarda en promedio ciclos adicionales. Así,
Sin L2, el AMAT sería ciclos. La búsqueda de L2 añade trabajo a cada fallo de L1, pero evita que la mayoría de esas solicitudes paguen la demora de memoria mucho mayor.
No sustituyas por la tasa global de fallos de L2 del 1 % dentro del paréntesis. Eso multiplicaría dos veces por la fracción de fallos de L1. Una forma desarrollada equivalente usa directamente la tasa global:
Añade L3 con la misma lógica
Con un tiempo de acierto de L3 de 40 ciclos y una tasa local de fallos del 40 %, el término de servicio de L3 es ciclos. El término de L2 pasa a ser ciclos. El AMAT global es ciclos.
La expresión completa es L3 se imputa solo a las solicitudes que fallan en ambos niveles superiores. Un nivel con una búsqueda muy lenta o muy pocos aciertos puede añadir más demora de la que ahorra.
Usa tasas por instrucción para el CPI
Supón que el CPI base es 1, L1 produce 0,032 fallos por instrucción y la memoria añade 100 ciclos. Sin L2, el CPI es . Añade una L2 de 10 ciclos cuya tasa local de fallos es del 25 %:
Con el mismo reloj, el factor de aceleración es . La cifra 0,032 ya representa fallos por instrucción, por lo que otro multiplicador de frecuencia de acceso contaría esa frecuencia dos veces.
Puntos clave
- Las tasas locales y globales de fallos tienen denominadores diferentes.
- Multiplica las fracciones locales de fallos para hallar la fracción que llega a un nivel inferior.
- Evalúa los tiempos de servicio anidados desde el nivel más bajo hacia arriba.
- Atribuye el tiempo de búsqueda de un nivel inferior solo a las solicitudes que llegan a ese nivel.
- Usa directamente los fallos por instrucción al calcular el CPI por paradas.
- Añadir una caché solo ayuda cuando la demora evitada supera el trabajo de búsqueda añadido.
5Explica cómo se integran la memoria virtual y los TLB en la jerarquía
Los programas emiten direcciones virtuales, mientras que las cachés identifican finalmente datos físicos. Las tablas de páginas proporcionan la correspondencia y los derechos de acceso, y un TLB mantiene las traducciones usadas recientemente cerca del procesador. Resuelve una traducción de direcciones, distingue una traducción ausente de un fallo de página y observa cómo el indexado de la caché puede solaparse con la traducción. Aquí se aplican las mismas ideas de jerarquía, pero las entradas de traducción, los bloques de datos y las páginas tienen funciones diferentes.
5.1 Traduce páginas y comprueba permisos
La memoria virtual separa las direcciones que usa un programa de las posiciones que contienen sus datos en la memoria principal. Cada proceso obtiene su propio espacio de direcciones virtuales. El hardware traduce las direcciones mediante las correspondencias del sistema operativo y comprueba si cada acceso solicitado está permitido.
Sustituye el número de página y conserva el desplazamiento
Una página es una región de tamaño fijo de direcciones virtuales. Un marco de página es un espacio del tamaño de una página en la memoria física. Con páginas de 4 KiB, cada página contiene 4096 bytes, por lo que el desplazamiento dentro de la página necesita 12 bits. Los bits más significativos restantes de la dirección virtual forman el número de página virtual, o VPN.
Una entrada de la tabla de páginas, o PTE, asigna un VPN a un número de página física, o PPN. La traducción sustituye el número de página, pero conserva el desplazamiento: se selecciona la misma posición de byte dentro del marco físico.
Para la dirección virtual 0x00403A7C, los 12 bits menos significativos dan el desplazamiento 0xA7C y el VPN es 0x00403. Si ese VPN se asigna al PPN 0x02F1C, la dirección física es 0x02F1CA7C. Añadir un desplazamiento de 12 bits al final equivale a multiplicar el PPN por 4096 y sumar el desplazamiento; sumar el PPN sin desplazar daría una dirección incorrecta.
Una correspondencia incluye permisos
Una PTE registra la validez, un número de página física y permisos como lectura, escritura, ejecución y acceso de usuario. Los bits de acceso y modificación registran el uso y la modificación. Un registro privilegiado del procesador identifica la tabla de páginas; RISC-V usa satp. Los programas de usuario no pueden reescribir libremente estas correspondencias.
Las tablas de páginas separadas permiten que una misma dirección virtual se refiera a datos físicos diferentes en distintos procesos. También permiten la compartición selectiva: dos procesos pueden asignar páginas virtuales al mismo marco físico, por ejemplo, para compartir código de biblioteca de solo lectura. El aislamiento y la compartición son ambos consecuencias de las correspondencias controladas.
Un fallo de página necesita la atención del sistema operativo
Un fallo de página es una excepción que se produce cuando la traducción o sus comprobaciones de permisos no pueden completarse normalmente. Un almacenamiento en una correspondencia de solo lectura puede provocar un fallo incluso si la página ya está en memoria.
Cuando una página necesaria no está en la memoria principal, el sistema operativo obtiene un marco físico, lee la página del almacenamiento, actualiza la correspondencia y reinicia la instrucción. Es posible que primero deba escribirse en el nivel inferior una página víctima modificada. Algunos fallos se resuelven sin almacenamiento, como al establecer una correspondencia con una página existente o gestionar la copia en escritura. Un acceso que el sistema no puede permitir puede terminar en un error del proceso.
Los fallos que requieren almacenamiento son costosos. A 3 GHz, una demora de 50 µs cuesta 150 000 ciclos y 1 ms cuesta 3 000 000. Las páginas grandes reparten los costes de transferencia entre muchos bytes. Una página virtual puede ocupar cualquier marco adecuado, y las páginas modificadas usan escritura diferida porque enviar cada almacenamiento directamente al almacenamiento secundario sería demasiado lento.
Las tablas de páginas también consumen memoria
Una tabla plana para direcciones virtuales de 32 bits y páginas de 4 KiB necesita entradas. Con 4 bytes por entrada, son 4 MiB por proceso. Los diseños reales usan tablas multinivel para evitar asignar una enorme tabla plana a espacios de direcciones dispersos; RISC-V Sv39 usa tres niveles.
La memoria virtual incluye traducción de direcciones, protección y compartición incluso cuando todas las páginas usadas caben en la DRAM. La paginación al almacenamiento es un uso de ese mecanismo, no todo su propósito.
Puntos clave
- La traducción cambia el número de página y conserva el desplazamiento dentro de la página.
- Los permisos de la PTE controlan las lecturas, las escrituras, la ejecución y el acceso de usuario.
- Un fallo de página puede significar que falta una página o que hay un problema de permisos.
- Algunos fallos de página se resuelven sin leer del almacenamiento.
- Las tablas de páginas permiten el aislamiento de procesos y la compartición deliberada.
- Una tabla plana tiene una entrada por página virtual, por lo que su coste de almacenamiento puede ser grande.
5.2 Almacena traducciones en caché con un TLB
La traducción de direcciones puede requerir varias lecturas de la tabla de páginas antes de que continúe un acceso a datos. Las entradas de la tabla de páginas pueden acertar en las cachés ordinarias, pero esas lecturas siguen añadiendo trabajo. El búfer de traducciones anticipadas, o TLB, almacena en caché las traducciones usadas recientemente para que la mayoría de los accesos puedan evitar un recorrido de la tabla de páginas.
Sigue un acceso permitido
Se busca el número de página virtual en el TLB. Una entrada coincidente proporciona el número de página física y la información de permisos. Tras las comprobaciones de permisos, la dirección física identifica los datos en la jerarquía de caché.
Ante un fallo de TLB, un recorrido de la tabla de páginas obtiene la traducción. Si la correspondencia es válida y permite la solicitud, la traducción se instala en el TLB y el acceso continúa. RISC-V y x86-64 normalmente usan mecanismos de recorrido por hardware; algunas arquitecturas usan gestores de software. Si la correspondencia no puede atender la solicitud, el procesador genera un fallo de página para el sistema operativo.
Por tanto, un fallo de TLB puede acompañar tanto a un acierto como a un fallo de caché de datos. Indica que la traducción no estaba en el TLB, no que la página faltara en la DRAM. A la inversa, un acierto de TLB puede acompañar a un fallo de caché o a un fallo de permisos por un acceso prohibido. La traducción y la presencia de los datos responden a preguntas diferentes.
Cuenta la memoria cubierta por las traducciones
La cobertura del TLB es el número de entradas multiplicado por el tamaño de página. Un TLB de 64 entradas con páginas de 4 KiB cubre 256 KiB a la vez. Con páginas de 2 MiB, 64 entradas cubren 128 MiB. Acceder a muchas páginas diferentes puede agotar la capacidad de traducción incluso cuando solo se usan unos pocos bytes de cada página.
Los TLB de primer nivel suelen contener decenas de entradas; los niveles inferiores de TLB pueden contener cientos o miles. Sus entradas incluyen etiquetas de número de página, correspondencias físicas, permisos y, a menudo, identificadores del espacio de direcciones. La localidad dentro de las páginas y la reutilización entre accesos cercanos mantienen altas las tasas de aciertos de traducción.
Por ejemplo, si el 1 % de los accesos requiere un recorrido de 30 ciclos y el tiempo de acierto de TLB está oculto por lo demás, los recorridos añaden ciclos por acceso en promedio. Este ejemplo supone que los recorridos terminan normalmente y excluye la gestión de fallos de página.
Solapa el indexado con la traducción
Una caché con índice físico y etiqueta física espera una dirección física antes de seleccionar su conjunto. Una caché con índice virtual y etiqueta física, o caché VIPT, comienza a leer un conjunto mientras el TLB traduce y después compara las etiquetas físicas.
El diseño VIPT sencillo toma todos los bits de índice y de desplazamiento dentro del bloque del desplazamiento dentro de la página, porque la traducción conserva esos bits. Esto requiere
Con páginas de 4 KiB, una caché de 32 KiB y 8 vías tiene 4 KiB por vía y cumple la condición. Una caché de 48 KiB y 12 vías también la cumple. Una caché de 64 KiB y 8 vías tiene 8 KiB por vía y necesita un bit del número de página para el indexado, por lo que requiere más vías o una gestión adicional.
Mantén actualizadas las correspondencias en caché
Las traducciones pertenecen a espacios de direcciones. Un cambio de contexto puede vaciar las entradas antiguas o distinguirlas mediante identificadores del espacio de direcciones, o ASID. Los cambios en las correspondencias requieren el mantenimiento correspondiente de la caché de traducciones; RISC-V proporciona sfence.vma. Cuando se expulsa una página de la memoria, su antigua traducción no debe seguir siendo utilizable en el TLB. El TLB contiene correspondencias y derechos de acceso, mientras que las cachés ordinarias contienen los datos y las instrucciones del programa.
Puntos clave
- Un TLB almacena traducciones y permisos, no datos del programa.
- Un recorrido satisfactorio de la tabla de páginas resuelve un fallo de TLB sin un fallo de página.
- La cobertura del TLB es el número de entradas multiplicado por el tamaño de página.
- El indexado VIPT sencillo hace caber los bits de índice y de desplazamiento dentro del bloque en el desplazamiento dentro de la página.
- Los ASID y la invalidación de traducciones impiden usar correspondencias del espacio de direcciones equivocado o correspondencias antiguas.
6Escribe programas que tengan en cuenta la caché
Los bucles y la organización de los datos determinan qué bytes solicita después un procesador. Sigue esas direcciones para mejorar la localidad espacial, conservar datos útiles mediante el procesamiento por bloques y comprender cuándo la precarga puede ocultar una espera. Compara los recorridos por filas y columnas, las organizaciones de registros y la huella de memoria de los bloques antes de medir un cambio. La capacidad, los conflictos entre conjuntos, la cobertura de traducción y el ancho de banda de memoria ayudan a explicar por qué una transformación funciona en una carga de trabajo y ayuda menos en otra.
6.1 Elige bucles y organizaciones que aprovechen cada línea
El código que tiene en cuenta la caché aprovecha los bytes traídos antes de que se expulse su bloque. Empieza por las direcciones que genera el bucle interno. Después pregúntate qué datos se reutilizan, qué distancia hay entre los accesos y si esos bloques pueden coexistir en la caché.
Recorre los arreglos en el orden de almacenamiento
C y C++ almacenan los arreglos rectangulares en orden por filas. Las columnas adyacentes de una fila son adyacentes en memoria. Fortran, MATLAB y Julia usan el orden por columnas; los arreglos de NumPy usan por defecto el orden por filas. El recorrido interno eficiente sigue la organización real.
Un arreglo de C double a[1024][1024] ocupa 8 MiB. Cada fila ocupa 8192 bytes. Con líneas de caché de 64 bytes, cada línea contiene ocho valores de tipo double. Un recorrido por filas puede usar los ocho antes de continuar, lo que da aproximadamente un fallo de arranque en frío por cada ocho accesos en un modelo sencillo de búsqueda por demanda.
Un recorrido por columnas avanza 8192 bytes entre accesos consecutivos. Toca 1024 líneas distintas antes de volver a visitar datos cercanos en la columna siguiente. Esas líneas ocupan 64 KiB, lo que supera una L1 de 32 KiB. También entran en conflicto: en una caché de 64 conjuntos, un paso de 128 líneas conserva el índice de conjunto. Un conjunto de 8 vías no puede contener 1024 líneas que compiten entre sí.
Añadir relleno a una fila hasta alcanzar 1032 valores de tipo double hace que su paso sea de 8256 bytes, o 129 líneas. Las filas sucesivas avanzan entonces un conjunto módulo 64, distribuyendo las solicitudes. El relleno aborda los conflictos de asignación; la cantidad de datos sigue importando.
Intercambia bucles cuando se conserva el resultado
El intercambio de bucles cambia qué bucle se ejecuta dentro de otro. En la multiplicación de matrices en orden por filas, el orden i, j, k recorre secuencialmente una fila de A, pero una columna de B. En un modelo de recorrido secuencial grande con poca reutilización entre pasadas, esto cuesta aproximadamente fallos por iteración interna.
Con i, k, j, el bucle interno recorre secuencialmente filas de B y C, mientras se reutiliza un elemento de A. Contar un recorrido nuevo para ambas filas da aproximadamente fallos por iteración, 4,5 veces menos. Si la fila de C, que se actualiza repetidamente, permanece en caché, la cifra se aproxima a 0,125. La capacidad de la caché y los conflictos determinan qué reutilización se conserva.
El intercambio debe conservar el comportamiento requerido del cálculo. Las dependencias, los punteros solapados y el orden de evaluación de coma flotante pueden limitar las transformaciones; los compiladores necesitan pruebas de que un cambio está permitido.
Trae los campos que usas
Un arreglo de estructuras agrupa todos los campos de un objeto. Una estructura de arreglos agrupa un campo de varios objetos. Si un registro de partícula contiene ocho valores de tipo double en una línea de 64 bytes, sumar solo x en un millón de registros alineados trae aproximadamente 64 MB. Un arreglo x contiguo y separado trae aproximadamente 8 MB y usa todos los valores de tipo double que llegan. El código que usa juntos todos los campos de cada partícula puede favorecer la organización original de estructuras.
Los nodos enlazados pueden estar dispersos, y cada dirección siguiente puede depender de un puntero recién cargado. Los arreglos contiguos o las reservas de nodos pueden mejorar la localidad. Los campos de uso frecuente y compactos también permiten que quepan más datos activos en cada nivel.
Mide el tiempo de ejecución y los contadores de hardware pertinentes antes y después de un cambio. Los fallos de caché pueden explicar un bucle lento, pero el cálculo, el ancho de banda o los saltos pueden ser el factor limitante. Mantén comparables la entrada y los resultados para que una diferencia de velocidad refleje el cambio que se evalúa.
Puntos clave
- Ajusta el bucle interno al orden de almacenamiento del arreglo.
- Los pasos grandes que son potencias de dos pueden concentrar las solicitudes en un conjunto.
- El relleno cambia la asignación; las organizaciones compactas reducen los bytes que se traen.
- El intercambio de bucles debe conservar el comportamiento requerido del cálculo.
- Elige arreglos de estructuras o estructuras de arreglos según los campos que se usen.
- Mide el cuello de botella y verifica los resultados al cambiar el código.
6.2 Reutiliza bloques y busca datos por adelantado
El intercambio de bucles mejora el orden de acceso. El procesamiento por bloques, también llamado tiling, va más allá al mantener activa una pequeña región de datos hasta completar su reutilización útil. La precarga adelanta una transferencia futura para que su demora se solape con trabajo útil.
Mantén un grupo de bloques en caché
En la multiplicación por bloques de matrices cuadradas, un bloque de A y uno de B contribuyen a un bloque de C. Un bloque de lado contiene elementos. Trabajar repetidamente en estos bloques pequeños permite reutilizar datos antes de pasar a la siguiente región.
Para valores de tipo double de 8 bytes, tres bloques requieren bytes. En una caché de 32 KiB, el límite de capacidad es
Elegir un lado de 32 usa 24 576 bytes, o 24 KiB, y deja algo de espacio para otros datos. Elegir 36 solo porque la aritmética lo permite deja mucho menos espacio y puede dar lugar a conflictos. La capacidad es una estimación inicial; los tamaños reales de bloque se ajustan mediante mediciones.
Un recorrido por bloques hace avanzar el bucle exterior según el tamaño de bloque. Sus límites internos se detienen en el menor de los dos valores: el final del bloque o el tamaño de la matriz. Por ejemplo, si una dimensión es 70 y los bloques tienen lado 32, el bloque final tiene solo seis elementos en esa dimensión. Un bloque final de tamaño completo accedería más allá del arreglo.
Estima lo que ahorra la reutilización
En un modelo simplificado de matrices grandes con líneas de 64 bytes, el orden ingenuo i, j, k tiene aproximadamente fallos cuando las filas recorridas secuencialmente ya no están en caché en la siguiente pasada. Una versión por bloques puede reducir esto a aproximadamente , suponiendo que los tres bloques de trabajo permanecen en caché e ignorando los conflictos.
Para y , estas estimaciones son de aproximadamente 1,2 mil millones y 8,4 millones de fallos, un factor de 144. Ambas versiones siguen realizando aproximadamente operaciones de coma flotante. El ahorro está en el movimiento repetido de datos, no en el número de operaciones aritméticas de la multiplicación. El modelo describe una reutilización ideal; el factor de aceleración medido también depende del ancho de banda, la ejecución y otros sobrecostes.
Precarga con suficiente antelación para ocultar la latencia
Los mecanismos de precarga por hardware reconocen flujos como los accesos secuenciales o de paso constante. Solicitan líneas antes de que los accesos por demanda las necesiten. El software también puede solicitar búsquedas por adelantado, por ejemplo, con __builtin_prefetch de GCC o Clang.
El momento importa. Una solicitud demasiado tardía deja esperando al acceso por demanda. Una solicitud demasiado temprana puede traer una línea que se expulse antes de usarse. Una solicitud incorrecta consume ancho de banda y espacio de caché sin ayudar al programa. El seguimiento de punteros es más difícil de precargar porque la dirección siguiente a menudo solo se conoce después de que llega el nodo actual.
Una precarga oportuna puede convertir fallos posteriores por demanda en aciertos, pero las líneas siguen viajando por la jerarquía. Oculta la latencia en vez de reducir los datos necesarios de una pasada secuencial. El procesamiento por bloques ayuda cuando se reutilizan valores; un recorrido de una sola vez no tiene datos repetidos que conservar y puede estar ya limitado por el ancho de banda de memoria.
Puntos clave
- El procesamiento por bloques mantiene activos los bloques reutilizados mientras sus datos son útiles.
- Estima el almacenamiento de los bloques para todos los arreglos que se necesitan simultáneamente.
- Gestiona los bloques parciales de los bordes con límites de bucle acotados.
- El procesamiento por bloques reduce el movimiento de datos y conserva la carga de trabajo aritmética.
- La precarga necesita direcciones útiles y suficiente antelación; las solicitudes incorrectas desperdician ancho de banda.
Ejemplos de Jerarquía de memoria y cachés
1De un recorrido de arreglo a una jerarquía de memoria
13 pasos
- 1Introducción¿Por qué mantener una memoria pequeña cerca?
Un procesador puede emitir trabajo mucho más rápido de lo que una memoria grande puede responder a cada solicitud. Una caché ayuda cuando un programa vuelve a datos recientes o usa direcciones cercanas; esa reutilización se denomina localidad. Sigue un recorrido de un arreglo para ver cuánto puede atender la carga de una sola línea y después relaciona esa reutilización con las tecnologías y los niveles que proporcionan los datos, la jerarquía de memoria.
- 2ExplicaciónDistingue dos tipos de localidad
La localidad temporal reutiliza pronto un elemento: el cuerpo de un bucle se ejecuta repetidamente y un total acumulado se actualiza en cada iteración. La localidad espacial usa direcciones cercanas: un recorrido secuencial de un arreglo lee elementos adyacentes.
Un bucle puede tener ambas en su flujo de instrucciones aunque cada elemento del arreglo se lea una sola vez. Identifica a qué se accede antes de asignar un tipo de localidad.
- 3Ejemplo¿Cuánto proporciona una línea?
Un arreglo alineado con un bloque contiene 1000 enteros de 4 bytes cada uno. Las líneas de caché contienen 64 bytes. Cada carga proporciona enteros consecutivos. Después de que falle el primer entero, los 15 siguientes pueden acertar. La última línea no tiene por qué estar llena: el arreglo de 4000 bytes necesita líneas.
- 4DesafíoPredice un recorrido más pequeño
Un arreglo alineado contiene 320 enteros de cuatro bytes. En una caché inicialmente vacía que busca por demanda, con líneas de 64 bytes, sin interferencias y con espacio para el arreglo, ¿cuántas lecturas del arreglo fallan? ¿Qué localidad proporciona los aciertos restantes?
---reveal---
Hay 16 enteros por línea y líneas, por lo que fallan 20 lecturas. Las otras 300 aciertan gracias a la localidad espacial. Cada elemento se usa una vez; estos aciertos no requieren reutilización temporal de los elementos.
- 5Idea claveUn conjunto de trabajo necesita posiciones utilizables
El conjunto de trabajo son los bloques usados durante un intervalo de tiempo. Un conjunto activo pequeño puede permanecer cerca incluso cuando el programa completo es grande.
Tanto la capacidad como la ubicación importan. Si dos bloques activos solo pueden ocupar una entrada compartida, pueden expulsarse entre sí mientras otras entradas permanecen vacías. Las variables de bucle mantenidas en registros tampoco necesitan espacio en la caché de datos, aunque el código fuente las lea repetidamente.
- 6ExplicaciónCompara celdas de memoria alimentadas
La SRAM almacena un bit en un circuito estable alimentado, normalmente con seis transistores. No necesita refresco y es rápida, pero ocupa una superficie considerable por bit. La DRAM almacena carga en un condensador; la pérdida de carga exige refresco. Sus celdas más densas la hacen adecuada para una memoria principal grande.
Ambas son volátiles. «Estática» describe cómo mantiene la SRAM su estado mientras recibe alimentación, no si sobrevive a una pérdida de alimentación.
- 7EjemploPrimero espera, después transfiere
La DRAM activa una fila en el búfer de fila de un banco y sirve desde él las columnas seleccionadas. Las ráfagas y el solapamiento entre bancos aumentan la tasa de entrega. No eliminan la demora inicial de acceso.
Con una latencia inicial de 60 ns, una línea de 64 bytes transferida a 16 bytes/ns necesita otros 4 ns. El servicio total es de unos 64 ns. La mayor parte de esa espera precede a la transferencia, aunque la interfaz mueva los bytes rápidamente.
- 8ExplicaciónElige almacenamiento que conserve su contenido
La memoria flash NAND conserva los datos sin alimentación. Lee y programa páginas, mientras que borra bloques más grandes antes de poder reutilizar el espacio programado. Esas operaciones tardan mucho más que un acceso a SRAM o DRAM.
El desgaste por programación y borrado limita la vida de un bloque. La nivelación del desgaste reparte las actualizaciones entre bloques para que los datos lógicos que cambian con frecuencia no desgasten antes de tiempo una posición física.
- 9DesafíoDistingue persistencia y refresco
Un dispositivo debe conservar registros después de cortar la alimentación. ¿Cumpliría ese requisito sustituir la DRAM por SRAM? Explícalo.
---reveal---
No. La SRAM evita el refresco, pero sigue perdiendo sus datos sin alimentación, igual que la DRAM. El almacenamiento no volátil, como la memoria flash, cumple el requisito de persistencia. Sus operaciones de página más lentas y sus requisitos de borrado explican por qué cumple una función distinta de la memoria caché integrada en el chip.
- 10ExplicaciónOrdena los niveles
Los registros son los más cercanos a la ejecución, seguidos de L1, L2, L3, DRAM y almacenamiento. Las cachés mueven bloques, normalmente de 64 bytes, mientras que la memoria virtual usa páginas, normalmente de 4 KiB.
L1 suele separar las cachés de instrucciones y datos para que el cauce de segmentación pueda acceder a ambas a la vez. Un fallo en un nivel continúa la búsqueda en el inferior; un fallo de L1 todavía puede ser un acierto de L2.
- 11EjemploCalcula el coste de un fallo ocasional
Usa una búsqueda simplificada de 1 ciclo, un 97 % de aciertos y una penalización adicional por fallo de 100 ciclos. Cada solicitud paga la búsqueda y el 3 % paga la penalización:
Aquí un fallo cuesta 101 ciclos. La cifra de 100 ciclos es tiempo adicional, por lo que atribuirla como tiempo completo del fallo omitiría la búsqueda en los fallos.
- 12DesafíoRelaciona el programa con su promedio
Dos programas usan la misma caché de 1 ciclo y una penalización adicional de 80 ciclos. Uno tiene un 2 % de fallos; el otro, un 20 %. Calcula sus tiempos medios y explica por qué un hardware idéntico da resultados diferentes.
---reveal---
Los promedios son y ciclos. Los distintos patrones de acceso producen tasas de fallos diferentes. La caché aprovecha la localidad que proporciona cada programa; su capacidad y tecnología por sí solas no determinan el resultado.
- 13RepasoExamina un acceso a tres escalas
Al examinar el comportamiento de la memoria, identifica el elemento que se reutiliza, el bloque que se transfiere con él y el nivel que lo atiende. La localidad explica la reutilización probable, la tecnología de memoria explica el coste y la capacidad, y los tiempos de aciertos y fallos convierten esas observaciones en una estimación del tiempo de acceso. Para un programa concreto, empieza por el flujo real de direcciones.
2Construye y sigue una búsqueda en caché
15 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónUna dirección debe responder a dos preguntas
- 2ExplicaciónQuita primero el desplazamiento de byte
- 3ExplicaciónCuenta las entradas antes que los bits de índice
- 4DesafíoComprueba una nueva división de campos
- 5EjemploTen en cuenta la etiqueta almacenada
- 6EjemploEmpieza con una caché vacía
- 7EjemploObserva cómo una entrada cambia de propietario
- 8EjemploCompleta la secuencia de reemplazo
- 9DesafíoSigue la traza sin confundir bytes y bloques
- 10ExplicaciónConvierte las entradas en conjuntos y vías
- 11EjemploRegistra el uso reciente en cada acceso
- 12DesafíoDistingue LRU de FIFO
- 13Idea claveConoce qué pueden aportar más vías
- 14DesafíoCompara diseños de igual capacidad
- 15RepasoMantén el estado durante la búsqueda
3Diagnostica un fallo y conserva los datos modificados
12 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónUn fallo tiene una causa y un proceso de atención
- 2ExplicaciónAtiende una lectura pendiente
- 3ExplicaciónClasifica mediante la comparación adecuada
- 4DesafíoDistingue la capacidad libre de los conflictos
- 5ConexiónElige qué coste mejorar
- 6ExplicaciónSigue un bloque de escritura diferida
- 7ExplicaciónPon en cola los almacenamientos de escritura directa
- 8ExplicaciónEstablece una regla aparte para los fallos de escritura
- 9DesafíoSigue un almacenamiento y una lectura posterior
- 10EjemploCuenta el tráfico en ambas direcciones
- 11DesafíoRelaciona la clasificación con el tráfico de escritura
- 12RepasoMantén separadas las decisiones
4Calcula el coste de una jerarquía
16 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónAsigna un denominador y una unidad
- 2EjemploCalcula el AMAT de un nivel
- 3ConsejoConvierte después de calcular
- 4DesafíoIncluye un tiempo completo de fallo indicado
- 5EjemploPondera las solicitudes que se producen
- 6EjemploPasa de accesos a instrucciones
- 7EjemploTermina con el tiempo de ejecución
- 8DesafíoAumenta la frecuencia del reloj del procesador
- 9ConexiónComprueba si las demoras se solapan
- 10EjemploDistingue las tasas locales y globales
- 11EjemploCalcula el coste de servicio inferior
- 12EjemploVuelve al flujo original
- 13DesafíoDiagnostica un error de denominador
- 14EjemploInserta un nivel condicional más
- 15DesafíoCombina el tráfico de caché con el CPI
- 16RepasoElige el nivel de contabilización correcto
5Traduce una dirección sin confundir las búsquedas
15 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónUna dirección, dos problemas de búsqueda
- 2EjemploEncuentra la parte que no cambia
- 3EjemploUsa la entrada de la tabla de páginas
- 4DesafíoTraduce un byte diferente
- 5ExplicaciónUna página válida sigue teniendo derechos de acceso
- 6ExplicaciónGestiona una página ausente
- 7EjemploEstima una tabla plana
- 8ExplicaciónReutiliza traducciones en el TLB
- 9Idea claveSigue resultados de acierto independientes
- 10DesafíoDecide si se necesita el almacenamiento
- 11EjemploCalcula la cobertura de traducción
- 12ExplicaciónInicia el indexado de caché durante la traducción
- 13DesafíoComprueba un diseño propuesto de L1
- 14ConexiónRetira las traducciones desactualizadas
- 15RepasoMantén separados el estado de traducción y el de datos
6Aprovecha cada línea que se trae
13 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónEmpieza por las direcciones del bucle interno
- 2EjemploUsa todos los valores de tipo double de una línea
- 3EjemploObserva juntas la capacidad y los conflictos
- 4ConsejoCambia el paso entre filas
- 5DesafíoElige una organización para el acceso
- 6ExplicaciónIntercambia bucles para obtener recorridos secuenciales
- 7ExplicaciónMantén tres bloques activos
- 8EjemploDeja espacio más allá de la estimación de capacidad
- 9DesafíoDetén los bloques de borde en el límite del arreglo
- 10Idea claveDistingue menos transferencias de menos operaciones aritméticas
- 11ExplicaciónBusca datos mientras continúa el trabajo útil
- 12DesafíoExplica un factor de aceleración menor del esperado
- 13RepasoPrueba un cambio concreto
Ejercicios de Jerarquía de memoria y cachés
Set 1: Comportamiento de la memoria y búsqueda en caché10 Preguntas de Práctica
Pregunta 1 de 10
Mostrar respuestaOcultar respuesta
Pregunta 2 de 10
Mostrar respuestaOcultar respuesta
Pregunta 3 de 10
Mostrar respuestaOcultar respuesta
Pregunta 4 de 10
Mostrar respuestaOcultar respuesta
Pregunta 5 de 10
0x2B6, ¿qué pareja indica el índice de entrada y el desplazamiento de byte?Mostrar respuestaOcultar respuesta
Pregunta 6 de 10
0x00, 0x07, 0x10, 0x04, en ese orden. ¿Cuál es la tasa de aciertos?Mostrar respuestaOcultar respuesta
Pregunta 7 de 10
Mostrar respuestaOcultar respuesta
Pregunta 8 de 10
Mostrar respuestaOcultar respuesta
Pregunta 9 de 10
Mostrar respuestaOcultar respuesta
Pregunta 10 de 10
0x24, 0x28, 0x64, 0x34, 0x2C, 0x68. ¿Qué tasa de aciertos y qué bloque final en el índice 2 resultan?Mostrar respuestaOcultar respuesta
Set 2: Ubicación, fallos y almacenamientos10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
0x80 va seguido de una lectura de 0x80, sin accesos intermedios. ¿Qué ocurre en esta caché?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
0x00, 0x04, 0x20 y 0x24, y después una lectura de 0x40. Contando solo las cargas y las escrituras diferidas de víctimas, ¿cuántos bytes se mueven entre esta caché y el nivel siguiente?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 3: Tiempo de acceso y velocidad del programa10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 4: Páginas, TLB e indexado de caché10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
0x12345 se asigna al número de página física 0x2A. ¿Cuál es la dirección física de byte?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
0x0000, 0x1000, 0x2000, 0x3000, 0x4000, en ese orden. Todas las páginas están presentes en memoria. ¿Qué ocurre después del calentamiento?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 5: Cambios de código y compromisos de la jerarquía10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
a[i][j]?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
¿Te atascas con una pregunta tuya? Ayuda con Tareas
Términos Clave
A
Acierto de caché
Ancho de banda
Arreglo de estructuras (array de estructuras)
Asignación en escritura
B
Banco de memoria
Bit de modificación (bit sucio)
Bit de validez
Búfer de escritura
Búfer de fila
Búfer de traducciones anticipadas (TLB)
C
Caché asociativa por conjuntos
Caché completamente asociativa
Caché con índice virtual y etiqueta física (VIPT)
Caché de correspondencia directa
Caché multinivel
Caché no bloqueante
Cobertura del TLB
Conjunto de trabajo
Contaminación de caché
CPI adicional por paradas de memoria
CPI base
D
Desplazamiento dentro de la página
Desplazamiento dentro del bloque
Direccionamiento por bytes
Duración del ciclo de reloj
E
Entrada de la tabla de páginas
Escritura diferida
Escritura directa
Estructura de arreglos
Etiqueta
F
Fallo de caché
Fallo de capacidad
Fallo de coherencia
Fallo de conflicto
Fallo de página
Fallo obligatorio
H
Hiperpaginación
Huella de memoria de los bloques
Í
Índice de caché
I
Identificador del espacio de direcciones (ASID)
Intercambio de bucles
Invalidación de traducciones
sfence.vma para coordinar el estado de la caché de traducciones con las actualizaciones de correspondencias.J
Jerarquía de memoria
L
Latencia
Ley de Amdahl
Línea de caché (bloque de caché)
Localidad
Localidad espacial
Localidad temporal
M
Marco de página
Memoria dinámica de acceso aleatorio (DRAM)
Memoria estática de acceso aleatorio (SRAM)
Memoria flash NAND
Memoria virtual
N
Nivelación del desgaste
Número de página física
Número de página virtual
O
Orden por filas
a[i][j], variar j en el bucle interno recorre elementos adyacentes de una fila.P
Paso de acceso
Penalización por fallo
Precarga
Procesamiento por bloques
Pseudo-LRU
R
Reanudación anticipada
Recorrido de la tabla de páginas
Reemplazo del bloque usado menos recientemente (LRU)
Reemplazo por orden de llegada (FIFO)
Refresco
Relleno
S
Sin asignación en escritura
T
Tasa de aciertos
Tasa de fallos
Tasa de fallos ponderada
Tasa global de fallos
Tasa local de fallos
Tiempo de acierto
Tiempo medio de acceso a memoria (AMAT)
Transferencia de la palabra crítica primero
Traza de accesos a caché
V
Vía
Sobre esta unidad
Crea tus propios Materiales de Estudio
Convierte tus notas, diapositivas y documentos en Guías de Estudio, Preguntas de Práctica, Flashcards y 6 herramientas más.