Aula 13: Memória Cache Diego Passos Universidade Federal Fluminense Fundamentos de Arquiteturas de Computadores Diego Passos (UFF) Memória: Memória Cache FAC 1 / 53
Memória Cache Diego Passos (UFF) Memória: Memória Cache FAC 2 / 53
Motivação: Diferença de Velocidade Processador precisa ler e escrever dados na memória principal Mas, tipicamente, o processador é muito mais rápido que a MP Exemplo (em um computador hipotético): Em uma soma, tempo de leitura dos operandos a partir da memória de 60 ns Uma vez nos registradores, o tempo efetivo de soma é 0,3 ns Processador precisa aguardar enquanto dados são carregados Tempo chamado de wait state Diego Passos (UFF) Memória: Memória Cache FAC 3 / 53
Motivação: Princípio da Localidade Na década de 1960, pesquisadores começaram a estudar a execução de programas Especialmente, os padrões de acesso à memória Notaram que o acesso à memória não é totalmente aleatório Quando um determinado endereço é acessado, há maior probabilidade de acesso à endereços próximos Princípio da Localidade Em inglês, chamado de locality of reference ou principle of locality Foram notados dois tipos de localidade distintos: A localidade espacial E a localidade temporal Diego Passos (UFF) Memória: Memória Cache FAC 4 / 53
Motivação: Localidade Espacial Princípio da localidade espacial: Se um endereço x é acessado, é provável que endereços x + 1, x + 2, x + 3, também sejam em um futuro próximo Este princípio se aplica à execução de programas por dois motivos principais: A organização do código executável em memória A existência de estruturas de dados na forma de coleções de itens Diego Passos (UFF) Memória: Memória Cache FAC 5 / 53
Motivação: Localidade Espacial (II) MP Organização do código executável: Instruções são ordenadas sequencialmente Leia um operando da memória Leia outro operando da memória Some os dois valores Processador busca instruções uma após a outra na memória Exceções: Repetições, condicionais e chamadas de funções Parte 1 do Programa A{ Outro Programa Call sub-rotina 1 Executado em Sequência Parte 2 Loop 1 Loop 2 Sub-rotina 1 Diego Passos (UFF) Memória: Memória Cache FAC 6 / 53
Motivação: Localidade Espacial (III) MP Outras Variáveis Coleções: Exemplo mais comum são os vetores Elementos tipicamente organizados sequencialmente É comum percorrer os elementos nesta sequência eg, em repetições a[0] a[1] a[2] a[3] Diego Passos (UFF) Memória: Memória Cache FAC 7 / 53
Motivação: Localidade Temporal Princípio da localidade temporal: Se um endereço x é acessado, é provável que ele seja acessado novamente num futuro próximo Este princípio se aplica à execução de programas por três motivos principais: A existência de variáveis que são lidas/modificadas frequentemente em uma mesma região do código A existência de repetições com variáveis acumuladoras A existência de repetições que executam as mesmas instruções várias vezes seguidas int a, b, c; a = 0; b = alguma_funcao(c); if (b < 3) a = c % 10; if (a > 1) a--; a = outra_funcao(a); int a[10], b = 0, i; for (i = 0; i < 10; i++) a[i] = i; for (i = 1; i < 10; i++) b += a[i-1] * i + a[i]; Diego Passos (UFF) Memória: Memória Cache FAC 8 / 53
Motivação: O Princípio da Cache O termo cache é usado em vários contextos em computação Cache de um browser Cache de arquivos em memória Memória cache Em todos estes contextos, a ideia é armazenar informações de interesse em um local de acesso mais rápido É impossível armazenar tudo Mas se algo é encontrado na cache, ganhamos em desempenho Note que a consulta à cache consome algum tempo Mas supõe-se que esse tempo é pequeno em relação ao ganho que ocorre quando achamos o dado Diego Passos (UFF) Memória: Memória Cache FAC 9 / 53
Funcionamento da Memória Cache A memória cache explora o princípio da localidade Tanto temporal, quanto espacial Ela é uma memória relativamente pequena, mas bastante rápida Toda vez que o processador tenta acessar uma posição de memória, ele primeiro verifica a existência do dado na cache Quando um dado é acessado na MP, ele é armazenado na cache Princípio da localidade temporal: ele poderá ser usado novamente em breve Além do dado em si, armazena-se um bloco de dados próximos Princípio da localidade espacial: dados próximos podem ser usados em breve Diego Passos (UFF) Memória: Memória Cache FAC 10 / 53
Operação de Leitura com Memória Cache A existência da memória cache altera o processo de leitura de dados da MP Quando a UCP deseja ler uma posição de memória, os seguintes eventos ocorrem: Processador escreve o endereço a ser lido no BE de acesso à MP Controlador da cache intercepta pedido e verifica se o dado está em cache Se sim, temos um acerto (hit): dado é copiado para o processador Se não, temos um falta (miss): cache pede o dado à MP, o armazena e repassa para a UCP Note que, no caso de um miss, cache solicita um bloco inteiro à MP Conjunto de dados maior que o dado a ser lido Diego Passos (UFF) Memória: Memória Cache FAC 11 / 53
Arquitetura com Memória Cache Possível arquitetura com a presença da memória cache Processador MP BE BE BD Cache BD BC BC Diego Passos (UFF) Memória: Memória Cache FAC 12 / 53
Desempenho com Memória Cache O objetivo de inserirmos a memória cache na hierarquia é reduzir o tempo de acesso à memória O objetivo é alcançado? Isso depende de vários fatores: O tempo de acesso quando há um hit O tempo de acesso quando há um miss E a eficiência da cache Define-se a eficiência de uma memória cache como o percentual de hits: E c = 100 hits acessos Eficiência varia com uma série de fatores, incluindo o programa em execução Mas espera-se algo em torno de 95% a 98% Diego Passos (UFF) Memória: Memória Cache FAC 13 / 53
Estrutura de uma Memória Cache Cache Memória Principal Linha 0 Linha 1 Linha 2 Linha 3 Linha 4 Linha 5 Tag Dados { Célula 0 Célula 1 Célula X 0 1 2 3 4 M bits } Bloco de X Células Linha (n-1) Linha n A memória cache é organizada em linhas Cada linha contém X células E um campo tag Diego Passos (UFF) Memória: Memória Cache FAC 14 / 53
Estrutura de uma Memória Cache Cache Memória Principal Linha 0 Linha 1 Linha 2 Linha 3 Linha 4 Linha 5 Tag Dados { Célula 0 Célula 1 Célula X 0 1 2 3 4 M bits } Bloco de X Células Linha (n-1) Linha n Células em uma linha representam células sequenciais na MP Um bloco Quando um dado é copiado da MP para a cache, todo o seu bloco é trazido juntamente Diego Passos (UFF) Memória: Memória Cache FAC 14 / 53
Estrutura de uma Memória Cache Cache Memória Principal Linha 0 Linha 1 Linha 2 Linha 3 Linha 4 Linha 5 Tag Dados { Célula 0 Célula 1 Célula X 0 1 2 3 4 M bits } Bloco de X Células Linha (n-1) Linha n Há ainda o campo tag Indica, de alguma forma, o endereço do bloco na MP Lembre-se: a MP é muito maior que a cache Diego Passos (UFF) Memória: Memória Cache FAC 14 / 53
Memória Cache vs MP A memória cache é muito menor que a MP Não podemos guardar todos o conteúdo da MP na cache Em outras palavras, só podemos armazenar um subconjunto dos blocos da MP Por isso, algumas questões fundamentais: Quais blocos manter na cache? Como determinar se um dado está em cache de forma eficiente? O que fazer quando um dado em cache é alterado? Diego Passos (UFF) Memória: Memória Cache FAC 15 / 53
O Problema do Mapeamento Diego Passos (UFF) Memória: Memória Cache FAC 16 / 53
O Problema do Mapeamento Vamos começar pela segunda questão: Como determinar se um dado está em cache? Como a cache guarda um subconjunto pequeno dos blocos da MP, a primeira tarefa é determinar se o dado está na cache Sabemos que o campo tag é usado para, de alguma forma, indicar o campo de endereço do bloco na MP Busca tem que ser eficiente Caso contrário, tempo de acesso à cache fica alto Diego Passos (UFF) Memória: Memória Cache FAC 17 / 53
Uma Primeira Ideia Se usarmos o campo tag para armazenar o endereço na MP da primeira célula do bloco, podemos fazer uma busca sequencial: Começamos pela primeira linha da cache Verificamos se o endereço a ser acessado é maior ou igual a tag e menor que tag + X Se sim, achamos o dado Se não, continuamos na próxima linha Se não há mais linhas, dado não está na cache Algum problema? Diego Passos (UFF) Memória: Memória Cache FAC 18 / 53
Uma Primeira Ideia (II) Sim! Por mais que o acesso à memória cache seja rápido, temos (potencialmente) que ler todas as tags para um único acesso a memória Caches pequenas hoje têm centenas de linhas Tempo efetivo de acesso à cache seria impraticável Conclusão: Precisamos de um método de busca mais eficiente Diego Passos (UFF) Memória: Memória Cache FAC 19 / 53
Tipos de Mapeamento Na prática, problema da busca em cache é resolvido através de tipos de mapeamento Maneiras de se determinar em qual linha da cache cada bloco da MP pode ser inserido Há três tipos de mapeamento: O mapeamento direto O mapeamento associativo O mapeamento associativo por conjunto Diego Passos (UFF) Memória: Memória Cache FAC 20 / 53
Mapeamento Direto O mapeamento direto é a solução mais simples Divide-se a MP em blocos de X células X é o tamanho de uma linha da cache Blocos são numerados de 0 a B-1 B é o número de blocos Logo, a MP tem B X células Se a cache tem L linhas, o k-ésimo bloco da MP só pode ser armazenado na linha (k mod L) ie, o resto da divisão de k por L Diego Passos (UFF) Memória: Memória Cache FAC 21 / 53
Mapeamento Direto (II) Este esquema resulta no seguinte tipo de mapeamento: Bloco 0 linha 0 Bloco 1 linha 1 Bloco L-1 linha L-1 Bloco L linha 0 Bloco L+1 linha 1 Ou de outra forma: Blocos 0, L, 2L, 3L, são mapeados para a linha 0 Blocos 1, L+1 2L+1, 3L+1, são mapeados para a linha 1 Blocos 2, L+2 2L+2, 3L+2, são mapeados para a linha 2 Blocos L-1, L+(L-1), 2L+(L-1), 3L+(L-1), são mapeados para a linha L-1 Diego Passos (UFF) Memória: Memória Cache FAC 22 / 53
Mapeamento Direto: Exemplo Linha 0 Linha 1 Linha 2 Linha 3 Tag Célula 0 Célula 1 Bloco 0 { Bloco 1 { Bloco 2 { Bloco 3 { Bloco 4 { Bloco 5 Bloco 6 Bloco 7 { { { 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 M bits Diego Passos (UFF) Memória: Memória Cache FAC 23 / 53
Mapeamento Direto: Endereços É fácil calcular para qual linha um bloco de memória deve ser mapeado Mas dado um endereço, digamos E, que queremos acessar, como determinar se ele está na cache? Note que o endereço E pertence ao bloco b = E div X Por sua vez, se este b estiver na cache, certamente estará na linha l = b mod L Neste caso, ele estará na célula c = E mod X Se X e L são potências de 2, podemos facilmente determinar l olhando para os bits de E: Se X = 2 i e L = 2 j : Com endereço de 4 bits, E = 1011 (10),? l c X = 2 e L = 4: { E i+j E i+j-1 { E i { E i-1 E 1 E 0 E = 1 0 1 1 c = 1 l = 1? = 1 Diego Passos (UFF) Memória: Memória Cache FAC 24 / 53
Mapeamento Direto: Endereços (II) Mas ainda há um problema: como saber se o bloco que está na cache é o do endereço E ou algum outro bloco alocado para a mesma linha? eg, no exemplo anterior, o endereço 3 resultaria nos mesmos valores de c e l Como diferenciar? A resposta está no campo tag Dois ou mais endereços podem resultar nos mesmos c e l por terem o mesmo sufixo Mas seus prefixos serão diferentes Matematicamente, o prefixo pode ser definido como ((E div X) div L) Se X e L são potências de 2, basta olhar para os bits mais à esquerda do endereço Note ainda que duas células do mesmo bloco têm o mesmo prefixo Se guardarmos o prefixo no campo tag, poderemos discernir entre endereços de dois blocos diferentes Diego Passos (UFF) Memória: Memória Cache FAC 25 / 53
Mapeamento Direto: Acesso Em resumo, quando o processador tenta acessar um endereço de memória E: Identifica-se a linha que pode conter o endereço Compara-se o prefixo do endereço com o campo tag da linha Se o valor bate, cache hit Senão, cache miss Determina-se o bloco ao qual pertence o endereço Todo o bloco é trazido para a cache, na linha adequada Diego Passos (UFF) Memória: Memória Cache FAC 26 / 53
Mapeamento Direto: Endereços (Exemplo) Linha 0 Linha 1 Linha 2 Linha 3 Tag Célula 0 Célula 1 1 1 1 0 Exemplos de Busca na Cache: E = 11 = E = 14 = 1 1 0 1 (Cache hit) 1 1 (Cache miss) 1 0 c = 1 l = 1 tag = 1 c = 0 l = 3 tag = 1 Bloco 0 { Bloco 1 { Bloco 2 { Bloco 3 { Bloco 4 { Bloco 5 Bloco 6 Bloco 7 { { { 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 M bits Diego Passos (UFF) Memória: Memória Cache FAC 27 / 53
Mapeamento Direto: Vantagens e Desvantagens O mapeamento direto é de fácil implementação Principalmente se X e L forem potências de 2 Basta olhar para conjuntos de bits do endereço para determinar se o dado está em cache Mas ele traz uma potencial ineficiência: Blocos são sempre colocados na mesma linha Se acessamos sucessivamente endereços de blocos diferentes mapeados para a mesma linha, sempre haverá cache miss Diego Passos (UFF) Memória: Memória Cache FAC 28 / 53
O Mapeamento Associativo O grande problema do mapeamento direto é o fato de um bloco ter que ser colocado sempre na mesma linha Determinados conjuntos de blocos nunca podem estar simultaneamente em cache Mesmo que eles sejam os únicos acessados O ideal seria que pudéssemos mapear cada bloco da MP para qualquer linha da cache Neste caso, poderíamos ter qualquer conjunto de blocos em cache Limitado apenas pelo número de linhas disponíveis Diego Passos (UFF) Memória: Memória Cache FAC 29 / 53
O Mapeamento Associativo (II) Já tentamos fazer este mapeamento sem restrição Nossa primeira abordagem Não funcionava por requerer a comparação sequencial das tags com o endereço a ser acessado Mas e se pudéssemos fazer a comparação das tags em paralelo? ie, comparar todas as tags na cache ao endereço ao mesmo tempo Neste caso, determinar se um dado está em cache seria tão rápido quanto no mapeamento direto Diego Passos (UFF) Memória: Memória Cache FAC 30 / 53
O Mapeamento Associativo (III) De fato, esta comparação em paralelo é possível em hardware Cada linha da cache estaria ligada a um circuito comparador cuja entrada seria o endereço a ser acessado As saídas dos comparadores seriam combinadas através de uma função lógica OU Se uma das linhas tivesse a tag adequada, a saída seria verdadeira Este tipo de solução recebe o nome de mapeamento associativo Diego Passos (UFF) Memória: Memória Cache FAC 31 / 53
O Mapeamento Associativo: Endereços No mapeamento associativo, o campo tag corresponde ao número do bloco correspondente na MP Dado um endereço E a ser acessado, podemos obter o número do seu bloco computando b = E div X E, dentro do bloco, sua célula será c = E mod X Particularmente, se X é potência de 2: X = 2 i : b (demais bits) c (i bits) { E i { E i-1 E 1 E 0 Diego Passos (UFF) Memória: Memória Cache FAC 32 / 53
O Mapeamento Associativo: Vantagens e Desvantagens O grande benefício do mapeamento associativo é flexibilizar a alocação de blocos em linhas da cache Podemos ter blocos em quaisquer linhas O que tende a aumentar a taxa de cache hit Como desvantagem, temos a maior complexidade do circuito da cache Principalmente em termos econômicos Cache associativa é mais cara que a cache com mapeamento direto Principalmente para caches grandes Diego Passos (UFF) Memória: Memória Cache FAC 33 / 53
O Mapeamento Associativo por Conjunto O mapeamento direto é simples, mas não tão eficiente O mapeamento associativo é complexo, caro, mas muito eficiente A pergunta é: será que não há um meio termo? Sim, o mapeamento associativo por conjunto A cache é dividida em N conjuntos de linhas Assim como no mapeamento direto, cada bloco da MP tem um mapeamento fixo para um conjunto específico Mas dentro do seu conjunto, bloco pode ser armazenado em qualquer linha Como no mapeamento associativo Diego Passos (UFF) Memória: Memória Cache FAC 34 / 53
{ { O Mapeamento Associativo por Conjunto: Exemplo Linha 0 Linha 1 Linha 2 Linha 3 Tag Célula 0 Célula 1 Mapeamento de Endereços Conjunto 0 Conjunto 1 0000 0001 0100 0101 1000 1001 1100 1101 0010 0011 0110 0111 1010 1011 1110 1111 Conjunto 0 Conjunto 1 Bloco 0 { Bloco 1 { Bloco 2 { Bloco 3 { Bloco 4 { Bloco 5 Bloco 6 Bloco 7 { { { 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 M bits Diego Passos (UFF) Memória: Memória Cache FAC 35 / 53
Mapeamento Associativo por Conjunto: Endereços Dado um endereço E da MP, como sabemos se o dado está na cache? Como no mapeamento direto, endereço é dividido em três partes: Célula do endereço dentro do bloco: dado por c = E mod X Número do conjunto: dado por n = (E div X) mod N Tag (para diferenciar dois blocos em um mesmo conjunto), dada por: t = (E div X) div N Se X e N são potências de 2, estes cálculos são triviais: Se X = 2 i e N = 2 j : Com endereço de 4 bits, E = 1011 (10), t n c X = 2 e N = 2: { { E i+j E i+j-1 E i { E i-1 E 1 E 0 E = 1 0 1 1 c = 1 n = 1 t = 2 Diego Passos (UFF) Memória: Memória Cache FAC 36 / 53
Nível de Associatividade O mapeamento direto pode ser visto como um caso especial do mapeamento associativo por conjunto Cada conjunto possui uma única linha O mapeamento associativo também Um único conjunto O mapeamento associativo por conjunto, portanto, permite balancear os dois aspectos: Complexidade vs desempenho Diego Passos (UFF) Memória: Memória Cache FAC 37 / 53
Nível de Associatividade (II) Diego Passos (UFF) Memória: Memória Cache FAC 38 / 53
O Problema da Substituição de Bloco Diego Passos (UFF) Memória: Memória Cache FAC 39 / 53
O Problema da Substituição de Bloco Quando há um cache miss, além de delegar o acesso ao dado à MP, a cache também traz todo o bloco e o armazena Princípios da localidade temporal e espacial Mas geralmente não há uma linha vazia para o novo bloco Ao contrário, outro bloco tem que ser removido Nova pergunta: qual bloco remover? Diego Passos (UFF) Memória: Memória Cache FAC 40 / 53
O Problema da Substituição de Bloco (II) Para o mapeamento direto, a escolha é trivial Só há uma opção, porque cada bloco tem uma alocação fixa de linhas na cache Para os mapeamentos associativos (totalmente ou por conjuntos), a escolha é mais difícil Há várias opções de blocos a substituir Se pudéssemos adivinhar o futuro, faríamos a melhor escolha possível Bloco que vai demorar mais tempo para ser usado Diego Passos (UFF) Memória: Memória Cache FAC 41 / 53
O Problema da Substituição de Bloco (III) Embora não possamos adivinhar o futuro, podemos prevê-lo ou projetá-lo Usar informações passadas para tentar inferir o que acontecerá no futuro Duas abordagens neste sentido: Algoritmo FIFO (First In, First Out) Dentre os blocos candidatos, escolhe para substituição aquele colocado há mais tempo na cache Algoritmo LRU (Least Recently Used) Dentre os blocos candidatos, escolhe para substituição aquele cujo último acesso foi a mais tempo Diego Passos (UFF) Memória: Memória Cache FAC 42 / 53
O Problema da Substituição de Bloco (IV) Note que tanto o FIFO quanto o LRU necessitam do armazenamento de informações sobre os blocos na cache Quando foi colocado lá Qual foi a última utilização Ou seja, eles precisam de bookkeeping Torna a cache mais complexa e cara Há uma outra alternativa: Escolher para remoção um bloco aleatório Mais fácil e barato de implementar Desempenho razoável, muito próximo do LRU para alta associatividade Diego Passos (UFF) Memória: Memória Cache FAC 43 / 53
O Problema da Escrita Diego Passos (UFF) Memória: Memória Cache FAC 44 / 53
O Problema da Escrita Caches funcionam muito bem quando o processador precisa ler dados da memória Mas e quando é necessário escrever? Alterar o valor em uma determinada posição de memória A operação de escrita traz o seguinte dilema Devemos sempre atualizar os valores na MP para manter a consistência dos dados? [Write Through] Ou devemos fazer atualizações só na cache enquanto o bloco estiver lá? [Write Back] Diego Passos (UFF) Memória: Memória Cache FAC 45 / 53
O Problema da Escrita: Write Through Na técnica de Write Through, sempre que o processador atualiza uma posição de memória, o dado é atualizado tanto na cache, quanto na MP Mantém a consistência dos dados da cache e da MP ie, MP não tem dados com valores diferentes daqueles na cache Isso é bom porque: Simplifica substituição de bloco na cache Alguns dispositivos de E/S podem ler diretamente da MP, sem passar pela cache Por outro lado, escritas à memória são sempre lentas Sempre precisam ir à MP Diego Passos (UFF) Memória: Memória Cache FAC 46 / 53
O Problema da Escrita: Write Back Nesta técnica, escritas são sempre feitas em cache Apenas quando bloco é removido da cache, conteúdo é atualizado na MP Normalmente, há um bit chamado dirty que acusa se o bloco precisa ou não ser atualizado na MP Assim como as leituras, escritas também são tipicamente rápidas por acessar apenas a cache Por outro lado: Dispositivos de E/S que acessariam diretamente a memória precisam passar pela cache Isso pode sobrecarregá-la Há ainda a questão de como lidar com vários processadores/núcleos, cada um com sua própria cache Diego Passos (UFF) Memória: Memória Cache FAC 47 / 53
O Problema da Escrita: Write Once Outra técnica é o Write Once Apropriada para sistemas multiprocessados Na primeira escrita, a cache executa um Write Through Dado é atualizado na MP Outros componentes são avisados de que dado foi atualizado A partir da segunda escrita, cache simplesmente notifica outros componentes (eg, outros processadores) de que há alterações Outros componentes, ao precisar do dado, passam a requisitá-lo à cache com a versão atualizada Diego Passos (UFF) Memória: Memória Cache FAC 48 / 53
Outros Fatores Diego Passos (UFF) Memória: Memória Cache FAC 49 / 53
Níveis de Cache Computadores modernos geralmente têm vários níveis de cache eg, cache L1, L2 e L3 Os níveis mais baixos correspondem a caches pequenas e rápidas Quanto mais alto o nível, mais lenta é a cache, mas também maior Embora ainda muito mais rápidas e menores que a MP A justificativa dos vários níveis é a mesma para a existência da cache em primeiro lugar Se um nível é muito mais rápido que os níveis acima e conseguimos boas taxas de cache hit, então há ganho de desempenho Diego Passos (UFF) Memória: Memória Cache FAC 50 / 53
Bits de Controle Além do campo tag associado a cada linha e dos dados, uma cache pode armazenar certos bits de controle Um deles já foi citado antes: o bit dirty Indica que conteúdo do bloco foi alterado e precisa ser atualizado na MP Outro bit comum é o de validade Indica se o conteúdo de uma linha da cache é válido Conteúdo pode ser inválido, por exemplo, quando o processador é ligado Diego Passos (UFF) Memória: Memória Cache FAC 51 / 53
Tamanho da Cache e Largura de Linha Obviamente queremos sempre a maior cache possível Mas caches muito grandes não são viáveis Tamanhos típicos giram em torno de: Dezenas de KB na L1 Centenas de KB na L2 Alguns poucos MB na L3 Uma questão interessante é como alocar a memória disponível ie, qual a largura das linhas da cache Linhas maiores favorecem a localidade espacial Mas com linhas menores, podemos ter mais linhas Favorece situações em que os acessos são mais distribuídos Diego Passos (UFF) Memória: Memória Cache FAC 52 / 53
Exercício Suponha um computador com 4 GiB de memória RAM Memória é endereçada em células de 1 byte Cache possui linhas com 32 células cada (além do campo tag) No total, a cache possui 1024 linhas Determine o formato dos endereços de memória (eg, tag, coluna, etc) nos seguintes tipos de mapeamento: Mapeamento direto Mapeamento associativo Mapeamento associativo por conjunto com 16 conjuntos (com o mesmo número de linhas cada) Diego Passos (UFF) Memória: Memória Cache FAC 53 / 53