Jerarquía de memoria y cachés

Aprende por qué un sistema informático combina memorias pequeñas y rápidas con otras grandes y lentas, y cómo las cachés mantienen los datos que necesita un programa cerca del procesador. Compara SRAM, DRAM y memoria flash, localiza bloques en cachés de correspondencia directa y asociativas por conjuntos, clasifica los fallos y compara las políticas de escritura. Calcula tasas de aciertos, el tiempo medio de acceso a memoria y el coste de las paradas de memoria, descubre cómo la memoria virtual y el TLB traducen direcciones y escribe bucles y estructuras de datos que aprovechen bien la caché.

IntermedioUnidad 5 de 6 del curso Curso de Organización y arquitectura de computadores

Lo que aprenderás

  1. 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 programas
      Identifica 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 flash
      Describe 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ía
      Nombra 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.
  2. 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 desplazamiento
      Calcula 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 directa
      Sigue 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 asociativas
      Localiza 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.
  3. 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 causas
      Describe 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és
      Explica 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.
  4. 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 memoria
      Calcula 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ón
      Añ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 multinivel
      Explica 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.
  5. 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áginas
      Explica 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 TLB
      Explica 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.
  6. 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 localidad
      Ordena 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 precarga
      Reestructura 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.

Guía de estudio de Jerarquía de memoria y cachés

6 capítulos

1

Explica 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 64/4=16 enteros. El arreglo ocupa 1000×4=4000 bytes. Si su primer elemento está alineado con un bloque, el recorrido toca ⌈4000/64⌉=63 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íaCómo se almacena un bitRefresco y alimentaciónFunción principal
SRAMUn circuito estable, normalmente de seis transistoresSin refresco; pierde los datos sin alimentaciónCachés integradas en el chip
DRAMCarga en un condensador, al que se accede mediante un transistorRefresco periódico; pierde los datos sin alimentaciónMemoria principal
Memoria flash NANDUna celda no volátil cuyo estado se programa eléctricamenteConserva los datos sin alimentación; resistencia limitada a las escriturasAlmacenamiento

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 4800×106×8=38,4×109 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 64/16=4 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:

1+0,03×100=4 ciclos.

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.
2

Localiza 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 2b bytes, los b 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 E entradas, el índice de entrada es

ıˊndice=direccioˊn de bloque mod E.

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 A bits:

b=log⁡2(bytes por bloque),s=log⁡2E,t=A−s−b.

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 16384/64=256 entradas. El desplazamiento ocupa 6 bits, el índice 8 bits y la etiqueta 32−8−6=18 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

256×531=135 936 bits.

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 byteBloqueÍndiceEtiquetaResultadoBloque que queda en la entrada seleccionada
0x00000Fallo0
0x04000Acierto0
0x40401Fallo4
0x00000Fallo0
0x14110Fallo1
0x44401Fallo4
0x08000Fallo0
0x84802Fallo8

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 1/8=12,5%. 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 C, un tamaño de bloque B y una asociatividad n:

bloques=C/B,conjuntos=C/(Bn).

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ónUbicación permitidaÍndice
Correspondencia directaUna entradaSelecciona esa entrada
n víasCualquiera de las n vías de un conjuntoSelecciona ese conjunto
Completamente asociativaCualquier 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.
3

Explica 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 falloPor qué falta el bloquePrueba de diagnóstico
ObligatorioEs su primer accesoFallaría incluso con capacidad ilimitada
De capacidadLos bloques activos superan el espacio disponibleUna caché LRU completamente asociativa del mismo tamaño también falla
De conflictoLas restricciones de ubicación lo expulsaronUna 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íticaAcción ante un acierto de escrituraEfecto en el nivel siguiente
Escritura directaActualiza la caché y envía el almacenamiento al nivel inferiorCada almacenamiento genera una actualización en el nivel inferior
Escritura diferidaActualiza la caché y marca su bloque como modificadoUn 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 1+0,1×100=11. 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.
4

Calcula 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
tasa de aciertos=aciertosaccesos,tasa de fallos=fallosaccesos.

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

AMAT=tiempo de acierto+tasa de fallos×penalizacioˊn por fallo.

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 1+0,05×100=6 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:

A=1+0,05×50=3,5 ns, B=1,2+0,035×50=2,95 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 100×0,02+30×0,04=3,2 de 130 accesos.

La fracción combinada de fallos es, por tanto, 0,02+0,3×0,041,3. 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 mI, accesos a datos por instrucción fD, una tasa de fallos de datos mD y una penalización P en ciclos:

CPI por paradas=mIP+fDmDP, tiempo de CPU=nuˊmero de instrucciones ejecutadas×(CPI base+CPI por paradas)×duracioˊn del ciclo.

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 0,02×100=2,0 ciclos por instrucción. Las paradas por datos son 0,3×0,04×100=1,2. 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

1+0,02×200+0,3×0,04×200=7,4.

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 4,2/3,7≈1,14, 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 3,2/3,7≈86% 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 0,04×0,25=0,01, 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:

AMAT=H1+m1(H2+m2P).

Aquí H1 y H2 son tiempos de búsqueda, m1 y m2 son fracciones locales de fallos y P 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 12+0,25×200=62 ciclos adicionales. Así,

AMAT=1+0,04×62=3,48 ciclos.

Sin L2, el AMAT sería 1+0,04×200=9 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 m2 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:

AMAT=H1+m1H2+(m1m2)P.
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 40+0,4×200=120 ciclos. El término de L2 pasa a ser 12+0,25×120=42 ciclos. El AMAT global es 1+0,04×42=2,68 ciclos.

La expresión completa es H1+m1(H2+m2(H3+m3P)). 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 1+0,032×100=4,2. Añade una L2 de 10 ciclos cuya tasa local de fallos es del 25 %:

CPI=1+0,032×10+0,032×0,25×100=2,12.

Con el mismo reloj, el factor de aceleración es 4,2/2,12≈1,98. 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.
5

Explica 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 232−12=220 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 0,01×30=0,3 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

capacidad de cacheˊvıˊas≤taman˜o de paˊgina.

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.
6

Escribe 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 1/8+1=1,125 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 1/8+1/8=0,25 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 b contiene b2 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 3b2×8=24b2 bytes. En una caché de 32 KiB, el límite de capacidad es

24b2≤32768,b≤32768/24≈36,9.

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 1,125N3 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 N3/(4b), suponiendo que los tres bloques de trabajo permanecen en caché e ignorando los conflictos.

Para N=1024 y b=32, estas estimaciones son de aproximadamente 1,2 mil millones y 8,4 millones de fallos, un factor de 144. Ambas versiones siguen realizando aproximadamente 2N3 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

6 Lecciones Interactivas

1

De un recorrido de arreglo a una jerarquía de memoria

13 pasos
Relaciona la localidad de los programas con las tecnologías de memoria y los costes de aciertos y fallos.
  1. 1
    Introducció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.

  2. 2
    Explicació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.

  3. 3
    Ejemplo¿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 64/4=16 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 ⌈4000/64⌉=63 líneas.

  4. 4
    Desafí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 320/16=20 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.

  5. 5
    Idea 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.

  6. 6
    Explicació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.

  7. 7
    EjemploPrimero 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.

  8. 8
    Explicació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.

  9. 9
    Desafí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.

  10. 10
    Explicació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.

  11. 11
    EjemploCalcula 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:

    1+0,03×100=4 ciclos.

    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.

  12. 12
    Desafí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 1+0,02×80=2,6 y 1+0,20×80=17 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.

  13. 13
    RepasoExamina 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.

2

Construye y sigue una búsqueda en caché

15 pasos
Divide direcciones, sigue el estado de reemplazo y compara la correspondencia directa con varias vías.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónUna dirección debe responder a dos preguntas
  2. 2
    ExplicaciónQuita primero el desplazamiento de byte
  3. 3
    ExplicaciónCuenta las entradas antes que los bits de índice
  4. 4
    DesafíoComprueba una nueva división de campos
  5. 5
    EjemploTen en cuenta la etiqueta almacenada
  6. 6
    EjemploEmpieza con una caché vacía
  7. 7
    EjemploObserva cómo una entrada cambia de propietario
  8. 8
    EjemploCompleta la secuencia de reemplazo
  9. 9
    DesafíoSigue la traza sin confundir bytes y bloques
  10. 10
    ExplicaciónConvierte las entradas en conjuntos y vías
  11. 11
    EjemploRegistra el uso reciente en cada acceso
  12. 12
    DesafíoDistingue LRU de FIFO
  13. 13
    Idea claveConoce qué pueden aportar más vías
  14. 14
    DesafíoCompara diseños de igual capacidad
  15. 15
    RepasoMantén el estado durante la búsqueda
3

Diagnostica un fallo y conserva los datos modificados

12 pasos
Clasifica los fallos, sigue las víctimas modificadas y distingue las políticas ante aciertos de escritura de las políticas ante fallos de escritura.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónUn fallo tiene una causa y un proceso de atención
  2. 2
    ExplicaciónAtiende una lectura pendiente
  3. 3
    ExplicaciónClasifica mediante la comparación adecuada
  4. 4
    DesafíoDistingue la capacidad libre de los conflictos
  5. 5
    ConexiónElige qué coste mejorar
  6. 6
    ExplicaciónSigue un bloque de escritura diferida
  7. 7
    ExplicaciónPon en cola los almacenamientos de escritura directa
  8. 8
    ExplicaciónEstablece una regla aparte para los fallos de escritura
  9. 9
    DesafíoSigue un almacenamiento y una lectura posterior
  10. 10
    EjemploCuenta el tráfico en ambas direcciones
  11. 11
    DesafíoRelaciona la clasificación con el tráfico de escritura
  12. 12
    RepasoMantén separadas las decisiones
4

Calcula el coste de una jerarquía

16 pasos
Trabaja desde una caché hasta el tráfico ponderado, el CPI, los cambios de reloj y varios niveles de caché.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónAsigna un denominador y una unidad
  2. 2
    EjemploCalcula el AMAT de un nivel
  3. 3
    ConsejoConvierte después de calcular
  4. 4
    DesafíoIncluye un tiempo completo de fallo indicado
  5. 5
    EjemploPondera las solicitudes que se producen
  6. 6
    EjemploPasa de accesos a instrucciones
  7. 7
    EjemploTermina con el tiempo de ejecución
  8. 8
    DesafíoAumenta la frecuencia del reloj del procesador
  9. 9
    ConexiónComprueba si las demoras se solapan
  10. 10
    EjemploDistingue las tasas locales y globales
  11. 11
    EjemploCalcula el coste de servicio inferior
  12. 12
    EjemploVuelve al flujo original
  13. 13
    DesafíoDiagnostica un error de denominador
  14. 14
    EjemploInserta un nivel condicional más
  15. 15
    DesafíoCombina el tráfico de caché con el CPI
  16. 16
    RepasoElige el nivel de contabilización correcto
5

Traduce una dirección sin confundir las búsquedas

15 pasos
Sigue los desplazamientos dentro de las páginas, los permisos, los recorridos tras fallos de TLB y la restricción de indexado de una caché VIPT.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónUna dirección, dos problemas de búsqueda
  2. 2
    EjemploEncuentra la parte que no cambia
  3. 3
    EjemploUsa la entrada de la tabla de páginas
  4. 4
    DesafíoTraduce un byte diferente
  5. 5
    ExplicaciónUna página válida sigue teniendo derechos de acceso
  6. 6
    ExplicaciónGestiona una página ausente
  7. 7
    EjemploEstima una tabla plana
  8. 8
    ExplicaciónReutiliza traducciones en el TLB
  9. 9
    Idea claveSigue resultados de acierto independientes
  10. 10
    DesafíoDecide si se necesita el almacenamiento
  11. 11
    EjemploCalcula la cobertura de traducción
  12. 12
    ExplicaciónInicia el indexado de caché durante la traducción
  13. 13
    DesafíoComprueba un diseño propuesto de L1
  14. 14
    ConexiónRetira las traducciones desactualizadas
  15. 15
    RepasoMantén separados el estado de traducción y el de datos
6

Aprovecha cada línea que se trae

13 pasos
Analiza los pasos de acceso, elige una organización de datos, dimensiona bloques reutilizables y decide qué puede ocultar la precarga.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónEmpieza por las direcciones del bucle interno
  2. 2
    EjemploUsa todos los valores de tipo double de una línea
  3. 3
    EjemploObserva juntas la capacidad y los conflictos
  4. 4
    ConsejoCambia el paso entre filas
  5. 5
    DesafíoElige una organización para el acceso
  6. 6
    ExplicaciónIntercambia bucles para obtener recorridos secuenciales
  7. 7
    ExplicaciónMantén tres bloques activos
  8. 8
    EjemploDeja espacio más allá de la estimación de capacidad
  9. 9
    DesafíoDetén los bloques de borde en el límite del arreglo
  10. 10
    Idea claveDistingue menos transferencias de menos operaciones aritméticas
  11. 11
    ExplicaciónBusca datos mientras continúa el trabajo útil
  12. 12
    DesafíoExplica un factor de aceleración menor del esperado
  13. 13
    RepasoPrueba un cambio concreto

Ejercicios de Jerarquía de memoria y cachés

50 Preguntas de Práctica en 5 sets

Set 1: Comportamiento de la memoria y búsqueda en caché10 Preguntas de Práctica

Pregunta 1 de 10

Un programa lee cada elemento de un arreglo contiguo una vez, en orden de dirección. ¿Qué tipo de localidad explica por qué ayuda traer una línea completa?
  1. Localidad temporal en cada elemento
  2. Localidad espacial entre elementos
  3. Localidad temporal entre páginas
  4. Localidad espacial en valores repetidos
Mostrar respuestaOcultar respuesta
Respuesta: B
Los elementos adyacentes ocupan direcciones cercanas, por lo que una línea traída proporciona varias lecturas próximas. La localidad temporal requiere reutilizar un elemento; leer cada elemento una vez no da reutilización temporal de esos elementos, aunque otras partes del programa puedan reutilizarse.

Pregunta 2 de 10

¿Qué propiedad hace que la DRAM necesite refresco mientras que la SRAM no?
  1. La DRAM envía datos en ambos flancos del reloj.
  2. La DRAM conserva los datos sin alimentación.
  3. La DRAM almacena cada bit en un biestable.
  4. La DRAM almacena carga que se pierde gradualmente.
Mostrar respuestaOcultar respuesta
Respuesta: D
Una celda de DRAM almacena carga en un condensador, y la pérdida de carga exige restaurarla periódicamente. Transferir en ambos flancos del reloj mejora el ancho de banda de la interfaz, pero no es el motivo del refresco. La SRAM mantiene su estado en un circuito alimentado sin refresco periódico.

Pregunta 3 de 10

Una solicitud falla en L1 y acierta en L2. ¿Qué afirmación describe este acceso?
  1. L2 proporciona un bloque ausente de L1.
  2. La DRAM proporciona un bloque ausente de L2.
  3. La instrucción genera un fallo de página.
  4. El TLB debe volver a cargar una traducción.
Mostrar respuestaOcultar respuesta
Respuesta: A
El acierto y el fallo describen los niveles concretos comprobados: L1 no tenía el bloque, mientras que L2 sí. Un fallo de L1 no requiere DRAM cuando una caché inferior puede atenderlo. Los resultados de caché no establecen si hubo un fallo de traducción o un fallo de página.

Pregunta 4 de 10

Una caché de correspondencia directa tiene 8 KiB de datos, bloques de 32 bytes y direcciones de byte de 30 bits. ¿Cuáles son las anchuras de etiqueta, índice y desplazamiento?
  1. 17, 8, 5 bits
  2. 12, 13, 5 bits
  3. 18, 7, 5 bits
  4. 17, 5, 8 bits
Mostrar respuestaOcultar respuesta
Respuesta: A
La caché tiene 8192/32=256 entradas, que requieren 8 bits de índice. Un bloque de 32 bytes necesita 5 bits de desplazamiento, lo que deja 30−8−5=17 bits de etiqueta. Usar 13 bits de índice supondría tomar el logaritmo de la capacidad en bytes y contar dos veces el desplazamiento dentro del bloque.

Pregunta 5 de 10

Una caché de correspondencia directa tiene ocho entradas de 16 bytes. Para la dirección de byte 0x2B6, ¿qué pareja indica el índice de entrada y el desplazamiento de byte?
  1. Índice 6, desplazamiento 3
  2. Índice 2, desplazamiento 6
  3. Índice 3, desplazamiento 6
  4. Índice 3, desplazamiento 11
Mostrar respuestaOcultar respuesta
Respuesta: C
Dividir 0x2B6 entre 16 da el bloque 0x2B, o 43, con resto 6. El bloque 43 módulo 8 selecciona el índice 3. Tomar los tres bits menos significativos de la dirección de byte sin desplazar daría el índice 6, porque esos bits pertenecen al desplazamiento de byte en vez de al índice de bloque.

Pregunta 6 de 10

Una caché vacía de correspondencia directa tiene dos entradas de 8 bytes. Las lecturas acceden a las direcciones de byte 0x00, 0x07, 0x10, 0x04, en ese orden. ¿Cuál es la tasa de aciertos?
  1. 0%
  2. 25%
  3. 50%
  4. 75%
Mostrar respuestaOcultar respuesta
Respuesta: B
El primer acceso carga el bloque 0 y 0x07 acierta en ese bloque. La dirección 0x10 carga el bloque 2 en la misma entrada y expulsa el bloque 0, por lo que 0x04 falla después. Solo acierta uno de cuatro accesos; contar el último acceso como un acierto pasa por alto el reemplazo intermedio.

Pregunta 7 de 10

Un arreglo alineado contiene 192 valores de ocho bytes. Una caché inicialmente vacía usa líneas de 64 bytes, tiene espacio para todo el arreglo y no realiza precarga. Sin otros accesos, ¿cuántos fallos ocurren en un recorrido secuencial?
  1. 12
  2. 64
  3. 192
  4. 24
Mostrar respuestaOcultar respuesta
Respuesta: D
Cada línea contiene 64/8=8 valores, por lo que el recorrido toca 192/8=24 líneas. La primera lectura de cada línea falla y sus siete valores siguientes aciertan. Contar 192 fallos trataría la carga de una línea como si proporcionara solo el elemento solicitado.

Pregunta 8 de 10

Una solicitud de memoria tiene 45 ns de latencia inicial, seguidos de una transferencia de 128 bytes a 32 GB/s. ¿Cuál es su tiempo total de servicio en este modelo?
  1. 49 ns
  2. 45 ns
  3. 77 ns
  4. 41 ns
Mostrar respuestaOcultar respuesta
Respuesta: A
A 32 GB/s, la interfaz transfiere 32 bytes por nanosegundo, por lo que 128 bytes tardan 4 ns. Al sumar los 45 ns iniciales se obtienen 49 ns. Usar 77 ns confunde la cifra de ancho de banda con una demora en vez de dividir el tamaño del bloque entre la tasa de transferencia.

Pregunta 9 de 10

Una caché de correspondencia directa y escritura diferida de 4 KiB tiene líneas de 32 bytes y direcciones de byte de 24 bits. Cuenta los datos, las etiquetas, un bit de validez y un bit de modificación por línea, sin otros metadatos. ¿Cuántos bits se almacenan?
  1. 34 304 bits
  2. 34 944 bits
  3. 34 560 bits
  4. 33 024 bits
Mostrar respuestaOcultar respuesta
Respuesta: C
Hay 128 líneas, por lo que las anchuras del índice y del desplazamiento son de 7 y 5 bits, lo que deja una etiqueta de 12 bits. Cada línea almacena 256 + 12 + 1 + 1 = 270 bits, lo que da 34 560 bits. La opción de 34 304 bits omite ambos bits de control de cada línea, a pesar de que se incluyen explícitamente en el recuento de almacenamiento.

Pregunta 10 de 10

Una caché vacía de correspondencia directa tiene cuatro entradas de 16 bytes. Las lecturas acceden a 0x24, 0x28, 0x64, 0x34, 0x2C, 0x68. ¿Qué tasa de aciertos y qué bloque final en el índice 2 resultan?
  1. 50 %; bloque 2
  2. 25 %; bloque 6
  3. 16,7 %; bloque 2
  4. 16,7 %; bloque 6
Mostrar respuestaOcultar respuesta
Respuesta: D
La secuencia de bloques es 2, 2, 6, 3, 2, 6. Solo el segundo acceso acierta; los bloques 2 y 6 se reemplazan entre sí en el índice 2, que termina conteniendo el bloque 6. La opción del 50 % mantiene incorrectamente presentes ambos bloques en conflicto, como si la caché tuviera más opciones de ubicación.
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

Un programa accede a un bloque por primera vez y el acceso por demanda falla. ¿Cómo se clasifica ese fallo en el modelo de las tres C?
  1. De conflicto
  2. De capacidad
  3. Obligatorio
  4. De coherencia
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Una caché de escritura diferida expulsa un bloque válido cuyo bit de modificación está desactivado. ¿Qué debe ocurrir con esa víctima?
  1. Debe escribirse en el nivel inferior antes del reemplazo.
  2. Puede descartarse sin escribirla en el nivel inferior.
  3. Su reemplazo debe usar escritura directa.
  4. Su bit de modificación debe activarse antes de expulsarla.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

Una caché de 12 KiB tiene líneas de 64 bytes y tres vías por conjunto. ¿Cuántos conjuntos tiene?
  1. 32
  2. 192
  3. 64
  4. 256
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

Un conjunto lleno de 2 vías usa LRU y contiene inicialmente P y Q, con P como el menos reciente. Los accesos son Q, P, R, Q, donde R está ausente. ¿Qué bloques se expulsan en los dos fallos?
  1. Q y después P
  2. P y después R
  3. P y después Q
  4. Q y después R
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Una caché sin asignación en escritura comienza vacía. Un almacenamiento en la dirección 0x80 va seguido de una lectura de 0x80, sin accesos intermedios. ¿Qué ocurre en esta caché?
  1. El almacenamiento falla; la lectura acierta.
  2. El almacenamiento acierta; la lectura acierta.
  3. El almacenamiento acierta; la lectura falla.
  4. El almacenamiento falla; la lectura falla.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Un acceso por demanda repetido falla en una caché de correspondencia directa, pero acierta en una caché LRU completamente asociativa del mismo tamaño que recibe el mismo historial. Según la prueba de las tres C, ¿qué causó el fallo?
  1. Un primer acceso al bloque
  2. Una restricción en la ubicación del bloque
  3. Una capacidad completamente asociativa insuficiente
  4. Un desbordamiento del búfer de escritura del nivel inferior
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

Una caché de escritura directa tiene un búfer de escritura finito. Los almacenamientos llegan más rápido de lo que el nivel inferior puede aceptarlos durante un intervalo sostenido. ¿Qué ocurre finalmente?
  1. La caché cambia a escritura diferida.
  2. El nivel inferior descarta las escrituras en cola.
  3. El procesador se detiene cuando se llena el búfer.
  4. El búfer elimina el límite de ancho de banda.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Una caché LRU completamente asociativa vacía de dos líneas recibe las lecturas de bloques 1, 2, 3, 1, 2. ¿Cuántos fallos obligatorios, de capacidad y de conflicto ocurren?
  1. 2 obligatorios, 3 de capacidad, 0 de conflicto
  2. 3 obligatorios, 0 de capacidad, 2 de conflicto
  3. 3 obligatorios, 1 de capacidad, 1 de conflicto
  4. 3 obligatorios, 2 de capacidad, 0 de conflicto
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Una caché vacía de una línea, con escritura diferida y asignación en escritura, tiene líneas de 32 bytes. Recibe almacenamientos en 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?
  1. 160 bytes
  2. 96 bytes
  3. 128 bytes
  4. 192 bytes
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Una caché vacía de 2 vías tiene dos conjuntos y reemplazo LRU. Las lecturas de bloques repiten 0, 2, 4 indefinidamente. ¿Cuál es la tasa de aciertos después del calentamiento y qué haría una caché completamente asociativa de cuatro líneas?
  1. Dos tercios; también fallaría un tercio.
  2. Cero; acertaría después de sus tres primeros fallos.
  3. Un tercio; acertaría después de cuatro fallos.
  4. Cero; también fallaría en cada acceso.
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

Una caché atiende 184 aciertos en 200 accesos. ¿Cuál es su tasa de fallos?
  1. 8%
  2. 16%
  3. 92%
  4. 0,08 %
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Un informe indica los fallos de L2 divididos entre todas las solicitudes que llegaron a L2. ¿Qué tasa se indica?
  1. Tasa global de fallos de L2
  2. Tasa global de fallos de L1
  3. Tasa local de fallos de L2
  4. Tasa local de acceso a memoria
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

Una caché tiene una búsqueda de 2 ciclos, un 6 % de fallos y una penalización adicional de 75 ciclos por fallo. A 2,5 GHz, ¿cuál es su AMAT?
  1. 6,5 ns
  2. 1,8 ns
  3. 3,0 ns
  4. 2,6 ns
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

El CPI base es 1,2, los fallos de instrucciones son del 1 %, el 40 % de las instrucciones realiza un acceso a datos, los fallos de datos son del 5 % y todos los fallos añaden 80 ciclos sin solapamiento. ¿Cuál es el CPI total?
  1. 6,0
  2. 3,6
  3. 2,8
  4. 2,4
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

L1 falla en el 8 % de las solicitudes. L2 tiene una tasa local de fallos del 15 %. ¿Qué fracción de las solicitudes originales falla en ambas cachés?
  1. 1,2 %
  2. 15%
  3. 23%
  4. 0,12 %
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Una búsqueda en caché tarda 1 ns. Su tasa de fallos es del 10 % y un acceso completo con fallo tarda 41 ns, incluida esa búsqueda. ¿Cuál es el AMAT?
  1. 5,1 ns
  2. 4,1 ns
  3. 5,0 ns
  4. 4,0 ns
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

Cada instrucción realiza una búsqueda y un promedio de 0,5 accesos a datos. Las tasas de fallos de instrucciones y datos son del 1 % y el 7 %. Ambas cachés tienen una búsqueda de 2 ciclos y una penalización adicional por fallo de 60 ciclos. ¿Cuál es el AMAT por acceso a memoria?
  1. 4,7 ciclos
  2. 3,8 ciclos
  3. 4,4 ciclos
  4. 2,7 ciclos
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

La búsqueda en L1 es de 2 ciclos y falla el 5 %. La búsqueda en L2 es de 8 ciclos y falla localmente el 20 %. La búsqueda en L3 es de 30 ciclos y falla localmente el 10 %. La memoria añade 150 ciclos después de un fallo de L3. ¿Cuál es el AMAT?
  1. 2,45 ciclos
  2. 4,35 ciclos
  3. 3,95 ciclos
  4. 2,85 ciclos
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Un programa tiene un CPI base de 1,5 y 2,5 ciclos de parada de memoria sin solapamiento por instrucción a 2 GHz. El reloj aumenta a 4 GHz; el número de instrucciones ejecutadas, el CPI base, los números de fallos y las demoras de memoria en nanosegundos permanecen constantes. ¿Cuál es el factor de aceleración?
  1. Aproximadamente 1,23 veces
  2. Aproximadamente 2,00 veces
  3. Aproximadamente 0,62 veces
  4. Aproximadamente 1,60 veces
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

La caché A tiene una búsqueda de 0,8 ns y un 6 % de fallos. La caché B tiene una búsqueda de 1,1 ns y un 4 % de fallos. Ambas usan la misma penalización adicional por fallo. ¿Con qué penalización se igualan sus AMAT?
  1. 5 ns
  2. 10 ns
  3. 15 ns
  4. 30 ns
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

¿Qué parte de una dirección pasa sin cambios por la traducción ordinaria de páginas?
  1. El número de página virtual
  2. El número de página física
  3. La base de la tabla de páginas
  4. El desplazamiento de byte dentro de la página
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Un acceso falla en el TLB y un recorrido de la tabla de páginas encuentra una correspondencia válida que permite el acceso. ¿Cuál es el siguiente paso normal?
  1. Leer la página del almacenamiento.
  2. Instalar la traducción y continuar.
  3. Terminar el proceso por una dirección incorrecta.
  4. Invalidar la línea de la caché de datos.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

Con páginas de 8 KiB, la dirección virtual 0x12345 se asigna al número de página física 0x2A. ¿Cuál es la dirección física de byte?
  1. 0x54345
  2. 0x2A345
  3. 0x54045
  4. 0x16345
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

Un TLB completamente asociativo contiene 96 traducciones, todas para páginas de 16 KiB. ¿Cuál es su cobertura?
  1. 96 KiB
  2. 1536 MiB
  3. 1,5 MiB
  4. 6 MiB
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Un proceso almacena en una página presente en memoria. El TLB acierta, pero su correspondencia actual concede solo acceso de lectura. ¿Qué ocurre?
  1. El almacenamiento tiene éxito porque la traducción acertó.
  2. El TLB debe fallar antes de que pueda ocurrir un fallo.
  3. La página debe volver a cargarse del almacenamiento.
  4. El procesador genera un fallo de página por permisos.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Una caché VIPT sencilla usa líneas de 64 bytes y páginas de 4 KiB. Su capacidad de datos es de 64 KiB. ¿Cuál es la menor asociatividad que es potencia de dos y mantiene todos los bits de índice de conjunto y desplazamiento dentro del bloque en el desplazamiento dentro de la página?
  1. 8 vías
  2. 16 vías
  3. 32 vías
  4. 4 vías
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

Una tabla de páginas plana cubre un espacio virtual de 36 bits direccionado por bytes con páginas de 16 KiB y entradas de 8 bytes. ¿Cuánta memoria requiere una tabla completa?
  1. 4 MiB
  2. 16 MiB
  3. 32 MiB
  4. 64 MiB
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Un TLB LRU completamente asociativo vacío de cuatro entradas usa páginas de 4 KiB. Un bucle lee repetidamente un valor de 8 bytes en cada dirección 0x0000, 0x1000, 0x2000, 0x3000, 0x4000, en ese orden. Todas las páginas están presentes en memoria. ¿Qué ocurre después del calentamiento?
  1. Cada búsqueda de traducción falla; no se necesitan fallos de página.
  2. Solo falla la primera búsqueda de cada bucle; no se necesitan fallos de página.
  3. Cada búsqueda de traducción falla; cada una requiere una lectura del almacenamiento.
  4. Todas las búsquedas de traducción aciertan; solo se accede a 40 bytes.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Un acceso permitido tiene un acierto de caché de datos de 2 ciclos. Una búsqueda de TLB cuesta siempre 1 ciclo antes de la búsqueda en caché. Los fallos de TLB ocurren en el 2 % de los accesos y añaden un recorrido de 40 ciclos; los fallos de caché de datos ocurren en el 5 % y añaden 80 ciclos. Ningún coste se solapa y no hay fallos de página. ¿Cuál es el tiempo medio de acceso?
  1. 6,8 ciclos
  2. 4,8 ciclos
  3. 7,6 ciclos
  4. 7,8 ciclos
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Los procesos P y Q asignan páginas virtuales diferentes al marco físico 7. P puede escribir; Q solo puede leer. P cambia un byte y el sistema coordina correctamente la visibilidad. ¿Qué sucede cuando Q lee o almacena después en ese byte asignado?
  1. Q lee su propia copia separada y puede almacenar.
  2. Q puede leer el cambio, pero un almacenamiento falla.
  3. Q falla en ambas operaciones porque P escribió.
  4. Q lee el cambio y hereda el permiso de escritura de P.
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

¿Qué recorrido visita elementos adyacentes de un arreglo rectangular normal de C a[i][j]?
  1. Aumentar i mientras j permanece fijo.
  2. Disminuir i mientras j permanece fijo.
  3. Aumentar j mientras i permanece fijo.
  4. Aumentar i y j a la vez.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Un arreglo alineado tiene 600 registros de 48 bytes cada uno. Un bucle lee solo un campo de 8 bytes por registro. ¿Qué organización minimiza los datos transferidos para ese campo en un recorrido con la caché inicialmente vacía, líneas de 64 bytes y sin precarga?
  1. Un arreglo contiguo separado para el campo.
  2. Los mismos registros en su orden original.
  3. Los mismos registros recorridos en orden inverso.
  4. Los mismos registros con 16 bytes de relleno cada uno.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

Tres bloques cuadrados de valores de 8 bytes deben caber en una caché de 48 KiB. ¿Qué lado de bloque de los indicados cabe y deja al menos 8 KiB sin usar?
  1. 48
  2. 44
  3. 42
  4. 40
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

La precarga por software reduce los fallos de caché por demanda en un recorrido de una sola vez, pero el tiempo de ejecución no cambia. La interfaz de memoria ya transfería datos a su límite sostenido. ¿Qué explicación encaja?
  1. Solo los recorridos que reutilizan cada elemento pueden ocultar la latencia de transferencia.
  2. El recorrido sigue necesitando las mismas transferencias limitadas por el ancho de banda.
  3. La menor tasa de fallos por demanda demuestra que ahora se mueven menos bytes.
  4. Los datos precargados pueden superar el límite de ancho de banda de la interfaz.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Una caché tiene 32 conjuntos, líneas de 64 bytes y suficiente capacidad total para los datos activos. Un recorrido por columnas avanza entre filas de 256 valores de tipo double, y todos los comienzos de fila están alineados con una línea. ¿Qué relleno distribuye los comienzos de filas sucesivas entre todos los conjuntos?
  1. Añadir relleno hasta 264 valores de tipo double por fila.
  2. Añadir relleno hasta 272 valores de tipo double por fila.
  3. Añadir relleno hasta 288 valores de tipo double por fila.
  4. Añadir relleno hasta 320 valores de tipo double por fila.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

La dimensión de una matriz es 94 y el lado de los bloques es 24. Cada coordenada de bloque identifica una región, incluidos los bordes parciales. ¿Cuántas regiones de bloque hay y cuántos elementos contiene la región inferior derecha?
  1. 16 regiones; 576 elementos
  2. 9 regiones; 484 elementos
  3. 16 regiones; 484 elementos
  4. 9 regiones; 576 elementos
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

Un núcleo de cálculo matricial por bloques usa tres bloques cuadrados de valores de tipo double en una caché de 32 KiB. Una propuesta cambia el lado de bloque de 16 a 40 y predice 2,5 veces menos fallos mediante el modelo de bloques presentes en caché. ¿Qué evaluación está justificada?
  1. Tres bloques necesitan 12,5 KiB; la reducción prevista está justificada.
  2. Tres bloques necesitan 37,5 KiB; no se cumple la premisa de permanencia en caché.
  3. Tres bloques necesitan 37,5 KiB; los fallos deben reducirse 6,25 veces.
  4. Tres bloques necesitan 37,5 KiB; la aritmética sin cambios determina los fallos.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Un programa fijo tiene 0,04 fallos de L1 por instrucción, un CPI base de 1 y una penalización de memoria de 120 ciclos sin L2. Una L2 propuesta añade una búsqueda de 12 ciclos y falla localmente el 10 %, con todas las paradas en secuencia. ¿Cuál es el factor de aceleración con el mismo reloj?
  1. Aproximadamente 1,25 veces
  2. Aproximadamente 3,92 veces
  3. Aproximadamente 2,00 veces
  4. Aproximadamente 2,96 veces
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Una multiplicación de matrices en orden por filas cambia de i-j-k a i-k-j. En el modelo de recorrido secuencial, el primero tiene 1,125 fallos por iteración interna. En el nuevo orden, B se recorre secuencialmente con un fallo cada ocho iteraciones y la fila de C permanece en caché después del calentamiento. Si se ignora el resto del tráfico, ¿qué factor de reducción de fallos se obtiene en régimen estable?
  1. 4,5 veces
  2. 8 veces
  3. 9 veces
  4. 0,25 veces
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Una caché contiene 128 líneas de datos. Un bucle recorre repetidamente cinco bloques que se asignan todos a un conjunto. Compara un diseño LRU de 4 vías con uno LRU de 8 vías de igual tamaño de línea y capacidad de datos; los cinco bloques comparten un conjunto en ambos. ¿Qué cambia después del calentamiento?
  1. El de 4 vías falla cada vez; el de 8 vías acierta cada vez.
  2. Ambos aciertan cada vez porque cinco es menor que 128.
  3. El de 4 vías acierta una vez por ciclo; el de 8 vías acierta dos veces.
  4. Ambos fallan cada vez porque comparten el índice de conjunto.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

¿Te atascas con una pregunta tuya? Ayuda con Tareas

Términos Clave

80 Términos Clave, cada uno con su definición

A

Acierto de caché
Un acierto de caché ocurre cuando el nivel que se comprueba ya contiene el bloque solicitado en una entrada válida con una etiqueta coincidente.
Una solicitud puede fallar en L1 y, sin embargo, acertar en L2, por lo que su resultado debe indicarse por separado para cada nivel.
Ancho de banda
El ancho de banda es la cantidad de datos que un camino de memoria puede transferir por unidad de tiempo, expresada habitualmente en bytes por segundo.
Un camino de transferencia de 16 GB/s mueve 64 bytes en 4 ns una vez que comienza el flujo de datos después de su latencia inicial.
Arreglo de estructuras (array de estructuras)
Un arreglo de estructuras almacena registros de forma contigua con los campos de cada registro juntos, lo que favorece el acceso a varios campos de un registro.
Una actualización de partículas que usa juntas la posición y la velocidad puede aprovechar gran parte de la línea traída para una partícula.
Asignación en escritura
La asignación en escritura es una política ante fallos de escritura que trae el bloque ausente a la caché y después aplica el almacenamiento a ese bloque.
Una lectura posterior puede acertar en la línea instalada por un almacenamiento anterior con asignación en otro byte del mismo bloque.

B

Banco de memoria
Un banco de memoria es una matriz de filas y columnas de DRAM controlada por separado cuyas operaciones pueden solaparse con las de otros bancos.
Entrelazar solicitudes entre bancos puede aumentar el ancho de banda entregado mientras un banco espera una operación de fila.
Bit de modificación (bit sucio)
Un bit de modificación registra que un bloque en caché contiene modificaciones que aún no se han propagado al nivel siguiente de la jerarquía.
Una víctima válida y limpia puede descartarse, mientras que una víctima válida y modificada requiere conservar sus datos cambiados.
Bit de validez
Un bit de validez es un metadato de la entrada que registra si la etiqueta y los datos almacenados describen un bloque de caché utilizable.
Una entrada con bits de etiqueta coincidentes sigue fallando cuando su bit de validez está desactivado después del inicio o de una invalidación.
Búfer de escritura
Un búfer de escritura es una cola finita que contiene escrituras pendientes hacia el nivel inferior para que la ejecución pueda continuar antes de que terminen.
Una larga ráfaga de almacenamientos llena el búfer si el destino no puede completar las actualizaciones tan rápido como llegan.
Búfer de fila
Un búfer de fila es un circuito que mantiene una fila de DRAM activada para que los accesos puedan seleccionar columnas sin volver a abrir esa fila.
Las solicitudes repetidas a una fila ya abierta evitan la precarga y la activación necesarias para cambiar de fila en ese banco.
Búfer de traducciones anticipadas (TLB)
Un búfer de traducciones anticipadas, o TLB, almacena en caché traducciones recientes de páginas virtuales y sus permisos asociados para evitar recorridos repetidos de la tabla.
Un acierto de TLB todavía puede acompañar a un fallo de caché de datos porque la presencia de la correspondencia es distinta de la presencia de la línea de datos.

C

Caché asociativa por conjuntos
Una caché asociativa por conjuntos asigna un bloque a un conjunto, pero permite que ocupe cualquiera de varias entradas de ese conjunto, llamadas vías.
Dos bloques que comparten un índice pueden coexistir en un conjunto de dos vías y evitar las expulsiones que exigiría la correspondencia directa.
Caché completamente asociativa
Una caché completamente asociativa tiene un conjunto que contiene todas las entradas y permite que cualquier bloque ocupe cualquier entrada sin un campo de índice.
Una caché LRU completamente asociativa de igual capacidad proporciona la referencia que se usa para distinguir los fallos de conflicto de los de capacidad.
Caché con índice virtual y etiqueta física (VIPT)
Una caché con índice virtual y etiqueta física inicia la búsqueda del conjunto con bits de la dirección virtual y comprueba la identidad mediante una etiqueta física traducida.
Una L1 de 32 KiB y ocho vías puede hacer caber sus bits de conjunto y de desplazamiento dentro de la línea en el desplazamiento de una página de 4 KiB.
Caché de correspondencia directa
Una caché de correspondencia directa permite que cada bloque de memoria ocupe exactamente una entrada, determinada por su dirección de bloque y el número de entradas.
Cuando dos bloques activos comparten una entrada, cargar cualquiera de ellos expulsa al otro aunque haya otras entradas vacías.
Caché multinivel
Una caché multinivel combina una caché superior pequeña y rápida con cachés inferiores más grandes que atienden muchos fallos del nivel superior antes de llegar a la memoria principal.
Una solicitud paga la búsqueda de L2 solo cuando falla en L1, por lo que el AMAT anidado pondera esa búsqueda por la fracción de fallos de L1.
Caché no bloqueante
Una caché no bloqueante permite que otros aciertos u otros fallos continúen mientras una o más solicitudes de bloques permanecen pendientes.
Un procesador con ejecución fuera de orden puede atender una carga independiente presente en caché mientras otra carga espera que se traigan datos de la DRAM.
Cobertura del TLB
La cobertura del TLB es el intervalo total de direcciones representado por las traducciones disponibles, calculado como el número de entradas multiplicado por el tamaño de página para páginas de igual tamaño.
Un TLB de 64 entradas cubre 256 KiB con páginas de 4 KiB, aunque un bucle solo acceda a unos pocos bytes de cada página.
Conjunto de trabajo
Un conjunto de trabajo es la colección de bloques o páginas que un programa usa activamente durante un intervalo de tiempo determinado.
Dos bloques del conjunto de trabajo pueden entrar en conflicto en una entrada aunque su tamaño total sea inferior a la capacidad de la caché.
Contaminación de caché
La contaminación de caché es el desplazamiento de bloques útiles presentes en caché por datos que aportan poco beneficio, como precargas incorrectas o prematuras.
Una precarga demasiado temprana puede ocupar una línea necesaria para el trabajo actual y ser expulsada ella misma antes de usarse.
CPI adicional por paradas de memoria
El CPI adicional por paradas de memoria son los ciclos adicionales por instrucción atribuidos a las esperas de memoria, con el solapamiento tratado según el modelo temporal.
Un número de 0,02 fallos por instrucción y una penalización de 100 ciclos sin solapamiento añaden dos ciclos al CPI total.
CPI base
El CPI base son los ciclos por instrucción ya necesarios antes de las paradas adicionales de memoria que se modelan, incluidos los aciertos normales de caché.
Un modelo de paradas añade las demoras por fallo al CPI base en vez de contar el tiempo de acierto de caché por segunda vez.

D

Desplazamiento dentro de la página
El desplazamiento dentro de la página es la posición de byte dentro de una página, que se conserva cuando su número de página virtual se traduce a un número de página física.
Dos direcciones de la misma página comparten una traducción, mientras que sus distintos desplazamientos seleccionan bytes diferentes.
Desplazamiento dentro del bloque
El desplazamiento dentro del bloque es la posición del byte dentro de una línea de caché, representada por los bits menos significativos de la dirección cuando el tamaño de línea es una potencia de dos.
Los seis bits menos significativos de una dirección de byte seleccionan una de las 64 posiciones de byte de una línea de caché de 64 bytes.
Direccionamiento por bytes
El direccionamiento por bytes asigna una dirección de memoria distinta a cada byte, por lo que los números de bloque se obtienen al quitar la información del desplazamiento de byte.
Las direcciones que solo difieren en los bits menos significativos del desplazamiento pueden seleccionar bytes distintos de la misma línea presente en caché.
Duración del ciclo de reloj
La duración del ciclo de reloj es el tiempo que dura un ciclo del procesador, igual al inverso de la frecuencia de reloj, y se usa para convertir el CPI en tiempo.
Duplicar la frecuencia de reloj reduce a la mitad la duración del ciclo, pero duplica los ciclos consumidos por una demora de DRAM que no cambia.

E

Entrada de la tabla de páginas
Una entrada de la tabla de páginas registra información de traducción como un número de página física, validez, permisos y estado de acceso o modificación.
Una página presente en memoria todavía puede rechazar un almacenamiento cuando su PTE permite lecturas, pero no concede acceso de escritura.
Escritura diferida
La escritura diferida es una política de caché que registra los almacenamientos en un bloque modificado en caché y envía ese bloque al nivel inferior cuando se expulsa.
Muchos almacenamientos en una línea presente pueden combinarse en una transferencia saliente de bloque cuando se reemplaza la línea.
Escritura directa
La escritura directa es una política de caché que envía cada almacenamiento al nivel siguiente, además de actualizar la caché si hay un acierto, a menudo mediante un búfer de escritura.
Un búfer de escritura puede mantener temporalmente la actualización del nivel inferior aunque el almacenamiento ya haya cambiado el valor en caché.
Estructura de arreglos
Una estructura de arreglos almacena cada campo de los registros en su propio arreglo contiguo, lo que favorece los recorridos de ese campo en muchos registros.
Sumar solo las posiciones horizontales puede traer un arreglo compacto de posiciones sin cargar los demás campos de cada partícula.
Etiqueta
Una etiqueta es la información de los bits más significativos de la dirección que se almacena con una entrada de caché para identificar qué bloque ocupa la entrada o el conjunto seleccionado.
Un mismo índice puede referirse a muchos bloques de memoria, por lo que una comparación de etiquetas distingue el que está actualmente en caché.

F

Fallo de caché
Un fallo de caché ocurre cuando el nivel de caché comprobado no tiene una copia utilizable del bloque solicitado y debe obtenerla de un nivel inferior.
Dos bloques alternos pueden fallar repetidamente cuando la correspondencia directa hace que cada uno reemplace al otro.
Fallo de capacidad
Un fallo de capacidad es un fallo posterior que también ocurre en una caché LRU completamente asociativa de igual capacidad que recibe el mismo historial de accesos.
Una caché completamente asociativa de dos líneas falla cuando un ciclo de tres bloques vuelve al bloque recién expulsado.
Fallo de coherencia
Un fallo de coherencia ocurre cuando un bloque está ausente porque una escritura de otro núcleo causó la invalidación de su copia en caché.
Un núcleo puede fallar al acceder a datos compartidos usados recientemente después de que otro núcleo modifique la línea de caché correspondiente.
Fallo de conflicto
Un fallo de conflicto es un fallo posterior que evita una caché LRU completamente asociativa de igual capacidad porque la ubicación flexible conserva el bloque.
Una entrada de correspondencia directa puede alternar entre dos etiquetas mientras una referencia asociativa del mismo tamaño conserva ambos bloques.
Fallo de página
Un fallo de página es una excepción causada cuando la traducción de páginas o las comprobaciones de permisos no pueden completarse normalmente para un acceso.
Un almacenamiento prohibido puede provocar un fallo en una página presente en memoria, mientras que algunas correspondencias ausentes se resuelven sin leer del almacenamiento.
Fallo obligatorio
Un fallo obligatorio es un fallo en el primer acceso a un bloque en el historial, que aumentar la capacidad de caché por sí solo no puede evitar.
El primer acceso por demanda a cada línea de un recorrido secuencial de un arreglo con la caché inicialmente vacía es obligatorio si no hay búsqueda anticipada.

H

Hiperpaginación
La hiperpaginación es la expulsión y recarga repetidas de bloques que se necesitan activamente, lo que produce muchos fallos porque no pueden permanecer juntos en caché.
Recorrer cíclicamente tres bloques en un conjunto LRU de dos vías puede expulsar cada bloque justo antes de su siguiente uso.
Huella de memoria de los bloques
La huella de memoria de los bloques es el almacenamiento ocupado por todos los bloques que deben coexistir para que un cálculo por bloques conserve la reutilización prevista.
Tres bloques de 32 por 32 valores de tipo double ocupan 24 KiB y dejan algo de espacio en una caché de 32 KiB para otros datos activos.

Í

Índice de caché
El índice de caché es el campo de dirección que selecciona la entrada o el conjunto donde puede residir un bloque de memoria.
En una caché de correspondencia directa de cuatro entradas, los bloques 0 y 4 seleccionan ambos el índice 0 pese a tener etiquetas diferentes.

I

Identificador del espacio de direcciones (ASID)
Un identificador del espacio de direcciones, o ASID, distingue las traducciones que pertenecen a distintos espacios de direcciones cuando sus entradas de TLB coexisten.
Dos procesos pueden reutilizar un número de página virtual sin usar la traducción del otro cuando las entradas llevan los ASID adecuados.
Intercambio de bucles
El intercambio de bucles cambia el orden de anidamiento de los bucles para modificar el recorrido y conservar el comportamiento requerido del cálculo.
Cambiar qué índice de matriz avanza más rápido puede convertir un recorrido por columnas en uno por filas sin reducir las operaciones aritméticas.
Invalidación de traducciones
La invalidación de traducciones impide que las correspondencias en caché sigan siendo utilizables después de cambios relevantes en las tablas de páginas o en las asignaciones de espacios de direcciones.
RISC-V usa sfence.vma para coordinar el estado de la caché de traducciones con las actualizaciones de correspondencias.

J

Jerarquía de memoria
Una jerarquía de memoria es un conjunto de niveles de almacenamiento que combina memorias pequeñas y rápidas con otras más grandes y lentas para aprovechar la localidad de los programas.
Un fallo de L1 puede ser atendido por L2 antes de que la solicitud incurra en la demora mucho mayor de un acceso a DRAM.

L

Latencia
La latencia es el tiempo transcurrido desde que se emite una solicitud de memoria hasta que están disponibles los primeros datos solicitados.
Una interfaz de memoria ancha puede entregar muchos bytes por segundo mientras una sola carga dependiente sigue esperando decenas de nanosegundos.
Ley de Amdahl
La ley de Amdahl limita el factor de aceleración total según la fracción del tiempo de ejecución afectada por una mejora y el tiempo que permanece sin cambios.
Reducir el coste de ejecución del núcleo hace que las esperas de memoria ocupen una mayor proporción del tiempo de ejecución cuando esas esperas permanecen constantes.
Línea de caché (bloque de caché)
Una línea de caché, también llamada bloque, es la unidad de datos de tamaño fijo que almacena y transfiere una caché.
Una línea de 64 bytes proporciona ocho valores adyacentes de tipo double aunque el acceso que causó su carga solicitara solo uno.
Localidad
La localidad es la tendencia de un programa a concentrar sus accesos en una parte relativamente pequeña de su espacio de direcciones durante un periodo breve.
Un bucle puede usar repetidamente una pequeña región activa aunque el programa haya asignado muchos gigabytes.
Localidad espacial
La localidad espacial es la tendencia a acceder a direcciones cercanas a una dirección a la que se ha accedido recientemente, lo que hace útiles los bytes vecinos.
Un recorrido secuencial de un arreglo puede usar los valores restantes de una línea de caché después de que el primer valor la traiga.
Localidad temporal
La localidad temporal es la tendencia a volver a acceder a la misma instrucción o al mismo dato poco después de un acceso anterior.
Las instrucciones dentro de un bucle corto se buscan repetidamente mientras el bucle procesa elementos sucesivos.

M

Marco de página
Un marco de página es un espacio del tamaño de una página en la memoria principal física que puede contener los datos asignados por una página virtual.
Dos procesos pueden compartir datos deliberadamente al asignar páginas virtuales seleccionadas al mismo marco físico.
Memoria dinámica de acceso aleatorio (DRAM)
La DRAM es una memoria volátil que almacena bits como carga en condensadores que requiere refresco periódico y proporciona una memoria principal densa y asequible.
Un programa grande puede mantener sus páginas activas en DRAM mientras cachés más pequeñas conservan las líneas a las que se accede con más frecuencia.
Memoria estática de acceso aleatorio (SRAM)
La SRAM es una memoria volátil que mantiene bits en circuitos estables alimentados sin refresco periódico y se usa habitualmente para cachés rápidas.
Una caché integrada en el chip usa SRAM para proporcionar baja latencia mientras mantiene una pequeña cantidad de datos de uso frecuente.
Memoria flash NAND
La memoria flash NAND es un almacenamiento no volátil que lee y programa páginas, borra bloques más grandes y tiene una resistencia limitada a los ciclos de programación y borrado.
Un controlador de SSD asigna los datos lógicos actualizados a espacio disponible de memoria flash en vez de tratarla como DRAM que puede escribirse byte a byte.
Memoria virtual
La memoria virtual asigna direcciones de procesos a la memoria física y permite protección, compartición controlada y páginas respaldadas por almacenamiento.
Un proceso sigue usando memoria virtual cuando todas sus páginas activas caben en la DRAM y no realiza intercambio.

N

Nivelación del desgaste
La nivelación del desgaste es una técnica del controlador que distribuye las escrituras y los borrados de memoria flash entre bloques físicos para repartir el desgaste de las celdas.
Las actualizaciones repetidas de un registro lógico pueden colocarse en distintos bloques físicos para evitar que se desgaste una sola posición.
Número de página física
Un número de página física identifica el marco físico usado por una correspondencia y forma la parte más significativa de la dirección de byte traducida.
La dirección física de byte es la base del marco más el desplazamiento de página sin cambios, no el número de marco sin desplazar más el desplazamiento.
Número de página virtual
Un número de página virtual es la parte más significativa de una dirección virtual que identifica la página cuya correspondencia debe obtener la traducción.
Con páginas de 4 KiB, quitar los 12 bits menos significativos de desplazamiento deja el número de página virtual usado para la traducción.

O

Orden por filas
El orden por filas almacena de forma contigua los elementos de cada fila de un arreglo rectangular y coloca las filas consecutivas una tras otra.
En un arreglo de C a[i][j], variar j en el bucle interno recorre elementos adyacentes de una fila.

P

Paso de acceso
Un paso de acceso es la diferencia de dirección entre accesos sucesivos de un recorrido, medida en bytes o en elementos con la unidad especificada.
Un recorrido por columnas en una matriz almacenada por filas avanza la longitud en bytes de una fila en vez del tamaño de un elemento.
Penalización por fallo
Una penalización por fallo es la demora adicional después de la búsqueda en caché que se necesita para traer, instalar y entregar un bloque desde un nivel inferior.
Una búsqueda de 2 ciclos con una penalización adicional de 80 ciclos hace que un acceso completo con fallo tarde 82 ciclos en un modelo secuencial.
Precarga
La precarga solicita datos antes de que los necesite un acceso por demanda, lo que permite solapar la latencia de transferencia con trabajo útil cuando la solicitud llega a tiempo.
Un mecanismo de precarga de flujos puede preparar líneas posteriores de un arreglo, pero las solicitudes incorrectas siguen consumiendo ancho de banda y espacio de caché.
Procesamiento por bloques
El procesamiento por bloques organiza un cálculo en torno a pequeñas regiones de datos que permanecen en caché mientras sus valores se reutilizan repetidamente.
Tres bloques de matrices pueden reutilizarse para muchas multiplicaciones y sumas antes de que el algoritmo pase al siguiente grupo de bloques.
Pseudo-LRU
Pseudo-LRU es un método de reemplazo aproximado que registra menos estado que LRU exacto mientras intenta favorecer los bloques usados recientemente.
Las cachés muy asociativas suelen aproximar el uso reciente porque registrar un orden completo requiere más hardware.

R

Reanudación anticipada
La reanudación anticipada reanuda el acceso pendiente cuando llega la palabra solicitada durante la carga de un bloque, antes de recibir la línea completa.
El procesador puede continuar con la palabra necesaria mientras se sigue transfiriendo el resto de una línea larga.
Recorrido de la tabla de páginas
Un recorrido de la tabla de páginas lee las entradas de correspondencia necesarias para traducir una dirección después de un fallo de TLB y comprueba si la correspondencia permite el acceso.
Un recorrido satisfactorio vuelve a llenar el TLB, mientras que una correspondencia ausente o que no permite el acceso puede generar un fallo de página.
Reemplazo del bloque usado menos recientemente (LRU)
El reemplazo LRU expulsa el bloque cuyo acceso más reciente es el más antiguo entre las entradas válidas del conjunto seleccionado.
Un acierto cambia el orden de uso reciente aunque no cargue ningún bloque nuevo, lo que puede cambiar la víctima elegida en el siguiente fallo.
Reemplazo por orden de llegada (FIFO)
El reemplazo FIFO expulsa el bloque que entró antes en un conjunto, sin cambiar el orden de inserción cuando se acierta en ese bloque.
Los aciertos repetidos pueden hacer que el bloque cargado hace más tiempo sea muy útil, pero FIFO sigue seleccionándolo antes que los llegados más recientemente.
Refresco
El refresco es la restauración periódica de la carga en las celdas de DRAM para que su pérdida no borre los valores que almacenan.
El refresco de DDR4 a temperatura normal cubre sus filas dentro de un intervalo de 64 ms, con tiempos más estrictos a temperaturas más altas.
Relleno
El relleno añade almacenamiento no utilizado entre regiones de datos lógicas y puede cambiar los pasos de dirección y la forma en que esas regiones se asignan a conjuntos de caché.
Añadir ocho valores de tipo double a una longitud de fila que es potencia de dos puede distribuir los comienzos de filas sucesivas entre diferentes conjuntos.

S

Sin asignación en escritura
La política sin asignación en escritura gestiona un fallo de escritura enviando el almacenamiento al nivel inferior sin instalar su bloque en la caché comprobada.
Un flujo de salida de una sola vez puede evitar desplazar datos reutilizables en caché cuando sus fallos de escritura no asignan bloques.

T

Tasa de aciertos
Una tasa de aciertos es el número de accesos que encuentran su bloque en el nivel comprobado dividido entre todos los accesos a ese nivel.
Noventa aciertos en cien solicitudes a caché dan una tasa de aciertos del 90 % y una tasa complementaria de fallos del 10 %.
Tasa de fallos
Una tasa de fallos es la fracción de una población de solicitudes especificada que no encuentra su bloque en la caché que se mide.
Una tasa de fallos del 4 % se introduce como 0,04 cuando se multiplica por una penalización adicional en un cálculo del AMAT.
Tasa de fallos ponderada
Una tasa de fallos ponderada combina clases de solicitudes sumando sus números esperados de fallos y dividiendo entre su número combinado de accesos.
Las tasas de instrucciones y datos necesitan ponderarse por el número de accesos cuando cada instrucción produce menos de una solicitud de datos.
Tasa global de fallos
Una tasa global de fallos divide los fallos de un nivel de caché entre las solicitudes originales de memoria del procesador, incluidas las atendidas por encima de ese nivel.
Un 5 % de fallos de L1 y un 20 % de fallos locales de L2 producen una tasa global de fallos de L2 del 1 %.
Tasa local de fallos
Una tasa local de fallos divide los fallos de un nivel de caché solo entre los accesos que llegaron a ese nivel después del filtrado de los niveles superiores.
Una tasa local de fallos de L2 del 20 % describe su flujo de solicitudes más difíciles, no el 20 % de todos los accesos del procesador.
Tiempo de acierto
El tiempo de acierto es la demora para acceder a un nivel de caché y determinar si hay un acierto, incluida la búsqueda que se realiza en los fallos.
Una búsqueda de 2 ciclos aporta dos ciclos a cada solicitud antes de contar cualquier demora adicional por fallo.
Tiempo medio de acceso a memoria (AMAT)
El tiempo medio de acceso a memoria es la demora esperada por solicitud de memoria, que combina el tiempo de búsqueda y el coste adicional de los fallos ponderado por su probabilidad.
Una búsqueda más lenta puede anular el beneficio de menos fallos cuando la penalización evitada del nivel inferior es pequeña.
Transferencia de la palabra crítica primero
La transferencia de la palabra crítica primero es una estrategia de carga que transfiere la palabra solicitada antes que las demás palabras del bloque de caché para acortar su espera.
Una solicitud de una palabra cercana al final de una línea puede recibir esa palabra primero en vez de esperar a las palabras anteriores.
Traza de accesos a caché
Una traza de accesos a caché es un registro ordenado de accesos y cambios de estado resultantes que se usa para determinar aciertos, fallos y expulsiones.
Actualizar cada entrada inmediatamente después de una carga permite que la siguiente fila de la traza use el bloque presente correcto.

V

Vía
Una vía es una de las entradas de caché disponibles dentro de un conjunto, cada una capaz de contener un bloque de datos con su propia etiqueta.
Un conjunto de ocho vías puede conservar ocho bloques que compiten entre sí antes de que una nueva carga deba elegir una víctima válida.

Sobre esta unidad

Por StudeliInformar de un error

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.

Comenzar