Memórias Cache Memória
Organização da cache de memória Funcionamento: CPU regs controlo da cache memória cache Memória central CPU referencia memória Se está em cache acede à cache Senão acede à memória e actualiza cache Arquitectura de Computadores (2008/2009): Memória 491
Organização da cache É necessário manter informação sobre o que está na cache Que zonas da cache estão realmente em uso? De inicio a cache está vazia! Manter que endereços/blocos da memória central estão na cache A consulta e actualização desta informação tem de ser eficiente!!! Arquitectura de Computadores (2008/2009): Memória 492
Endereços e blocos de memória Exemplo: endereços de 8 bits blocos de 8 bytes Dado um endereço E: E/8 = número do bloco E%8 = byte dentro do bloco (começando em zero) ou seja: 8 bytes por bloco = 2 3 3 bits Os 3 bits menos significativos indicam bytes dentro do mesmo bloco Os restantes correspondem ao número do bloco núm. bloco deslocamento no bloco 0 = 00000000 1 = 00000001 2 = 00000010 3 = 00000011 4 = 00000100 5 = 00000101 6 = 00000110 7 = 00000111 8 = 00001000 9 = 00001001 10= 00001010 11= 00001011 12= 00001100 13= 00001101 14= 00001110 15= 00001111 16= 00010000 17= 00010001 18= 00010010 19= 00010011 20= 00010100 21= 00010101 22= 00010110 23= 00010111 24= 00011000 25= 00011001... bloco 0 bloco 1 bloco 2 bloco 3 Arquitectura de Computadores (2008/2009): Memória 493
Exemplo A cache tem para cada bloco, se está ocupado () ou não e o respectivo número de bloco, quando ocupado 1 linha da cache (ou bloco) núm.bloco núm.bloco Bloco na cache Bloco na cache núm.bloco núm.bloco Bloco na cache Bloco na cache Para cada acesso do CPU à memória, parte-se o endereço de acordo com o tamanho do bloco e procura-se o seu número na cache Depois usam-se os bits de deslocamento no bloco para aceder ao byte pretendido só é possível se a procura for rápida! Arquitectura de Computadores (2008/2009): Memória 494
Memória associativa Memória interrogável pelo conteúdo Exemplo com 4 entradas valor a procurar 110011 entrada 0 entrada 1 entrada 2 110011 comparadores entrada 3 hit na entrada 1 Compara em paralelo com todas as entradas Arquitectura de Computadores (2008/2009): Memória 495
Cache associativa pura Usa o número do bloco como chave (ou tag) na memória associativa para procurar o bloco na cache Comparação com todas as entradas em simultâneo Endereço número do bloco ou tag núm.bloco Bloco na cache núm.bloco Bloco na cache núm.bloco Bloco na cache núm.bloco Bloco na cache memória associativa Deslocamento no bloco Arquitectura de Computadores (2008/2009): Memória 496
Caches associativas As caches associativas são muito eficientes: Qualquer bloco pode estar em qualquer posição A pesquisa do bloco faz-se em paralelo, com tantos comparadores quantos os blocos que cabem na cache Mas são muito complexas/caras Cada linha da cache deve guardar os bits do número do bloco carregado nessa posição Cada comparador é de tantos bits quantos os bits no número do bloco Muitos comparadores (um para cada linha da cache) Arquitectura de Computadores (2008/2009): Memória 497
Tentar não usar memória associativa Fixamos a posição na cache para cada bloco Exemplo: Cache com 4 linhas de blocos de 8 bytes O número da linha é dado pelo núm.bloco%núm.linhas Ou seja, por 2 bits do endereço: linha 0 linha 1 linha 2 linha 3 Bloco 0, 4, 8, Bloco 1, 5, 9, Bloco 2, 6, 10, Bloco 3, 7, 11, 0 = 00000000 1 = 00000001 2 = 00000010 3 = 00000011 4 = 00000100 5 = 00000101 6 = 00000110 7 = 00000111 8 = 00001000 9 = 00001001 10= 00001010 11= 00001011 12= 00001100 13= 00001101 14= 00001110 15= 00001111 16= 00010000 17= 00010001 18= 00010010 19= 00010011 20= 00010100 21= 00010101 22= 00010110 23= 00010111 24= 00011000 25= 00011001... bloco 0 bloco 1 bloco 2 bloco 3 Arquitectura de Computadores (2008/2009): Memória 498
Cache de mapa directo É ainda necessário manter para cada linha uma chave (ou tag) que identifique qual o bloco realmente na cache de entre os vários possíveis O que distingue os vários blocos são os bits mais significativos restantes do endereço Exemplo: endereços de 8 bits, cache de 4 linhas e 8 bytes por bloco chave núm.linha desl.no bloco linha 0 linha 1 linha 2 linha 3 chave chave chave chave Bloco na cache Bloco na cache Bloco na cache Bloco na cache Arquitectura de Computadores (2008/2009): Memória 499
Resumo: Tratamento do endereço Endereço Deslocamento no bloco Dimensão do bloco (em bytes) núm. bloco Linha na cache Nº de linhas chave (tag) Em binário, estas operações correspondem a separar os bits do endereço em 3 partes, de acordo com cada dimensão: Endereço: chave núm.linha desl.no bloco Arquitectura de Computadores (2008/2009): Memória 500
Vantagens da Cache de mapa directo São eficientes na pesquisa em cache Porque usam bits do endereço directamente como índice no mapa da cache, só precisando de comparar essa chave As caches de mapa directo são mais baratas do que as associativas: O mapa da cache tem menos bits Não necessita de memória associativa (só precisam de 1 comparador, de tantos bits quantos os na chave dos blocos) Arquitectura de Computadores (2008/2009): Memória 501
Desvantagems da Cache de mapa directo Levam a colisões: todos os blocos com a mesma linha atribuída colidem nessa posição mesmo que existam outras linhas livres! A probabilidade de colisões diminui à medida que se aumenta a Capacidade da Cache mas o problema mantém-se Arquitectura de Computadores (2008/2009): Memória 502
Cache associativa por grupos Solução híbrida de compromisso Procura-se responder às desvantagens das duas técnicas anteriores: Ter menos comparadores que associativa pura Evitar as colisões no mapa directo Abordagem: Cada "linha" dá lugar a um grupo (conjunto) de blocos Cada bloco pode ficar em qualquer posição dentro do grupo A busca no grupo é efectuada procurando a chave do bloco usando memória associativa Arquitectura de Computadores (2008/2009): Memória 503
Cache associativa por grupos Os blocos de memória são mapeados directamente num grupo da cache O número do grupo é dado pelo: núm.bloco%núm.grupos Dentro do grupo pode ficar em qualquer posição, como se o grupo fosse uma "mini cache associativa pura" grupo 0 chave chave bloco bloco grupo 1 chave chave bloco bloco memórias associativas (partilham os comparadores pois só um grupo é procurado de cada vez) Arquitectura de Computadores (2008/2009): Memória 504
Cache associativa por grupos Exemplo (endereço de 8 bits): Cache com 2 grupos 4 blocos de 8 bytes (2 por grupo) O núm. do grupo é dado pelo núm.bloco%núm.grupos Ou seja, por 1 bit do endereço: grupo 0 grupo 1 chave núm.grupo desl.no bloco chave chave chave chave Arquitectura de Computadores (2008/2009): Memória blocos 0,2,4, blocos 1,3,5, 0 = 00000000 1 = 00000001 2 = 00000010 3 = 00000011 4 = 00000100 5 = 00000101 6 = 00000110 7 = 00000111 8 = 00001000 9 = 00001001 10= 00001010 11= 00001011 12= 00001100 13= 00001101 14= 00001110 15= 00001111 16= 00010000 17= 00010001 18= 00010010 19= 00010011 20= 00010100 21= 00010101 22= 00010110 23= 00010111 24= 00011000 25= 00011001... bloco 0 bloco 1 bloco 2 bloco 3 505
Política de escrita nas caches Quando o CPU altera o conteúdo da posição de memória E de determinada memória, faz sentido que a alteração seja feita na sua cache; a ideia é que o CPU pode vir a ler esse valor em breve. O que acontece depois tem a ver com a política de escrita: Write-through Write-back (delayed) Arquitectura de Computadores (2008/2009): Memória 506
Write-through A memória cache e a memória central são actualizadas em cada escrita Assegura que a cache e a memória central estão sempre coerentes É lento porque cada escrita demora o tempo de escrita na memória central (não demora o tempo de acesso à cache) Tolerável, porque normalmente há muito mais acessos em leitura do que em escrita (L-1) escrita cache (L) Memória (L+1) Arquitectura de Computadores (2008/2009): Memória 507
Write-back Quando há uma escrita só é actualizada a cache; mas marca-se esse bloco como alterado (dirty) Só quando um bloco é removido da cache é que se actualiza o bloco na memória central (se necessário) (L-1) escrita cache (L) bloco alterado Memória (L+1) É mais rápido do que o write-through Diminui o tráfego para a memória central O inconveniente é que a cache e a memória central nem sempre estão coerentes isto pode provocar problemas valor antigo Arquitectura de Computadores (2008/2009): Memória 508
Politica de substituição de blocos Se Cache miss - é preciso arranjar espaço para o novo bloco. Se cache cheia, qual o bloco a ser eliminado da cache? O bloco que no futuro vai ser menos necessário. Mas qual é esse? LRU Least Recently Used eliminar o bloco que foi referenciado à mais tempo LFU Least Frequently Used eliminar o bloco que foi referenciado menos vezes FIFO First In First Out eliminar o bloco mais antigo Aleatório escolhe-se um bloco de forma aleatória Arquitectura de Computadores (2008/2009): Memória 509
Hierarquia de cache do Intel Pentium Registos (L0) Cache L1 dados 16 KB Linhas de 32B 4 linhas/grupo Write-through Cache L1 instruções 16 KB Linhas de 32B 4linhas/grupo L2 Unificada 128KB -2 MB 4 linhas/grupo Write-back Linhas de 32B Memória Central Até 4GB Chip do CPU 5ns 10ns 50ns Exemplo de Cache L2 de 256KB = 2048grupos*4linhas/grupo*32B/linha Endereço: 31 16 15 5 4 0 16 bits para a chave (tag) 11 bits para escolher o grupo 5 bits para o desloc. na linha Arquitectura de Computadores (2008/2009): Memória 510
Exemplo: mov eax,[393282] Tratamento na L2 do endereço: 393282 Em binário: 0000 0000 0000 0110 0000 0000 0100 0010 Dividindo o endereço de acordo com a cache L2: 0000000000000110 00000000010 00010 Deve procurar no grupo 2 tag = 6 se encontrar lê a partir do byte 2 grupo 0 grupo 1 v v v v v v v v tag tag tag tag tag tag tag tag 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 31 31 31 31 31 31 31 31 grupo 2 v v v v tag 0 1 2 3 4 5 tag 6 0 1 2 3 4 5 tag 0 1 2 3 4 5 tag 0 1 2 3 4 5 31 31 31 31 Arquitectura de Computadores (2008/2009): Memória 511
Impacto do tamanho da cache no hit-rate Arquitectura de Computadores (2008/2009): Memória 512
Quando falha a cache (miss) Existem falhas (misses) quando as localidades não se verificam: Muda o conjunto de instruções em execução (workingset): devido a jumps, calls, Ou este conjunto não cabe todo na cache Por acesso a dados não contíguos em memória Ou estruturas que não cabem na cache O SO troca de programa em execução Mudou de código e de dados Arquitectura de Computadores (2008/2009): Memória 513