Universidade Federal do Rio Grande do Sul
Instituto de Informática
Programa de Pós-Graduação em Computação
Arquitetura e Organização de
Processadores
Aulas 9 e 10
Memória cache
CMP237
1. Introdução
Tendências tecnológicas
Lógica:
DRAM:
Disco:
Ano
1980
1983
1986
1989
1992
1995
Capacidade
2x em 3 anos
4x em 3 anos
4x em 3 anos
DRAM
Tamanho
1000:1! 64 Kb 2:1!
256 Kb
1 Mb
4 Mb
16 Mb
64 Mb
Velocidade (latência)
2x em 3 anos
2x em 10 anos
2x em 10 anos
Tempo acesso
250 ns
220 ns
190 ns
165 ns
145 ns
120 ns
CMP237
Tendências tecnológicas
Hiato de desempenho (latência) entre
processador e memória DRAM
1000
CPU
100
hiato cresce 50%
a cada ano
10
DRAM
1
DRAM
9% / ano
(2X / 10 anos)
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
Performance
“Lei de Moore”
µProc
60% / ano
(2X / 1.5 anos)
Tempo
CMP237
Hierarquia de memória
• objetivo: oferecer ilusão de máximo tamanho de memória, com mínimo custo e
máxima velocidade
• cada nível contém cópia de parte da informação armazenada no nível superior
seguinte
Processador
Bloco de controle
Memória
Memória
Memória
Velocidade:
Tamanho:
Custo:
Memória
Bloco
operac.
Mais rápida
Menor
Mais alto
Memória
Mais lenta
Maior
Mais baixo
CMP237
Tecnologias na hierarquia de memória
• Acesso randômico
– tempo de acesso é o mesmo para todas as posições
– DRAM: Dynamic Random Access Memory
• alta densidade, baixa potência, barata, lenta
• dinâmica: precisa de um “refresh” regular
– SRAM: Static Random Access Memory
• baixa densidade, alta potência, cara, rápida
• estática: conteúdo dura “para sempre”(enquanto houver alimentação)
• Acesso “não-tão-randômico”
– tempo de acesso varia de posição para posição e de tempos em tempos
– exemplos: disco, CD-ROM
• Acesso sequencial
– tempo de acesso varia linearmente com a posição (p.ex. fita)
CMP237
Hierarquia de memória
Processador
Bloco de controle
On-Chip
Cache
Registrad.
Bloco
operac.
Velocidade (ns): 0,1
1
Tamanho (bytes): 100
16 K
Cache
2º nível
(SRAM)
Memória
principal
(DRAM)
2-5
10-20
512 K
256 M
Memória
secundária
(disco)
10.000.000 (10 ms)
Gs
CMP237
Hit e miss
• Hit: dado aparece em algum bloco no nível superior (junto ao
processador)
– Hit Ratio: a fração de acessos à memória resolvidos no nível superior
– Hit Time: tempo de acesso ao nível superior, que consiste de
tempo de acesso à memória RAM + tempo para determinar hit/miss
• Miss: dado precisa ser buscado de um bloco no nível inferior
– Miss Ratio = 1 – (Hit Ratio)
– Miss Penalty: tempo gasto para substituir um bloco no nível superior +
tempo para fornecer o bloco ao processador
• Hit Time << Miss Penalty
CMP237
Hierarquia de memória
Como a hierarquia é gerenciada?
• Registradores <-> memória
– pelo compilador
• cache <-> memória principal
– pelo hardware
• memória principal <-> disco
– pelo hardware e pelo sistema operacional (memória virtual)
– pelo programador (arquivos)
CMP237
Princípio de localidade
•
Hierarquia de memória funciona devido ao princípio de localidade
– todos os programas repetem trechos de código e acessam repetidamente
dados próximos
Probabilidade
de referência
0
•
•
Espaço de endereçamento
2n - 1
localidade temporal: posições de memória, uma vez acessadas, tendem a
ser acessadas novamente no futuro próximo
localidade espacial: endereços em próximos acessos tendem a ser
próximos de endereços de acessos anteriores
CMP237
Princípio de localidade
Como explorar o princípio de localidade numa hierarquia de memória?
• Localidade Temporal
=> Mantenha itens de dados mais recentemente acessados nos níveis da
hierarquia mais próximos do processador
• Localidade Espacial
=> Mova blocos de palavras contíguas para os níveis da hierarquia mais
próximos do processador
para processador
Nível mais
próximo
Nível mais
distante
Bloco X
do processador
Bloco Y
CMP237
Localidade temporal
•
•
•
usualmente encontrada em laços de instruções e acessos a pilhas
de dados e variáveis
é essencial para a eficiência da memória cache
se uma referência é repetida N vezes durante um laço de
programa, após a primeira referência a posição é sempre
encontrada na cache
Tc = tempo de acesso à cache
Tm = tempo de acesso à memória principal
Tce = tempo efetivo de acesso à cache
Tce =
N Tc + Tm
N
= Tc +
Tm
N
se Tc = 1 ns, Tm = 20 ns, N = 10
N = 100
Tce = 3 ns
Tce = 1,2 ns
CMP237
Localidade espacial
módulos de memória principal
8
0
9
1
10
2
15
7
memória
cache
linha
linha
byte
endereço de memória
CMP237
Impacto no desempenho
Medindo o impacto do hit ratio no tempo efetivo de acesso
Tc = tempo de acesso à memória cache
Tm = tempo de acesso à memória principal
Tce = tempo efetivo de acesso à memória cache, considerando efeito
dos misses
Tce = Tc + (1 – h) Tm
se
Tc = 1 ns, Tm = 20 ns
h =
0.85
0.95
0.99
1.0
então Tce = 4 ns
2 ns
1.2 ns
1 ns
CMP237
Impacto no desempenho
Tempo gasto com um cache miss, em número de instruções executadas
1º Alpha
2º Alpha
3º Alpha
340 ns / 5.0 ns = 68 clks x 2 instr.
266 ns / 3.3 ns = 80 clks x 4 instr.
180 ns / 1.7 ns = 108 clks x 6 instr.
ou
ou
ou
136 instruções
320 instruções
648 instruções
1/2 X latência x 3 X freqüência clock x 3 X instruções/clock ⇒ ≈ 5 X
CMP237
Impacto no desempenho
• Supondo um processador que executa um programa com:
– CPI = 1.1
– 50% aritm/lógica, 30% load/store, 20% desvios
• Supondo que 10% das operações de acesso a dados na memória sejam
misses e resultem numa penalidade de 50 ciclos
CPI = CPI ideal + nº médio de stalls por instrução
CPI ideal
1.1
= 1.1 ciclos + 0.30 acessos à memória / instrução
x 0.10 misses / acesso x 50 ciclos / miss
Data misses 1.5
= 1.1 ciclos + 1.5 ciclos
Instr.misses 0.5
= 2. 6
• 58 % do tempo o processador está parado esperando pela memória!
• um miss ratio de 1% no fetch de instruções resultaria na adição de 0.5
ciclos ao CPI médio
CMP237
2. Organizações de memória cache
•
•
processador gera endereço de memória e o envia à cache
cache deve
– verificar se tem cópia da posição de memória correspondente
– se tem, encontrar a posição da cache onde está esta cópia
– se não tem, trazer o conteúdo da memória principal e escolher posição
da cache onde a cópia será armazenada
•
mapeamento entre endereços de memória principal e endereços de
cache resolve estas 3 questões
– deve ser executado em hardware
•
estratégias de organização (mapeamento) da cache
– mapeamento completamente associativo
– mapeamento direto
– mapeamento set-associativo
CMP237
Mapeamento completamente associativo
endereço gerado pelo processador
miss: memória é acessada
cache
endereço
dado
comparação
simultânea
com todos
os endereços
hit
processador
memória
principal
CMP237
Mapeamento completamente associativo
endereço gerado pelo processador
word
byte
cache
endereço
comparação
simultânea
com todos
os endereços
word 0
w1
w2
w3
hit
cache organizada em linhas
com 4 palavras de 4 bytes
seleciona word e byte
processador
CMP237
Mapeamento completamente associativo
•
•
vantagem: máxima flexibilidade no posicionamento de qualquer
palavra (ou linha) da memória principal em qualquer palavra (ou
linha) da cache
desvantagens
– custo em hardware da comparação simultânea de todos os endereços
armazenados na cache
– algoritmo de substituição (em hardware) para selecionar uma linha da
cache como conseqüência de um miss
•
utilizado apenas em memórias associativas de pequeno tamanho
– tabelas
CMP237
Mapeamento direto
endereço gerado pelo processador
tag
índice
tag + índice
cache
índice
tag
dado
=?
diferentes
iguais
processador
memória
principal
CMP237
Mapeamento direto
•
endereço é dividido em 2 partes
– parte menos significativa: índice, usado como endereço na cache onde
será armazenada a palavra
– parte mais significativa: tag, armazenado na cache junto com o
conteúdo da posição de memória
•
quando acesso é feito, índice é usado para encontrar palavra na
cache
– se tag armazenado na palavra da cache é igual ao tag do endereço
procurado, então houve hit
•
endereços com mesmo índice são mapeados sempre para a mesma
palavra da cache
CMP237
Mapeamento direto
mapeamento: endereço é o módulo do número de blocos na cache
Cache
000
001
010
011
100
101
110
111
•
00001
00101
01001
01101
10001
10101
11001
11101
Memory
CMP237
Mapeamento direto – exemplo
20 bits
tag
12 bits
índice
tag + índice = 32 bits
cache = 212 = 4 K
índice
20 bits
tag
32 bits
dado
=?
diferentes
iguais
processador
memória
principal
232 = 4 G
CMP237
Mapeamento direto – uso de linhas
9
31
Cache Tag
Exemplo: 0x50
4
Cache Index
Ex: 0x01
0
Byte Select
Ex: 0x00
armazenado como
parte do “estado”
da cache
0x50
:
Cache Data
Byte 31
Byte 63
Byte 1 Byte 0 0
Byte 33 Byte 32 1
2
3
:
:
Byte 1023
:
Cache Tag
: :
Valid Bit
Byte 992 31
CMP237
Tamanho da linha x miss ratio
40%
35%
Miss rate
30%
25%
20%
15%
10%
5%
0%
4
16
256
64
Block size (bytes)
1 KB
8 KB
16 KB
64 KB
256 KB
CMP237
Tamanho da linha
• em geral, uma linha maior aproveita melhor a localidade espacial MAS
– linha maior significa maior miss penalty
• demora mais tempo para preencher a linha
– se tamanho da linha é grande demais em relação ao tamanho da cache, miss
ratio vai aumentar
• muito poucas linhas
• em geral, tempo médio de acesso =
Hit Time x (1 - Miss Ratio) + Miss Penalty x Miss Ratio
Miss
Penalty
Tempo médio
Miss
de acesso
Ratio explora localidade espacial
poucas linhas:
compromete
localidade temporal
Tamanho da linha
Tamanho da linha
Miss Penalty
& Miss Ratio
aumentam
Tamanho da linha
CMP237
Quantos bits tem a cache no total?
•
•
•
•
supondo cache com mapeamento direto, com 64 KB de dados,
linha com uma palavra, endereços de 32 bits
64 KB -> 16 Kpalavras, 214 palavras, neste caso 214 linhas
cada linha tem 32 bits de dados mais um tag (32-14-2 bits) mais
um bit de validade:
214 x (32 + 32 -14 -2 +1) = 214 x 49 = 784 x 210 = 784 Kbits
98 KB para 64 KB de dados, ou 50% a mais
CMP237
Mapeamento direto
•
vantagens
– não há necessidade de algoritmo de substituição
– hardware simples e de baixo custo
– alta velocidade de operação
•
desvantagens
– desempenho cai se acessos consecutivos são feitos a palavras com mesmo
índice
– hit ratio inferior ao de caches com mapeamento associativo
•
demonstra-se no entanto que hit ratio aumenta com o aumento da
cache, aproximando-se de caches com mapeamento associativo
– tendência atual é de uso de caches grandes
CMP237
Mapeamento conjunto – associativo
tag
índice
Cache
índice
tag
=?
não
dado tag
dado tag
=?
sim
dado
=?
sim
tag dado
=?
sim
sim
CMP237
Mapeamento conjunto – associativo
•
•
•
•
mapeamento direto: todas as palavras armazenadas na cache devem ter
índices diferentes
mapeamento associativo: linhas podem ser colocadas em qualquer
posição da cache
compromisso: um nº limitado de linhas, de mesmo índice mas diferentes
tags, podem estar na cache ao mesmo tempo (num mesmo conjunto)
nº de linhas no conjunto = associatividade
CMP237
Mapeamento conjunto – associativo
•
•
•
vantagem em relação ao mapeamento completamente associativo:
comparadores são compartilhados por todos os conjuntos
algoritmo de substituição só precisa considerar linhas dentro de um
conjunto
muito utilizado em microprocessadores
– Motorola 68040: 4-way set associative
– Intel 486: 4-way set associative
– Pentium: 2-way set associative
CMP237
Desvantagem da cache conjunto-associativo
• conjunto-associativa N-way X mapeamento direto
– dado tem atraso extra do multiplexador
– dado vem DEPOIS da decisão Hit/Miss e da seleção do conjunto
• numa cache com mapeamento direto, linha da cache está disponível
ANTES da decisão Hit/Miss
– possível assumir um hit e continuar. Recuperar depois se for miss.
Valid
Cache Tag
Cache Data
Linha 0
:
:
:
Adr Tag
Compare
Cache Index
Cache Data
Linha 0
:
Sel1 1
Mux
0 Sel0
Cache Tag
Valid
:
:
Compare
OR
Hit
Linha
CMP237
Impacto da associatividade da cache
15%
12%
Miss rate
9%
6%
3%
0%
One-way
Two-way
Four-way
Associativity
Eight-way
1 KB
16 KB
2 KB
4 KB
32 KB
64 KB
8 KB
128 KB
CMP237
Fontes de misses
• compulsórios (cold start ou chaveamento de processos, primeira
referência): primeiro accesso a uma linha
– é um “fato da vida”: não se pode fazer muito a respeito
– se o programa vai executar “bilhões” de instruções, misses compulsórios
são insignificantes
• de conflito (ou colisão)
– múltiplas linhas de memória acessando o mesmo conjunto da cache
conjunto-associativa ou mesma linha da cache com mapeamento direto
– solução 1: aumentar tamanho da cache
– solução 2: aumentar associatividade
• de capacidade
– cache não pode conter todas as linhas accessadas pelo programa
– solução: aumentar tamanho da cache
• invalidação: outro processo (p.ex. I/O) atualiza memória
CMP237
Fontes de misses
14%
misses compulsórios não aparecem
12%
misses de capacidade (parte “branca”
da curva) dependem do tamanho da
cache
Miss rate per type
10%
8%
misses de conflito: dependem da
associatividade e do tamanho da cache
6%
4%
2%
Capacity
0%
1
2
4
8
16
Cache size (KB)
32
64
128
One-way
Four-way
Two-way
Eight-way
CMP237
Quantidade de misses segundo a fonte
Mapeam. direto
Conj.-associat. N-way
Complet. associativa
Tamanho da cache
Grande
Médio
Pequeno
Misses
compulsórios
Mesmo
Mesmo
Mesmo
Alto
Médio
Zero
Misses de
capacidade
Baixo
Médio
Alto
Misses de
invalidação
Mesmo
Mesmo
Mesmo
Misses de conflito
CMP237
3. Mecanismos de fetch e escrita
•
estratégias para fetch de palavras ou linhas da memória principal
– fetch por demanda
– prefetch
•
fetch por demanda
– fetch da linha quando ocorre miss
– estratégia mais simples, não exige hardware adicional
•
prefetch
– fetch da linha antes que ela seja necessária
– p.ex: prefetch da linha i+1 quando a linha i é inicialmente referenciada
– alternativa: prefetch da linha i+1 quando ocorre miss da linha i
CMP237
Operações de escrita
•
•
•
leitura na cache não afeta conteúdo
não há discrepância entre
cache e memória principal
escrita na cache: cópias da palavra na cache e na memória principal
podem ter valores diferentes
valores deveriam ficar iguais em razão de:
– acessos de E/S feitos através da memória principal
– acessos à memória principal por múltiplos processadores
•
•
tempo médio de acesso à cache é aumentado pela necessidade de
atualizações da memória principal
mecanismos de coerência de escrita
– write-through
– write-back
CMP237
Mecanismo write-through
•
•
•
write-through: cada escrita na cache é repetida imediatamente na
memória principal
escrita adicional na memória principal aumenta tempo médio de
acesso à cache
estatisticamente apenas 5% a 34% dos acessos à memória são escritas
CMP237
Mecanismo write-through
Tempo médio de acesso à cache Tma é dado por
Tma = Tc + (1 – h) Tb + w (Tm – Tc)
onde
Tc = tempo de acesso à cache
h = hit ratio
Tb = tempo de leitura de uma linha da memória principal
Tm = tempo de acesso a uma palavra da memória principal
w = probabilidade de que acesso seja de escrita
supondo
Tc = 1 ns, Tb = Tm = 10 ns, h = 0.98, w = 0.2
Tma = 3,0 ns, sendo 0,2 ns devido a misses e 1,8 ns devido ao writethrough
CMP237
Write-Through com Write Buffer
Cache
Processador
DRAM
Write Buffer
• Write Buffer é necessário entre cache e memória principal
– processador: escreve dados na cache e no write buffer
– controlador de memória: escreve conteúdo do buffer na memória
• Write buffer é uma FIFO
– típico número de posições = 4
– funciona bem se: freqüência de escritas << 1 / ciclo escrita DRAM
• problema
– freqüência de escritas > 1 / ciclo escrita DRAM
– saturação do Write Buffer
CMP237
Saturação do Write Buffer
• freqüência de escritas > 1 / ciclo escrita DRAM
– se esta condição existe por um longo período de tempo (porque tempo de
ciclo da CPU é rápido demais e/ou ocorrem muitas instruções store em
seqüência):
• Write-Buffer terá overflow, não importa quão grande ele seja
• solução para saturação do Write Buffer
– usar cache com write-back
– instalar uma cache de segundo nível (L2)
Processador
Cache
L2
Cache
DRAM
Write Buffer
CMP237
Mecanismo write-back
•
•
write-back: linha da cache só é escrita de volta na memória principal
quando precisa ser substituída
estratégia mais simples: escrita é feita mesmo que linha não tenha sido
alterada
Tma = Tc + (1 – h) Tb + (1 – h) Tb
onde o segundo termo (1–h) Tb é devido à escrita
•
estratégia alternativa: só escrever de volta se linha foi alterada
exige um bit de tag para indicar modificações na linha
Tma = Tc + (1 – h) Tb + wb (1 – h) Tb
onde wb = probabilidade de que linha tenha sido alterada
CMP237
4. Substituição de linhas
•
•
•
•
•
quando ocorre um miss, uma nova linha precisa ser trazida da
memória principal para a cache
cache com mapeamento direto não precisa escolher qual linha da
cache será substituída
cache completamente associativa: pode-se escolher qualquer uma das
linhas
cache conjunto-associativa: deve-se escolher uma linha dentro de um
conjunto fixado pelo índice
algoritmo de substituição precisa ser implementado em hardware
CMP237
Algoritmos de substituição
substituição randômica
• escolha de uma linha ao acaso para ser substituída
• exemplo de implementação em hardware: contador
– contador é incrementado a cada ciclo do relógio
– quando substituição é necessária, escolhe-se linha cujo endereço é igual ao
valor atual do contador
– cache completamente associativa: contador de n bits se cache tem 2n
linhas
– cache conjunto-associativa: contador de 2 bits numa cache com
associatividade = 4
first-in first-out (FIFO)
• remover a linha que está há mais tempo na cache
• implementação evidente: fila de endereços de linha
CMP237
Algoritmos de substituição
LRU – Least Recently Used
• linha a ser substituída é aquela que há mais tempo não é referenciada
• implementação mais simples em hardware: contador associado a cada
linha
– quando hit ocorre, contador da linha correspondente é zerado
– demais contadores são incrementados
– linha com contador com valor mais alto é a substituída
•
outras implementações
– pilha de registradores
– matriz de referência
– métodos aproximativos
CMP237
5. Hierarquia de caches
•
•
•
caches integradas dentro de um processador têm limitação de
tamanho
miss penalty na cache é muito grande, pela diferença entre os tempos
de acesso da cache e da memória principal
solução: caches em dois ou três níveis
– cache integrada (L1, de primeiro nível) é de tamanho pequeno, p.ex. 8
Kbytes, e tempo de acesso menor
– cache secundária (L2) tem tamanho maior, p.ex. 256 Kbytes, e tempo de
acesso maior
•
processadores recentes têm cache de terceiro nível (L3)
– cache L3 fora do chip do processador, cache L2 dentro
•
•
misses podem ocorrer em referências a qualquer nível de cache
transferências entre níveis de cache apresentam mesmos problemas e
possíveis soluções já discutidos
CMP237
6. Caches de dados e instruções
•
•
dados e instruções: cache unificada x caches separadas
vantagens das caches separadas
– política de escrita só precisa ser aplicada à cache de dados
– caminhos separados entre memória principal e cada cache, permitindo
transferências simultâneas (p.ex. num pipeline)
– estratégias diferentes para cada cache: tamanho total, tamanho de linha,
organização
•
•
caches separadas são usadas na maioria dos processadores, no nível
L1
caches unificadas nos níveis L2 e L3
CMP237
Caches de dados e instruções
memória principal
cache instr.
instruções
cache dados
dados
unidade
de acesso
à memória
unidade
de fetch
de instr.
pipeline de instruções
processador
CMP237
Problemas com caches separadas
•
•
código auto-modificável
instruções e dados colocados em posições próximas de memória
duas cópias da mesma linha estarão nas duas caches
•
necessidade de controle adicional
CMP237
7. Medindo desempenho
•
desempenho da cache depende ...
–
–
–
–
–
•
da organização (mapeamento)
do tamanho da cache e das linhas
do algoritmo de substituição
dos mecanismos de escrita e de fetch
dos programas sendo executados
métodos de obtenção de estimativas de desempenho
– simulação trace-driven
– medida direta
– modelagem matemática
CMP237
Medindo desempenho
•
simulação trace-driven
– programas típicos são executados
– facilidade de trace do processador é usada para interromper após cada
instrução e registrar endereços de memória gerados pela instrução
– registro é utilizado numa simulação
– exige-se simulação de grande nº de instruções ( > 1 M )
•
medida direta
– hardware de monitoração permite coleta das referências à memória
– registro é então utilizado na simulação
– vantagem: todas as referências são coletadas, mesmo aquelas executadas
por trechos protegidos de código
CMP237