Está en la página 1de 48

T6

Tema 6. Memoria caché

Índice
1. Introducción.
2. Jerarquía de memoria
3. Principios de funcionamiento de la memoria caché
4. Elementos de diseño.
5. Mejora del rendimiento de la memoria caché.
EC - IS

1
T6 1. Introducción
 Motivación de la memoria cache 
 La velocidad de la CPU ha ido aumentado a un ritmo superior al que lo hacía la memoria principal.
 En la siguiente gráfica se muestra la diferencia progresiva a lo largo del tiempo entre la capacidad de la 
CPU para ejecutar instrucciones y la de la memoria principal (tecnología DRAM) para suministrarlas.
 La memoria caché es una solución estructural a este problema de diferencia de velocidades, y consiste 
en interponer una memoria más rápida (tecnología SRAM)  y más pequeña entre la principal y la CPU.
 Un mecanismo específico fundamentado en la localidad de referencia de los programas hace posible 
que las palabras de memoria se encuentren en la caché cuando son referenciadas por la CPU.

CPU
transferencias
Bloque cache de palabras

memoria
cache

bloque transferencias
de bloques

memoria
Tipo de memoria Tiempo de acceso (ns)
principal
SRAM 0.5‐2.5
EC - IS

DRAM 50‐70
2
T6 1. Introducción
 Localidad de referencia de los programas
 Los programas manifiestan una propiedad denominada localidad de referencias: tienden a 
reutilizar los datos e instrucciones que utilizaron recientemente o están próximos a los utilizados 
recientemente.
 Esta propiedad se explota en el diseño del sistema de gestión de memoria en general y de 
la memoria caché en particular.
 La localidad de referencia se manifiesta en una doble dimensión: temporal y espacial.
• Localidad temporal:
Las palabras de memoria accedidas recientemente tienen una alta  probabilidad de volver 
a ser accedidas en el futuro cercano. 
‐ Motivada por la existencia de bucles, subrutinas y accesos a la pila de variables locales.
• Localidad espacial:
Las palabras próximas a las recientemente referenciadas tienen  una alta probabilidad de 
ser referenciadas en el futuro cercano.
‐ Viene motivada fundamentalmente por la linealidad de los  programas y el acceso a las 
estructuras de datos regulares (arrays)
 Una consecuencia de la localidad de referencia es que se puede predecir con razonable 
precisión las instrucciones y datos que el programa utilizará en el futuro cercano a partir del 
conocimiento de los accesos a memoria realizados en el pasado reciente.
EC - IS

3
T6 1. Introducción
 ¿Cómo se explota la localidad temporal?
 Cada vez que se accede a memoria principal  se copia la palabra 
accedida en la memoria caché, más pequeña y rápida (SRAM).

– Esta copia ocasiona una penalización en el primer acceso
CPU
– Penalización que será amortizada con creces porque los sucesivos 
accesos a esa palabra (localidad temporal) se realizarán sobre la 
memoria caché, uno o dos órdenes de magnitud más rápida

SRAM 
 ¿Cómo se explota la localidad espacial? (Cache)
 Cada vez que se accede a una dirección de memoria se copia en la 
caché la palabra accedida y las palabras próximas (bloque).

– Por ejemplo, si se accede al elemento a[1], se lleva a la cache  DRAM 
a[0],a[1],a[2] y a[3]. (Mem. Prin)
– De nuevo hay una penalización inicial que será amortizada si la 
CPU accede a las restantes palabras del bloque (localidad 
espacial), accesos que se harán sobre la memoria caché.
EC - IS

4
T6 1. Introducción
Tamaño físico de la cache 
 Ocupa del 50 al 75 % del área
 Más del 80% de los transistores
 Ejemplos:

Intel Poulson 38 MB total IBM Power 7 total 34,5 MB


L1 datos 16KB, L1 instrucciones 16KB L1 datos 32KB, L1 instrucciones 32KB
L2 datos 256KB, L2 instrucciones 512KB L2  256KB 
L3 32MB L3 32MB
EC - IS

5
T6 2. Jerarquía de memoria

 Jerarquía de memoria
 En un computador típico existen diversos 
tipos de memoria, organizados de forma  Registros 
jerárquica: nivel 0
de la CPU
– Registros de la CPU
– Memoria Cache

Tiempo de acceso
– Memoria Principal Cache nivel 1
(SRAMs)
– Memoria Secundaria (discos)

Capacidad

Coste
– Memorias flash y CD‐ROMs Memoria Principal
nivel 2
(DRAMs)
 Propiedades de la jerarquía:
Almacenamiento en disco nivel 3
1. Inclusión: la información  (estado sólido, magnéticos)
almacenada en el nivel Mi debe 
encontrarse también en los niveles 
Memorias flash, discos ópticos nivel 4
Mi+1, Mi+2, …, Mn
2. Coherencia: si un bloque de 
información se modifica en el nivel 
Mi, deben actualizarse los niveles 
Mi+1,.., Mn
EC - IS

6
T6 2. Jerarquía de memoria
 Objetivo de la gestión de la jerarquía de memoria

 Optimizar el uso de la memoria
 Hacer que el usuario tenga la ilusión de que dispone de una memoria con:
Tiempo de acceso similar al del sistema más rápido
Coste por bit similar al del sistema más barato
 Para la mayor parte de los accesos a un bloque de información, este bloque 
debe encontrarse en los niveles bajos de la jerarquía de memoria

 Niveles a los que afecta la gestión de la jerarquía memoria

 Se refiere a la gestión dinámica, en tiempo de ejecución de la jerarquía de 
memoria
 Esta gestión de la memoria sólo afecta a los niveles 1 (cache), 2 (mem. principal) 
y 3 (mem. secund.)
 El nivel 0 (registros) lo asigna el compilador en tiempo de compilación
 El nivel 4 (cintas y discos ópticos) se utiliza para copias de seguridad 
(back‐up)
EC - IS

7
T6 2. Jerarquía de memoria

 Gestión de la jerarquía de memoria

• Gestión de la memoria cache
– Controla la transferencia de información  Memoria Cache
entre la memoria cache y la memoria 
principal Gestión de la
memoria cache
– Suele llevarse a cabo mediante Hardware 
específico (MMU o “Management Memory
Unit”) Memoria Principal

• Gestión de la memoria virtual Gestión de la
memoria virtual
– Controla la transferencia de información 
entre la memoria principal y la memoria 
secundaria Memoria Secundaria
– Parte de esta gestión se realiza mediante 
hardware específico (MMU) y otra parte la 
realiza el S.O
EC - IS

8
T6 3. Principios de funcionamiento de la memoria caché
 Estructura del sistema memoria cache/principal
 Mp (memoria principal):
• Constituida por 2n palabras “dividida” en 2n‐k  bloques de 2k palabras cada uno
Dirección Mp
de memoria Directorio Mc
0
1
2 Bloque 0 Marco de
Bloque 0
Dirección física:
(n-k bits) (k bits)
n
Bloque 1
bloque palabra direccion
Marco de
Bloque m -1

Mc m marcos de bloque o líneas


n
Bloque 2 /2 -1 k 2k palabras/marco de bloque
Mp 2n palabras
2n -1
2k palabras/bloque
2n/2 k bloques >> m
 Mc (memoria cache):
• Constituida por m marcos de bloque (o líneas) de 2k palabras
 Directorio (en memoria cache):
• Sirve para determinar el bloque de Mp alojado en cada línea de Mc.
EC - IS

9
T6 3. Principios de funcionamiento de la memoria caché
 Funcionamiento general de la memoria caché

• Cuando la CPU genera una referencia, busca 
en la cache Dirección de memoria
CPU
– Si la referencia no se encuentra en la  Memoria
cache: FALLO Buscar en el  cache

identificación
tiempo de
directorio
– Cuando se produce un fallo, no solo se  NO 
transfiere una palabra, sino que se  ¿Está en cache (fallo)
lleva un BLOQUE completo de  el bloque?
información de la Mp a la Mc Obtener el 

tiempo de penalización
SI

tiempo de acierto
– Por la propiedad de localidad temporal  (acierto) bloque de MP
• Es probable que en una próxima 
referencia se direccione la misma  Asignar bloque cache 
posición de memoria al bloque de MP
• Esta segunda referencia no 
Almacenar bloque
producirá fallo: producirá un 
en bloque cache
ACIERTO
Acceder a bloque cache
– Por la propiedad de localidad espacial 
tiempo de
acceso
• Es probable que próximas 
referencias sean direcciones que  Seleccionar
pertenecen al mismo bloque FIN
palabra
• Estas referencias no producen 
fallo, producirán ACIERTO
EC - IS

10
T6 4. Elementos de diseño
 Alternativas de diseño en una memoria caché 
 Función de correspondencia (emplazamiento): determina las posibles líneas de la caché (marcos de bloque) 
en las que se puede ubicar un determinado bloque de la memoria principal que ha sido referenciado por el 
programa y hay que llevarlo a memoria caché.

 Algoritmo de sustitución: determina el bloque que hay que desubicar de una línea de la caché cuando ésta 
está llena y hay que ubicar un nuevo bloque.

 Política de escritura: determina la forma de mantener la coherencia entre memoria caché y memoria 
principal cuando se realizan modificaciones (escrituras)

 Política de búsqueda de bloques: determina la causa que desencadena la llevada  de un bloque a la caché  
(normalmente un fallo en la referencia).

 Cachés únicas o independientes: para datos e instrucciones

 Parámetros de rendimiento
• Tasa de aciertos: Ta = Na / Nr
• Tasa de fallos: Tf = Nf / Nr
Nr = número de referencias a memoria
Na = número de aciertos caché 
Nf = número de fallos 
• Evidentemente se cumple: Ta = 1 – Tf
EC - IS

11
T6 4. Elementos de diseño
 Función de correspondencia
 Determina las posibles líneas de la caché (marcos de bloque) en las que se puede ubicar un 
determinado bloque de la memoria principal.
 Existen tres funciones de correspondencia: directa, asociativa y asociativa por conjuntos. 
• Directa: un bloque de Mp sólo puede ubicarse en una línea de la caché, aquella que 
coincide con el bloque cuando superponemos Mc sobre Mp respetando fronteras de Mc
• Asociativa: un bloque de Mp puede ubicarse en cualquier línea de Mc.
• Asociativa por conjuntos: es un compromiso entre las dos anteriores.

Mp

Mc Mc Mc
B0 B0
B1 B1 C0
B2 B2
B3 B3 C1
B4
B4
B5 B5 C2
B6
B7
B6
B7
C3

Directa Asociativa Asociativa por conjuntos


EC - IS

12
T6 4. Elementos de diseño
 Correspondencia directa (1) 

 El bloque  Bj de Mp se puede ubicar sólo en el marco de bloque MBi tal que  i = j mod m,  con


m = número total de líneas que tiene la caché. 
s

bloque

etiqueta marco de bloque palabra

s-r r w
2w palabras/bloque
2s bloques de Mp
2r marcos de bloque en Mc (2r = m)
2s‐r veces contiene Mp a Mc

 Los s ‐ r bits de la etiqueta diferenciarán a cada uno de los bloques de Mp que pueden ubicarse 


en el mismo marco de bloque de Mc.

 El directorio caché en correspondencia directa contendrá un registro de s ‐ r bits por cada 
marco de bloque para contener la etiqueta del bloque ubicado en ese momento en dicho marco.
EC - IS

13
T6 4. Elementos de diseño
 Correspondencia directa (2)
 El esquema de acceso a una Mc con correspondencia directa es el siguiente:
Mp
s+w Memoria Cache

etiqueta marco palabra etiqueta dato


B0
dato
r w MB0
Los bits del campo s-r
dato
marco (o línea) de la
dirección determinan la dato
línea leída.
- Si la etiqueta de la
dirección coincide con etiqueta dato
la etiqueta contenida en s-r
dato
la línea, hay acierto, es dato
MBi s
Comparador
decir, el bloque w
contenido en la línea dato
fallo acierto Bj
leída es el mismo al que
pertenece la dirección w
que accede al sistema de etiqueta dato
memoria. dato
- En caso contrario se MBm-1
produce un fallo de dato
B2s-1
caché. dato
EC - IS

14
T6 4. Elementos de diseño
 Correspondencia directa (3)
 Desde el punto de vista del diseño una Mc con correspondencia directa se organiza como 
una memoria RAM con longitud de palabra suficiente para contener una línea y los bits de 
etiqueta.
 El número de palabras lo determinará el número de líneas.
 El esquema de acceso es el siguiente:

etiqueta línea palabra


Memoria cache (RAM)
Con los bits de línea se 
etiqueta p0 p1 p2 p3 MB0
accede a una palabra de 
la RAM, cuyos bits más  etiqueta p04 p5 p6 p7 MB1
significativos contienen la  etiqueta p8 p9 p10 p11 MB2
etiqueta, que se compara 
con el campo etiqueta de 
la dirección.
etiqueta MBm-2

Los bits del campo  etiqueta MBm-1


palabra seleccionan la 
palabra específica del 
bloque Comparador
MUX
acierto
fallo
EC - IS

15
T6 4. Elementos de diseño
 Correspondencia directa (4)
 Ejemplo: para los tres tipos de correspondencia utilizaremos los siguientes datos:
Tamaño de bloque K = 4 bytes = 22 => w = 2
Tamaño de Mc = 64 KBytes = 216 Bytes = 214 marcos de bloque => r = 14
Tamaño de Mp = 16 MBytes = 224 Bytes = 222 bloques => s = 22
Mp

0000 13 57 92 46
etiqueta línea palabra 0004 00 00 00 00
64KB Mc
11 11 11 11
8 14 2 33 33 33 33 00 13 57 92 46 MB0
00
FF 24 56 78 99 MB1
16 22 33 44 55 MB2
FFF8 00 33 33 33 33 MB3
FFFC .
.
.
13 67 988 8
El dibujo de la derecha muestra un  0000 24 24 25 26
.
.
posible estado de Mc y Mp con  0004 22 33 44 55
.
16MB 16
correspondencia directa.  16 55 55 55 55 .MB214-1
64KB
Mp se ha contemplado dividida en 
FFF8
zonas de tamaño igual a Mc para  FFFC 55 55 55 55
facilitar gráficamente la 
correspondencia entre líneas de Mc  0000 13 12 34 56
y bloques de Mp 0004 24 56 78 99

FF
64KB
FFF8
FFFC
EC - IS

16
T6 4. Elementos de diseño
 Correspondencia asociativa (1)
 Un bloque  Bj de Mp se puede ubicar en cualquier marco de bloque de Mc.

etiqueta palabra
s w
2s bloques de Mp

2r marcos de bloque de Mc
 La etiqueta tiene s bits para poder diferenciar a cada uno de los bloques de Mp (todos) que 
pueden ubicarse en el mismo marco de bloque de Mc.

 El directorio caché en correspondencia asociativa contendrá, pues, un registro de s bits por 
cada marco de bloque para contener la etiqueta del bloque ubicado en ese momento en dicho 
marco
EC - IS

17
T6 4. Elementos de diseño
 Correspondencia asociativa (2)
 El esquema de acceso a una Mc con correspondencia asociativa es el siguiente:

Mp
s+w Memoria Cache

etiqueta palabra etiqueta

MB0 B0
w
s

En este caso se 
compara el campo 
etiqueta de la 
dirección con las  MBi
etiquetas de todas 
las líneas de Mc. s

Bj
MBm-1
w
Comparador
acierto
fallo
EC - IS

18
T6 4. Elementos de diseño
 Correspondencia asociativa (3)
 Desde el punto de vista del diseño una Mc con correspondencia asociativa se organiza con 
una memoria RAM con longitud de palabra suficiente para contener una línea,  y una Memoria 
Asociativa para contener las etiquetas de los bloques actualmente en Mc.
 El esquema de acceso es el siguiente:

etiqueta palabra Dirección física

Etiquetas Datos

MB0

MB1
Con los bits de etiqueta se 
accede a la Memoria  Memoria
Asociativa
Asociativa. Si coincide con 
MBm-2
alguna etiqueta contenida en 
la Memoria Asociativa, se lee 
MBm-1
la correspondiente palabra de 
la memoria RAM que  acierto/fallo
contendrá el bloque buscado.
MUX
EC - IS

19
T6 4. Elementos de diseño

 Correspondencia asociativa por conjuntos (1)
 Las líneas de Mc se dividen en  v = 2d conjuntos con k  líneas/conjunto  o  vías cada uno. 
 Se cumple que el número total de marcos de bloque (líneas) que tiene la caché  m = v * k. 
 Un bloque  Bj de Mp se puede ubicar sólo en el conjunto Ci de Mc que cumple  i = j mod v.

bloque

etiqueta conjunto palabra

s-d d w

 La etiqueta tiene s – d bits para poder diferenciar a cada uno de los bloques de Mp que 


pueden ubicarse en el mismo conjunto de Mc.

 El directorio caché en correspondencia asociativa por conjuntos contendrá, pues, un 
registro de s ‐ d bits por cada conjunto de líneas de Mc.
EC - IS

20
T6 4. Elementos de diseño
 Correspondencia asociativa por conjuntos (2)
 El esquema de acceso a una Mc con correspondencia asociativa por conjuntos es 
el siguiente: Mp
s+w Memoria Cache

etiqueta conjunto palabra etiqueta

B0
d w
s-d
Los bits del campo  
C0
conjunto de la dirección 
determinan el conjunto 
leído. Si la etiqueta de la 
dirección coincide con la 
etiqueta de alguna de las 
líneas del conjunto  s
accedido, hay acierto, es 
decir, el bloque contenido  Bj
en dicha línea es el mismo 
w
al que pertenece la  Comparador
dirección que accede al  Cv-1

sistema de memoria. En  fallo
caso contrario se produce  acierto
un fallo de caché.
EC - IS

21
T6 4. Elementos de diseño
 Correspondencia asociativa por conjuntos (3)
 Una memoria de correspondencia asociativa de grado k se organiza como un conjunto de k 
memorias de correspondencia directa, cada una con su comparador.
 Para el caso k= 2 (2 vías) el esquema sería el siguiente:

etiqueta conjunto palabra

C0

C1

Con los bits de conjunto se 
accede a cada una de las 
palabras de las k RAM del  Comparador
sistema. La etiqueta de la 
MUX
dirección se compara en 
paralelo con los campos 
etiqueta de todas las palabras  C0
leídas. Si alguna coincide, hay 
C1
acierto  y con  los bits del 
campo palabra seleccionan la 
palabra específica del bloque

Comparador

MUX
EC - IS

22
T6 4. Elementos de diseño
 Correspondencia asociativa por conjuntos (4)
 Ejemplo (anterior).
k = 2 => v = m/k = dr/2 = d14/2 = d13 => d = 13; w = 2;  s = 22 => s ‐ d  = 9
Bloque  = 4 bytes = 22 => w = 2
Mc = 64 KBytes = 216 Bytes = 214 = 214 líneas => r = 14 
Mp = 16 MBytes = 224 Bytes = 222 bloques => s = 22
Mp
Mc
etiqueta línea palabra 0000 13 57 92 46
0004 00 00 00 00
9 13 2 11 11 11 11
33 33 33 33 32KB
000

7FF8
7FFC
El dibujo de la derecha muestra un  13 67 98 88 001 13 67 98 88 000 13 57 92 46 C0
0000 C1
posible estado de Mc y Mp con  0004 24 24 25 26 1FF 13 12 34 56 001 24 24 25 26
C2
22 33 44 55
correspondencia asociativa por  001
32KB
conjuntos de grado de asociatividad
k = 2 7FF8
7FFC 55 55 55 55

En este caso Mp se ha contemplado 
001 55 55 55 55 1FF 55 55 55 55
dividida en zonas con un número de 
blques igual al número de conjuntos  0000 13 12 34 56
0004 24 56 78 99
de Mc, para facilitar gráficamente la 
correspondencia  1FF 32KB

7FF8
7FFC 55 55 55 55
EC - IS

23
T6 4. Elementos de diseño
 Funciones de correspondencia unificadas:  asociativa por conjunto
 Las tres funciones de correspondencia se pueden ver en realidad como una sola, la asociativa 
por conjunto, siendo las otras dos correspondencias casos extremos de ella:
conjunto/línea

etiqueta índice palabra

aumenta la
asociatividad
asociativa
directa

CorrespondenciaSi k = 1 ==> m = v ==> asociativa por conjuntos de 1 vía = directa


Ventajas Inconvenientes
Directa Acceso simple y rápido Alta tasa de fallos cuando varios 
Si v = 1 ==> m = k ==> asociativa por conjuntos de m vías = asociativa
bloques compiten por el mismo 
marco
Asociativa Máximo aprovechamiento de la MC Una alta asociatividad impacta 
directamente en el acceso a la MC
Asociativa por conjuntos Es un enfoque intermedio entre emplazamiento directo y  Al aumentar el grado de 
asociativo asociatividad aumenta el tiempo de 
El grado de asociatividad afecta al rendimiento,  al aumentar el  acceso y el coste hardware
grado de asociatividad disminuyen los fallos por competencia 
por un marco
Grado óptimo: entre 2 y 16
Grado más común: 2
EC - IS

24
T6 4. Elementos de diseño
 Algoritmos de sustitución (o reemplazamiento)
 En las correspondencias asociativa y asociativa por conjuntos decide qué bloque sustituir.
 En la primera la elección se tiene que realizar sobre cualquier bloque presente en Mc
 En la segunda se reduce al conjunto único donde puede ubicarse el nuevo bloque.
 Las políticas de reemplazamiento más utilizadas son cuatro:
• Aleatoria: se escoge un bloque al azar
• LRU(Least Recently Used):Se sustituye el bloque que hace más tiempo que no ha sido referenciado
Algoritmo: se asocian contadores a las líneas y Si se referencia MBi

MBk : contador(MBk)  contador(MBi)  ==>  contador(MBk) := contado(MBk) + 1


contador(MBi) = 0
Cuando se produce un fallo se sustituye  el MBi : contador(MBi) = MAXIMO
Memoria asociativa de dos vías: basta con añadir un bit de uso a cada marco de bloque. 
• Cuando se referencia una línea su bit de uso se pone a 1 y el de la línea del mismo conjunto a 0.
• Cuando hay que sustituir se elige el marco de bloque con bit de uso igual a 0.
• FIFO (First In First Out): Se sustituye aquel bloque que ha estado más tiempo en la caché
(independientemente de sus referencias)
Se puede implementar con una cola
• LFU(Least Frequently Used): Se sustituye aquel bloque que ha experimentado menos referencias
Se puede implementar asociando un contador a cada marco de bloque
EC - IS

25
T6 4. Elementos de diseño
 Política de escritura
 Determina la forma de actualizar Mp cuando se realizan operaciones de escritura. 
 2 casos: cuando la posición en la que se escribe está en Mc (acierto) y cuando no está (fallo).
• Frente a aciertos en la caché: dos alternativas:
 Escritura directa o inmediata (write through)
o Todas las operaciones de escritura se realizan en Mc y Mp
o Inconveniente: genera un tráfico importante a Mp
o Solución: utilización de un buffer de escritura (alpha 21064)
Buffer
de Mp
escritura

Postescritura (copy back)


o Las actualizaciones se hacen sólo en Mc
o Se utiliza un bit de actualización asociado a cada marco de bloque
o Inconveniente: inconsistencia temporal entre Mc y Mp
• Frente a fallos en la caché
 Asignación en escritura (write allocate): el bloque se ubica en Mc cuando 
ocurre el fallo de escritura y a continuación se opera  como en un acierto de 
escritura, es decir, con wirte through o copy back
No asignación en escritura (No write allocate): el bloque se modifica en Mp sin 
cargarse en Mc
EC - IS

26
T6 4. Elementos de diseño
 Política de búsqueda
 Determina las condiciones que tienen que darse para buscar un bloque de Mp y llevarlo a 
Mc.
 Existen dos alternativas principales: 

 Por demanda: se lleva un bloque a Mc cuando se referencia alguna palabra del bloque y 
éste no está en Mc

 Anticipativa (prebúsqueda)

• Prebúsqueda siempre: la primera vez que se referencia el bloque Bi se busca también 
Bi+1
• Prebúsqueda por fallo: cuando se produce un fallo se buscan los bloques Bi y Bi+1

 Clasificación de los fallos caché: los fallos de la caché se pueden clasificar en tres tipos:
• Forzosos: producidos por el primer acceso a un bloque
• Capacidad: producidos cuando Mc no puede contener todos los bloques del programa
• Conflicto: producidos por la necesidad de ubicar un bloque en un conjunto lleno 
cuando Mc no está llena
EC - IS

27
T6 5. Mejora del rendimiento de la memoria caché

 Factores que determinan el rendimiento de la memoria caché
 Tiempo de acceso a memoria durante la ejecución de un programa:
Tacceso = Na * Tc + Nf * Tp
Na es el número de referencias con acierto
Nf es el número de referencias con fallo
Tc es el tiempo de acceso a una palabra de Mc
Tp es el tiempo de acceso a un bloque de Mp
 Tiempo de acceso medio durante la ejecución del programa valdrá:
Tacceso_medio = Tacceso/ Nr = Ta*Tc + Tf*Tp
Ta = Na/Nr (tasa de aciertos)
Tf = Nf/Nr (tasa de fallos)
Nr = Na+Nf = número total de referencias a memoria
Tacceso_medio = Tacierto + Tf * Tp

Tacierto = Ta*Tc, si frente a un fallo, el bloque se lleva a Mc al tiempo que a la CPU


Tacierto = Tc, si frente a un fallo, el bloque se lleva a Mc y después (secuencia) a la CPU
(Tacceso = Nr * Tc + Nf * Tp ==>  Tacceso_medio = Tacceso/ Nr = Tc + Tf * Tp)  
EC - IS

28
T6 5. Mejora del rendimiento de la memoria caché

 Alternativas para mejorar el rendimiento de una caché
Tacceso_medio = Tacierto + Tf * Tp

 Reducción de la tasa de fallos: Tf
• Ajuste del tamaño de bloque
• Ajuste de la asociatividad
• Caché seudoasociativa
• Caché víctima
• Pre‐búsqueda hardware
• Pre‐búsqueda software
• Optimización del código 

 Reducción de la penalización de los fallos: Tp
• Cachés multinivel
• Prioridad de las lecturas frente a las escrituras

 Reducción del tiempo de acierto: Tacierto
• Caché pequeña y sencilla
EC - IS

29
T6 5. Mejora del rendimiento de la memoria caché
 Reducción de la tasa de fallos: ajuste del tamaño de bloque

 Aumentar el tamaño del bloque disminuye la tasa de fallos iniciales y captura 
mejor la localidad espacial

 Pero se aumenta la tasa de fallos de capacidad (menor Nº Bloques => captura 
peor localidad temporal)

 Al tener bloques más grandes aumenta la penalización por fallos

Tf (%)
25

20

15

10

0
Tamaño bloque 16 bytes 32 bytes 64 bytes 128 bytes 256 bytes

Tamaño cache 1 KB 4 KB 16 KB 64 KB 256 KB
EC - IS

30
T6 5. Mejora del rendimiento de la memoria caché
 Reducción de la tasa de fallos: ajuste de la asociatividad
 Experimentalmente se comprueba que una caché asociativa por conjuntos de 
8 vías es tan eficiente (tasa de fallos) como una caché completamente asociativa.

 Una caché de correspondencia directa de tamaño N tiene aproximadamente la 
misma    tasa de fallos que una asociativa por conjuntos de 2 vías de tamaño N/2

 Al aumentar la asociatividad se incrementa el ciclo de reloj y por tanto Tacierto

Tf
0.14
1-way
Ejemplo: Valores promedio de Miss Rate para
0.12 programas de SPEC92
2-way
0.1
4-way • Reemplazamiento: LRU
0.08 •Tamaño bloque: 32 bytes (cte)
8-way • Variando: tamaño cache, asociatividad
0.06
Capacity
0.04

0.02
0
1

16

32

64

128
EC - IS

Cache Size (KB) Compulsory


31
T6 5. Mejora del rendimiento de la memoria caché
 Reducción de la tasa de fallos: caché seudoasociativa
 Caché de correspondencia directa con una modificación para que se comporte como asociativa
 Se permite que un bloque de Mp se pueda ubicar en dos (pseudoasociativa de 2 vías) marcos
de Mc:
•el que le corresponde (por la correspondencia directa)
•el que resulta de conmutar el bit más significativo de la dirección del bloque

etiqueta marco palabra


Memoria cache pseudoasociativa

0 X X...........X

conjunto
pseudoasociativo
1 X X...........X

Comparador
MUX
acierto
fallo
EC - IS

32
T6 5. Mejora del rendimiento de la memoria caché
 Rendimiento de  una caché pseudoasociativa
Tiempo_acceso_mediopseudo = Tiempo_aciertopseudo + Tasa_fallospseudo *Penalización_fallospseudo
Tasa_fallospseudo = Tasa_fallos2vías
Penalización_fallospseudo = Penalización_fallosdirecta
Tiempo_aciertopseudo = Tiempo_aciertodirecta + Tasa_aciertos_alternativospseudo *2
Tasa_aciertos_alternativospseudo = Tasa_aciertos2vías ‐ Tasa_aciertosdirecta =
(1 ‐ Tasa_fallos2vías)‐ (1 ‐ Tasa_fallosdirecta) = Tasa_fallosdirecta ‐ Tasa_fallos2vias
Tiempo_acceso_mediopseudo = 
Tiempo_aciertodirecto +(Tasa_fallosdirecta ‐ Tasa_fallos2vias)*2 + Tasa_fallos2vías *Penalización_fallosdirecta

Ejemplo:
Tamaño grado tasa de penalización Tiempo de
(caché) asociatividad fallos fallo acierto
2K 1 0,098 50 1
2K 2 0,076 50 1

Tiempo_acceso_mediopseudo = 1 + (0,098 - 0,076) * 2 + 0,076 * 50 = 4,844

Tiempo_acceso_mediodirecta 1 + 0,098 * 50 = 5,90 > 4,844


EC - IS

33
T6 5. Mejora del rendimiento de la memoria caché

 Reducción de la tasa de fallos: Cache Víctima
CPU
 Se propuso por primera vez en 1990, la idea es utilizar una  registros
cache pequeña completamente asociativa (CV) 
conjuntamente con una cache grande con una asociatividad
más limitada (MC)

 Se intenta conseguir que MC tenga la misma tasa de fallos 
que si fuera completamente asociativa
MC CV
‐ Ej: MC de acceso directo + CV asociativa tiene la misma 
tasa de fallos que MC con 2 vías. Un bloque puede 
estar en MC o en CV pero nunca en las dos

 En la cache víctima estarán aquellos bloques que han sido 
re‐emplazados de la memoria cache
‐ Un bloque pasa de MC a CV cuando se produce un re‐ MP
emplazo
‐ Un bloque pasa de CV a MC cuando es referenciado
EC - IS

34
T6 5. Mejora del rendimiento de la memoria caché
 Reducción de la tasa de fallos: Pre‐búsqueda Hardware

 Anticipa los fallos de Cache anticipando las búsquedas antes de que el 
procesador demande el dato o la instrucción que provocarían un fallo

 Típicamente la CPU busca dos bloques en un fallo (el referenciado y el 
siguiente)

 El bloque buscado se lleva a Mc

 El prebuscado se lleva a un buffer (“prefetch buffer” o “stream buffer”). Al ser 


referenciado pasa a MC
EC - IS

35
T6 5. Mejora del rendimiento de la memoria caché

 Reducción de la tasa de fallos: Pre‐búsqueda Software
 Se introducen en el hardware instrucciones explícitas de prebúsqueda del tipo 
prefetch(dato) que el compilador utiliza para optimizar los programas después de 
realizar un análisis de sus sentencias 
 La prebúsqueda se realiza al tiempo que el procesador continúa la ejecución del 
programa, es decir, la prebúsqueda se hace en paralelo con la ejecución de las 
instrucciones.
 La eficiencia depende del compilador y del tipo de programa
 Pre‐búsqueda con destino en cache (MIPS IV, PowerPC, SPARC v. 9), o en 
registro (HP‐PA)
 Funciona bien con bucles y patrones simples de acceso a arrays. Aplicaciones de 
cálculo
 Funciona mal con aplicaciones enteras que presentan una amplia reutilización 
de Cache
 Recargo (overhead) por las nuevas instrucciones. Más búsquedas. Más 
ocupación de memoria
EC - IS

36
T6 5. Mejora del rendimiento de la memoria caché
 Pre‐búsqueda Software: ejemplo
 Caché de 8 KB de correspondencia directa y bloques de 16 bytes

 Se ejecuta el siguiente programa:

for (i = 0; i < 3; i = i + 1)


for (j = 0; j < 100; j = j + 1)
a[i][j] = b[j][0] * b[j+1][0];

a[0][0] b[0][0]
a[0][1] b[0][1]
a[0][2] b[0][2] • Cada elemento de los arrays a[i][j] y  b[i][j] ocupan 8 bytes 
........ .........
a[0][99] b[0][99]
• Están dispuestos en memoria en orden ascendente de sus índices:
a[1][0] b[1][0]
a[1][1] b[1][1]
a[1][2] b[1][2]
........ .........
a[1][99] b[1][99]
a[2][0] b[2][0]
a[2][1] b[2][1]
a[2][2] b[2][2]
........ .........
EC - IS

a[2][99] b[2][99]
37
T6 5. Mejora del rendimiento de la memoria caché
 Pre‐búsqueda Software: ejemplo (sin prebúsqueda)

 Acceso a a[ ][ ] Mc a[i][j] = b[j][0] * b[j+1][0];


iteraciones
• Se beneficia de la localidad espacial
•Valores pares de j  fallos (forzosos) a[0][0] b[0][0] b[1][0] i= 0, j= 0 a[0][0] ,b[0][0],b[1][0]
a[0][1] b[0][1] b[1][1]
•Valores impares de j  aciertos
(van a Mc en los bloques de los pares). b[2][0] i= 0, j= 1 a[0][1] ,b[1][0],b[2][0]
b[2][1]
Número de fallos = (3 * 100)/2 = 150.
(3 filas y 100 columnas) a[0][2] b[3][0] i= 0, j= 2 a[0][2] ,b[2][0],b[3][0]
a[0][3] b[3][1]
 Acceso a b[ ][ ]
• No se beneficia de la localidad espacial:
Los accesos no se realizan en el orden en
que están almacenados. a[0][98] b[99][0] i= 0, j= 98 a[0][98] ,b[98][0],b[99][0]
a[0][99] b[99][1]
• Se beneficia dos veces de la temporal:
Se accede a los mismos elementos para b[100][0] i= 0, j= 99 a[0][99] ,b[99][0],b[100][0]
cada iteración de i b[100][1]

• Cada iteración de j usa los mismos 1 + 100 = 101 fallos


valores de b[ ][ ] en la anterior. a[1][0] i= 1, j= 0 a[1][0] ,b[0][0],b[1][0]
a[1][1]
Número de fallos = 101

1 para b[0][0]
100 para b[1][0] hasta b[100][0]).
a[2][98] i= 2, j= 98 a[1][0] ,b[0][0],b[1][0]
a[2][99]
Número total de fallos = 251.
EC - IS

3*100/2 = 150 fallos

38
T6 5. Mejora del rendimiento de la memoria caché
 Pre‐búsqueda Software: ejemplo (con prebúsqueda)
 Se descompone el bucle en dos: el primero (iteración para i = 0) prebusca a partir 
de b[6][0] y a[0][6]:  Mc a[i][j] = b[j][0] * b[j+1][0];
for (j = 0; j < 100; j = j + 1)
prebusqueda fallos
prefetch (b[j+6][0]); iteraciones
prefetch (a[0][j+6]);
a[0][j] = b[j][0] * b[j+1][0]; a[0][6] b[6][0] a[0][0] b[0][0] b[1][0] i= 0, j= 0
a[0][1] b[0][1] b[1][1]
for (i = 1; i < 3; i = i + 1) a[0][7] b[0][7]
for (j = 0; j < 100; j = j + 1) b[2][0] i= 0, j= 1
b[2][1]
prefetch (a[i][j+6]);
a[i][j] = b[j][0] * b[j+1][0];
a[0][2] b[3][0] i= 0, j= 2
a[0][3] b[3][1]
 Se ha elegido el valor 6 para el 
número de iteraciones que se buscan  b[4][0] i= 0, j= 3
por adelantado b[4][1]

 En el segundo bucle sólo se prebusca a[0][4] b[5][0] i= 0, j= 4


a[0][5] b[5][1]
a[1][6]... a[1][99], a[2][6]... a[2][99]
b[i][j] ya se ha prebuscado en el 1 + 5 = 6 fallos
3 fallos
primero.

 Fallos en las 3 iteraciones de a[][] =


3*3=9 a[0][99] b[99][0]

 Fallos en b[][] =6
EC - IS

i= 99 j= 99

 Número total de fallos = 6 + 9 = 15 39


T6 5. Mejora del rendimiento de la memoria caché
 Reducción de la tasa de fallos: Optimización del código (1)
 Fusión de arrays
• Se sustituyen varios arrays de igual tamaño por un único array de elementos 
estructurados.
• La transformación aumenta la localidad espacial si el programa referencia 
localmente las componentes de igual índice de los arrays originales.
val array_fundido

programa original programa transformado

int val[SIZE]; struct merge {


int key [SIZE]; int val;
key
int key;
};
struct merge
array_fundido[SIZE]

• La transformación mejora la localidad espacial de los arrays originales.
EC - IS

40
T6 5. Mejora del rendimiento de la memoria caché
 Reducción de la tasa de fallos: Optimización del código (2)
 Fusión de bucles

Ejemplo:

programa original programa transformado

for (i = 0; i < 100; i = i + 1) for (i = 0; i < 100; i = i + 1)


for (j = 0; j < 100; j = j + 1) for (j = 0; j < 100; j = j + 1)
a[i][j] = 2/b[i][j] *c[i][j]; a[i][j] = 2/b[i][j] *c[i][j];
d[i][j] = a[i][j] + c[i][j];
for (i = 0; i < 100; i = i + 1)
for (j = 0; j < 100; j = j + 1)
d[i][j] = a[i][j] + c[i][j];

• La transformación mejora la localidad temporal, ya que las referencias a a[][] y c[][] en el


primer bucle del programa original se hacen separadas en el tiempo a las referencias a
a[][] y c[][] del segundo bucle.

• En el programa transformado estas referencias se hacen para los mismos valores de los
índices en las 2 expresiones consecutivas.
EC - IS

41
T6 5. Mejora del rendimiento de la memoria caché
 Reducción de la tasa de fallos: Optimización del código (3)
 Intercambio de bucles bucle original bucle intercambiado

Ejemplo: iteración 1 x[0][0] iteración 1


x[0][1]
iteración 101 iteración 2

programa original x[0][2]

for (j = 0; j < 100; j = j + 1) x[0][4999]

for (i = 0; i < 5000; i = i + 1) iteración 2 x[1][0] iteración 5001


x[i][j] = 2*x[i][j]; x[1][1]
iteración 102 iteración 5002
x[1][2]

programa transformado
x[1][4999]

for (i = 0; i < 5000; i = i + 1)


for (j = 0; j < 100; j = j + 1) iteración 100 x[99][0] iteración 495001

x[i][j] = 2*x[i][j]; iteración 200 x[99][1] iteración 495002

x[99][2]

• La transformación mejora la localidad espacial.


x[99][4999]
iteración 500000 iteración 500000
EC - IS

42
T6 5. Mejora del rendimiento de la memoria caché
 Reducción de la tasa de fallos: Optimización del código (4)
 Descomposición en bloques
• Reduce la tasa de fallos aumentando la localidad temporal
• En lugar de operar sobre filas o columnas completas de un array opera sobre submatrices o bloques
• El objetivo es maximizar los accesos a los datos cargados en la caché antes de ser reemplazados

• Ejemplo: multiplicación de matrices

for (i = 0; i < N; i = i + 1)


for (j = 0; j < N; j = j + 1)
{ r = 0;
for (k = 0; k < N; k = k + 1){
}; r = r + Y[i][k] *Z[k][j];};
X[i][j] = r;

X00 X01 X02 X03 X04 X05 Y00 Y01 Y02 Y03 Y04 Y05 Z00 Z01 Z02 Z03 Z04 Z05
X10 X11 X12 X13 X14 X15 Y10 Y11 Y12 Y13 Y14 Y15 Z10 Z11 Z12 Z13 Z14 Z15

X20 X21 X22 X23 X24 X25 Y20 Y21 Y22 Y23 Y24 Y25 Z20 Z21 Z22 Z23 Z24 Z25
X30 X31 X32 X33 X34 X35 Y30 Y31 Y32 Y33 Y34 Y35 Z30 Z31 Z32 Z33 Z34 Z35

X40 X41 X42 X43 X44 X45 Y40 Y41 Y42 Y43 Y44 Y45 Z40 Z41 Z42 Z43 Z44 Z45

X50 X51 X52 X53 X 54 X55 Y50 Y51 Y52 Y53 Y 54 Y55 Z50 Z51 Z52 Z53 Z54 Z55
EC - IS

43
T6 5. Mejora del rendimiento de la memoria caché
 Reducción de la tasa de fallos: Optimización del código (5)
 Ejemplo: multiplicación de matrices
• Programa transformado

for (jj = 0; jj < N; jj = jj + B)


for (kk = 0; kk < N; kk = kk + B)
for (i = 0; i < N; i = i + 1)
for (j = jj; j < min(jj + B, N); j = j + 1)
{ r = 0;
for (k = kk; k  <  min(kk + B,N); k = k + 1){
r = r + Y[i][k] *Z[k][j];};
X[i][j] = X[i][j] +r;
};

• Calcula parcialmente los valores de x[][] para que los bloques de elementos de Y[][] y Z[][]
sean utilizados totalmente cuando se llevan a la caché, aumentando su localidad temporal:

X00 X01 X02 Y00 Y01 Y02 Z00 Z01 Z02


X10 X11 X12 Y10 Y11 Y12 Z10 Z11 Z12

Z20 Z21 Z22


EC - IS

44
T6 5. Mejora del rendimiento de la memoria caché
 Reducción de la penalización por fallo: Cachés Multinivel
 Como los fallos se sirven leyendo bloques de Mp, una alternativa para disminuir la 
penalización por fallo consiste en disminuir el tiempo de acceso a Mp utilizando el 
mismo mecanismo caché, es decir, utilizando una caché intermedia  o de segundo 
nivel (L2) entre Mc (L1) y Mp.
Tiempo_acceso_medio = Tiempo_acierto N1 + Tasa_fallos N1 * Penalización_fallos N1
Penalización_fallosN1 = Tiempo_acierto N2 + Tasa_fallos N2 * Penalización_fallos N2

Con varios niveles de cachés hay que diferenciar la tasa


de fallos local de la global: CPU

Tasa_fallos_local = nº de fallos / nº de accesos a caché

Tasa_fallos_global = nº de fallos / nº total de accesos desde la CPU Mc (L1)

• En general se cumple: Ejemplo:


1000 referencias (cahé de dos niveles)
40 fallos se producen en N1 Mc (L2)
Tasa_fallos_local  Tasa_fallos_global 20 fallos se producen en N2
Tasa_fallos_localN1 = Tasa_fallos_globalN1 =
• Y en particular: 40/1000 = 0.04 (4%)
Mp
Tasa_fallos_localN1 = Tasa_fallos_globalN1 Tasa_fallos_localN2 = 20/40 = 0.5 (50%)
Tasa_fallos_globalN2 = 20/1000 = 0.02 (2%)
Tasa_fallos_localN2 > Tasa_fallos_globalN2
EC - IS

45
T6 5. Mejora del rendimiento de la memoria caché

 Reducción de la penalización por fallo: prioridad de lecturas sobre escrituras

 Un fallo de lectura puede impedir la continuación de la ejecución del programa; 
un fallo de escritura puede ocultarse.

 Buffer de escrituras (rápido). Depositar en buffer las palabras que tienen que 
ser actualizadas en MP y continuar ejecución.

 La transferencia del buffer a MP se realiza en paralelo con la ejecución del 
programa.

 PROBLEMA: podemos estar intentando leer una palabra que todavía está en el 
buffer.
EC - IS

46
T6 5. Mejora del rendimiento de la memoria caché

 Reducción del tiempo de acierto: Cache pequeña y sencilla (1)


 El acceso al directorio y la comparación de etiquetas consume tiempo
 Ejemplo: Comparación de acceso a un dato en cache directa y en cache 
asociativa por conjuntos con 2 vías

B PAL B PAL

9 9
ETIQUETA MB PAL ETIQUETA NC PAL

5 2 2 V Etiqueta Datos MB 6 1 2 V Etiqueta Datos NC


0
1
{ 0

2
1
3

COMPARA COMPARA
MULTIPLE MULTIPLE

ACIERTO DATO DATO


ACIERTO
Directo Asociativo por conjuntos 2 vías
EC - IS

47
T6 5. Mejora del rendimiento de la memoria caché
 Reducción del tiempo de acierto: Cache pequeña y sencilla (2)
 Una cache pequeña se pueda integrar junto al procesador 
• evitando la penalización en tiempo del acceso al exterior
• Tiempo de propagación versus tiempo de ciclo del procesador
 Ejemplo: tres generaciones del procesadores AMD (K6, Athlon y Opteron) han 
mantenido el mismo tamaño para las caches L1
 Simple (cache directa o grado de asociatividad pequeño)
• En cache directa se puede solapar chequeo de tags y acceso al dato, 
puesto que el dato sólo puede estar en un lugar
• El aumento del número de vías puede aumentar los tiempos de 
comparación de tags
 Ejemplo: impacto del tamaño de la cache y la asociatividad sobre el tiempo de 
acceso (tecnología 90 nm)
1-way 2-way 4-way 8-way

2,50
Access time (ns)

2,00
1,50
1,00
0,50
-
EC - IS

16 KB 32 KB 64 KB 128 KB 256 KB 512 KB 1 MB


Cache size
48