Prévia do material em texto
Organização e Arquitetura de Computadores Aula 8 – Memória Cache Prof. Guilherme Galante Relembrando... vo la ti le n o n -v o la ti le Ambrosini, Diego. (2015). Persistent-memory awareness in operating systems. 10.13140/RG.2.1.4761.4483. TAPES Relembrando... ● Princípio da localidade: – Um programa acessa uma porção relativamente pequena do espaço endereçável em um instante qualquer ● Localidade temporal: – Se um item é referenciado, ele tenderá a ser referenciado novamente – Exemplo: loops ( instruções e dados) ● Localidade Espacial: – Se um item é referenciado, itens cujos endereços são próximos a este, tenderão a ser referenciados também – Exemplo: Acesso a dados de um vetor Relembrando... Enquanto o desempenho dos processadores dobra a cada 18/24 meses, o tempo de acesso a MP aumenta bem menos (cerca de 8% por ano) Hanessy, Patterson – Quantitative Approach - pg. 73 → Introduzindo a memória cache... Princípios da Memória Cache ● Memória rápida entre CPU e Memória principal ● Objetivo: – Acelerar a velocidade de transferência das informações entre CPU (muito rápido) e MP (muito lenta) – Consequentemente também do sistema de computação Princípios da Memória Cache ● Quando o processador precisa de um dado, ele pode já estar na cache (cache hit) ● Se não estiver (cache miss), tem que buscar na memória (ou até no disco) ● Quando um dado é acessado na memória, um bloco inteiro (e.g. 64 bytes) contendo o dado é trazido à memória cache ● Blocos vizinhos podem também ser acessados (prefetching) para uso futuro ● Na próxima vez o dado (ou algum dado vizinho) é usado, já está na cache cujo acesso é rápido ● A razão entre o número de cache hit e o número total de buscas na cache é conhecida como taxa de acerto (hit ratio). Analogia Cache MP Disco Operação de leitura de cache Cache Miss Cache Hit Operação de leitura de cache – Blocos e palavras LatMedia = LatMediaCache + LatMediaMem.Principal LatMedia = (90% ∗ 1, 2ns) + (10% ∗ 60,0ns) = 7,08ns Cache: Latência Média Construção da cache: SRAM ● Static RAM ● Nas SRAM, os dados são armazenados usando o estado de uma célula de memória composta por transistores e flip-flops ● A memória estática mantém o dado inalterado, desde que haja energia – Não necessita de circuito de refresh ● Menos densa, mais rápida e mais custosa do que DRAM Construção da cache: SRAM Célula básica de memória SRAM Construção da cache: SRAM Uma SRAM de 16 células de 4 bits. Endereço linear Construção da cache: SRAM Estrutura de cache/memória principal ● O número de linhas da cache é consideravelmente menor que o número de blocos da memória principal ● A qualquer momento, algum subconjunto dos blocos de memória reside nas linhas na cache ● Se uma palavra em um bloco de memória for lida, esse bloco é transferido para uma das linhas da cache ● A tag é usada para identificar qual bloco em particular está atualmente sendo armazenado – Veremos daqui a pouco como funciona... Estrutura de cache/memória principal A memória principal consiste em até 2n palavras endereçáveis, com cada palavra tendo um endereço distinto de n bits. Memória é dividida em blocos de tamanho fixo com K palavras cada. M = 2n/K blocos Estrutura de cache/memória principal - Cache contém L linhas - Cada linha contém um tag, um bloco de palavras da memórias e bits de controle - Tag contém informações sobre o endereço do bloco na memória - Bits de controle informam se a linha foi modificada depois de carregada na cache (dirty bit) Estrutura de cache/memória principal Mapeamento Blocomem → Linhacache Elementos do projeto da memória cache 1. Tamanho da cache 2. Números de níveis de cache 3. Tamanho da linha 4. Política de Escrita 5. Função de Mapeamento 6. Algoritmo de Substituição Detalhes de cada elemento na sequência! Tamanho da cache ● Difícil estimar um tamanho ideal ● Considerar: – Custo – Desempenho – Área do processador ● Tamanho da Cache varia de acordo com o projeto do processador Tamanho da cache Número de memórias cache ● Originalmente, o sistema de memória típico tinha uma única cache ● Hoje: – Uso de múltiplas caches (2010→) – Dentro do chip (sem acesso ao barramento externo à CPU) – L1, L2 e L3 (comum) – L4: ● Intel Core i7-5775C – 128 MB L4 ● IBM Z12 – 384 MB L4 Intel Nehalem CPU (2008-2010) Número de memórias cache ● Hoje é comum dividir a cache em duas (L1): – Instruções – Dados Dados Instr. Tamanho da linha ● Quando um bloco de dados é recuperado e colocado na cache, algumas palavras adjacentes são armazenadas – Bloco inteiro ● À medida que o tamanho do bloco aumenta de tamanho, a razão de acerto a princípio aumentará ● Contudo, a razão de acerto começará a diminuir enquanto o bloco se torna ainda maior e a probabilidade de uso da informação recém-trazida se torna menor que a probabilidade de reutilizar as informações que foram substituídas Tamanho da linha Hanessy & Patterson – Computer Architecture and Design Tamanho da linha ● Dois efeitos específicos entram em cena: – Blocos maiores reduzem o número de blocos que cabem em uma cache. ● Como cada busca de bloco escreve sobre o conteúdo antigo da cache, um número pequeno de blocos resulta em dados sendo modificados pouco depois de serem buscados ● Thrashing – À medida que o bloco se torna maior, cada palavra adicional fica mais distante da palavra solicitada e, portanto, tem menos probabilidade de ser necessária no futuro próximo Política de escrita ● Quando um bloco está na cache e precisa ser substituído, existem dois casos: – Não Alterado: pode ser substituído diretamente – Alterado: memória principal precisa ser atualizada ● Políticas: – Write through – Write back Política de escrita ● Write through – Todas as operações de escrita são feita na memória principal e também na cache – Garante que a memória principal sempre seja válida – Desvantagem: ● Gera um tráfego de memória considerável e pode ser um gargalo Política de escrita ● Write back – Atualizações são feitas apenas na cache – Quando ocorre uma atualização: ● um bit de modificação (dirty bit), associado à linha, é marcado ● Quando um bloco é substituído, ele é escrito de volta na memória principal se, e somente se, o bit de modificação estiver marcado – Problema: partes da memória principal podem ficar inválidas Política de escrita ● Se estivermos em um sistema com mais de um núcleo ou CPU podemos ter problemas de coerência de cache – Necessário protocolos de coerência ● Snooping ● Diretórios ● Voltaremos a falar disso posteriormente... Funções de mapeamento ● Como existem menos linhas de cache do que blocos da memória principal, é necessário haver um algoritmo de mapeamento ● Determinar qual bloco da memória principal atualmente ocupa uma linha da cache ● 3 técnicas podem ser utilizadas: – Mapeamento Direto – Mapeamento Associativo – Mapeamento Associativo por conjunto (set associative) Funções de mapeamento – Map. Direto ● Mapeia cada bloco da memória principal a apenas uma linha de cache possível ● O mapeamento é expresso como: i = j módulo m onde: i = número da linha da cache j = número do bloco da memória principal m = número de linhas da cache Funções de mapeamento – Map. Direto ● Exemplo: – 4 Linhas – 12 Blocos Funções de mapeamento – Map. Direto ● Exemplo 2: – 8 Linhas – 32 Blocos Funções de mapeamento – Map. Direto 0000 9999 ... Conjunto de livros Estante: últimos livros lidos 00 01 02 97 98 99 ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... Funções de mapeamento – Map. Direto 8438 4999 00 01 02 97 98 99 ... ... ... ... ... ... ... ... ... ... ... ... 36 37 38 ... ... ... ... ... ... ... ... ... ... ... ... 1200Map. Direto: dois últimos dígitos indicam A posição na estante Funções de mapeamento – Map. Direto 0000000001 0000000000 0000000011 Memória 0000000010 0000000101 0000000100 0000000111 0000000110 1111111101 1111111100 1111111111 1111111110 ... B0 B1 B255 0 1 2 3 4 5 6 7 1020 1021 1022 1023 Cache P0 (00) L1 (01) L2 (10) L3 (11) P1 (01)P2 (10)P3 (11) L0 (00) tag Endereçamento em nível de byte: Palavramem → 1 byte 1 byte Cache P0 (00) L1 (01) L2 (10) L3 (11) P1 (01)P2 (10)P3 (11) L0 (00) tag Funções de mapeamento – Map. Direto 0000000001 0000000000 0000000011 Memória 0000000010 0000000101 0000000100 0000000111 0000000110 1111111101 1111111100 1111111111 1111111110 ... B0 B1 B255 0 1 2 3 4 5 6 7 1020 1021 1022 1023 0000000000 2 bits menos significativos identificam as palavras do bloco Funções de mapeamento – Map. Direto 0000000001 0000000000 0000000011 Memória 0000000010 0000000101 0000000100 0000000111 0000000110 1111111101 1111111100 1111111111 1111111110 ... B0 B1 B255 0 1 2 3 4 5 6 7 1020 1021 1022 1023 0000000000 Próximos 2 bits identificam a linha a qual o bloco é alocado. Aqui são 2 bits porque temos 4 linhas na cache (2²). Cache P0 (00) L1 (01) L2 (10) L3 (11) P1 (01)P2 (10)P3 (11) L0 (00) tag Funções de mapeamento – Map. Direto 0000000001 0000000000 0000000011 Memória 0000000010 0000000101 0000000100 0000000111 0000000110 1111111101 1111111100 1111111111 1111111110 ... B0 B1 B255 0 1 2 3 4 5 6 7 1020 1021 1022 1023 0000000000 Demais bits são as tags utilizadas para identificar bloco que está alocado na linha Cache P0 (00) L1 (01) L2 (10) L3 (11) P1 (01)P2 (10)P3 (11) L0 (00) tag Funções de mapeamento – Map. Direto 0000000001 0000000000 0000000011 Memória 0000000010 0000000101 0000000100 0000000111 0000000110 1111111101 1111111100 1111111111 1111111110 ... B0 B1 B255 0 1 2 3 4 5 6 7 1020 1021 1022 1023 0000000000 Os 8 últimos bits (linha+tag) identificam o bloco da memória principal. Cache P0 (00) L1 (01) L2 (10) L3 (11) P1 (01)P2 (10)P3 (11) L0 (00) tag Funções de mapeamento – Map. Direto 1010101001 (681 10 ) Em qual linha da cache esse endereço será alocado? Qual a tag correspondente? Em qual bloco de memória esse endereço se encontra? Funções de mapeamento – Map. Direto 0000000001 0000000000 0000000011 Memória 0000000010 0000000101 0000000100 0000000111 0000000110 1111111101 1111111100 1111111111 1111111110 ... B0 B1 B255 0 1 2 3 4 5 6 7 1020 1021 1022 1023 1010101001 (681 10 ) 1- Será alocado na linha L2 2- Tag: 101010 3- Bloco 170 da memória Cache 3 2 1 0 P0 (00) L1 (01) L2 (10) L3 (11) P1 (01)P2 (10)P3 (11) L0 (00) tag 1010101001 ... B170 Funções de mapeamento – Map. Direto Funções de mapeamento – Map. Direto 101010 10 01 Cache xxxxx xxxxx xxxxx xxxxx P0 (00) L1 (01) L2 (10) L3 (11) P1 (01)P2 (10)P3 (11) L0 (00) tag 101010 miss (busca o bloco na MP) linha CMP Tag tag tag hit (busca palavra na cache) MP Endereço Atividade → 5 minutos 1) Qual o número de bits para determinar: - palavra (byte) - linha - tag 2) Em qual linha estará o Endereço 10101 (21) Atividade → Resposta 1) Qual o número de bits para determinar: - palavra (byte): 1 → 2¹ (dois bytes por linha) - linha: 2 → 4 linhas → 2² - tag: 2 2) Em qual linha estará o Endereço 10101 (21) → 10(tag) 10(linha) 1(byte) - Linha 2 Outro exemplo... Outro exemplo... ● Memória: – 4GB (2³²) – 32 bits de endereço – 64 M x 64 bits (8 bytes) – Endereçamento por byte ● Cache: – 1024 linhas – 64 bytes por linha – 64 KB total – Tag 16 bits – Cada linha da cache deverá acomodar 64 blocos Outro exemplo... ● Cada linha possui 64 bytes – Endereçamento a byte → 64 = 2⁶ ● 1024 linhas → 210 ● Restante: 16 bits para tag Outro exemplo... Atividade 2 ● Considere um sistema de computação com uma memória cache de 32KB de capacidade, constituída de linhas com 8 bytes de largura. A MP possui 16MB. ● Calcule a quantidade de bits para: – Bloco da memória – Palavra (byte) na linha – Linhas – Tag Atividade 2 ● Cache: – 32KB / 8bytes → 4k linhas → 212 linhas – 8 bytes por linha → 2³ – 9 bits para tag ● Memória: – 16MB → 224 – Endereço de 24 bits – 224 / 23 → 21 bits para endereçar blocos xxxxxxxxxxxxxxxxxxxxxxxx Mapamento Direto - Problemas ● O mapeamento direto é simples mas tem uma desvantagem ● Se o programa acessa repetida e alternadamente dois blocos de memória mapeados à mesma posição na cache, então esses blocos serão continuamente introduzidos e retirados da cache – Thrashing ● Resulta em um número grande de misses Funções de mapeamento – Map. Associativo ● Neste método não há local fixo na cache para alocação de um bloco da MP – Um bloco pode ser armazenado em qualquer linha – Substitui o bloco que estava armazenado – Escolher qual bloco substituir (política de substituição, veremos adiante) ● Para identificar o bloco que está na cache ou não, deve-se comparar o endereço do bloco com a tag armazenada na linha da cache – Verificação deve ser rápida (busca associativa) – Simultânea em todas as linhas da cache – Grande consumo de hardware!!! Funções de mapeamento – Map. Associativo 8438 4999 00 01 02 97 98 99 ... ... ... ... ... ... ... ... ... ... ... ... 36 37 38 ... ... ... ... ... ... ... ... ... ... ... ... 1200 Qualquer livro pode ir para uma posição na estante Funções de mapeamento – Map. Associativo 00 01 02 97 98 99 ... ... ... ... ... ... ... ... ... ... ... ... 36 37 38 ... ... ... ... ... ... ... ... ... ... ... ... 1200 Para buscar o livro 1200, todo a estante precisa ser buscada A busca fica rápida se todas as posições são buscadas em paralelo Se o livro desejado não está no escaninho, então pega na biblioteca e aloca na estante Se estante já está cheia, então escolhe um livro e o remove 8438 4999 Cache P0 (00) L1 (01) L2 (10) L3 (11) P1 (01)P2 (10)P3 (11) L0 (00) tag Funções de mapeamento – Map. Associativo 0000000001 0000000000 0000000011 Memória 0000000010 0000000101 0000000100 0000000111 0000000110 1111111101 1111111100 1111111111 1111111110 ... B0 B1 B255 0 1 2 3 4 5 6 7 1020 1021 1022 1023 0000000000 2 bits menos significativos identificam as palavras do bloco Restante: tag Funções de mapeamento – Map. Associativo Funções de mapeamento – Map. Associativo 10101010 01 Cache xxxxx xxxxx xxxxx xxxxx P0 (00)P1 (01)P2 (10)P3 (11) 10101111 tag 00101010 10101010 10101011 miss (busca o bloco na MP) CMP Tags tags bloco hit (busca palavra na cache na palavra onde está o endereço) MP Endereço Atividade 3 – Map. Associativo ● Considere uma MP com 64 MB de capacidade associada a uma memória cache que possui 2K linhas, cada uma com largura de 16 bytes. ● Determine o formato do endereço. Atividade 3 – Map. Associativo ● MP = 64MB = 226 ● Largura do bloco 16 Bytes → 24 bytes por linha ● Formato do endereço: bloco/byte 22 4 Funções de mapeamento – Map. Assoc. por Conjunto ● Tenta resolver 2 problemas – Conflito de blocos do Map. Direto – Custo da comparação no Map. Associativo ● É o mais usado em processadores modernos Funções de mapeamento – Map. Assoc. por Conjunto ● A cache consiste de um número v de conjuntos, cada um com L linhas ● Suponha i=número do conjunto ● Suponha j=número do bloco na memória ● Temos i=j mod v. – Bloco j é colocado no conjunto número i ● Dentro do conjunto i, o bloco j pode ser colocado em qualquer linha ● Usa-se acesso associativo em cada conjunto para verificar se um dado bloco está ou não presente Funções de mapeamento – Map. Assoc. por Conjunto ● Uma organização comum é usar 4, 8 ou 12 linhas em cada conjunto: – L = 4, 8 ou 12 – 4-way, 8-way ou 12-way set-associative cache Informações obtidas com o hardinfo Funções de mapeamento – Map. Assoc. por Conjunto 8438 49991200 Estante é dividida por conjuntos,com 3 espaços cada (3-way) Último dígito do livro especifica o conjunto 0 1 2 9 3 4 5 6 7 8 0 1 2 9 3 4 5 6 7 8 Funções de mapeamento – Map. Assoc. Conjunto 1200 Para buscar o livro 1200, busca-se no conjunto 0 apenas - buscadas em paralelo dentro do conjunto apenas Se o livro desejado não está no escaninho, então pega na biblioteca e aloca em umas das posições do conjunto 8438 4999 Funções de mapeamento – Map. Assoc. por Conjunto ● Uma organização comum é usar 4 ou 8 linhas em cada conjunto: – L = 4 ou 8 – Recebem o nome de 4-way ou 8-way set-associative cache ● Exemplo: – 2-way – V = 2 (2 conjuntos) Cache P0 (00) L1 (01) L2 (10) L3 (11) P1 (01)P2 (10)P3 (11) L0 (00) tag C0 (0) C1 (1) Funções de mapeamento – Map. Assoc. por Conjunto 0000000001 0000000000 0000000011 Memória 0000000010 0000000101 0000000100 0000000111 0000000110 1111111101 1111111100 1111111111 1111111110 ... B0 B1 B255 0 1 2 3 4 5 6 7 1020 1021 1022 1023 0000000000 - 2 bits menos significativos identificam as palavras do bloco - 1 bit (2 grupos → 2¹) identifica o grupo - restante: tag Cache P0 (00) L1 (01) L2 (10) L3 (11) P1 (01)P2 (10)P3 (11) L0 (00) tag C0 (0) C1 (1) Funções de mapeamento – Map. Assoc. por Conjunto 0000000001 0000000000 0000000011 Memória 0000000010 0000000101 0000000100 0000000111 0000000110 1111111101 1111111100 1111111111 1111111110 ... B0 B1 B255 0 1 2 3 4 5 6 7 1020 1021 1022 1023 1110001100 Onde será armazenado na cache o endereço: Cache P0 (00) L1 (01) L2 (10) L3 (11) P1 (01)P2 (10)P3 (11) L0 (00) tag C0 (0) C1 (1) Na palavra 00 de umas das linhas do conjunto C1 (L2 ou L3). Funções de mapeamento – Map. Assoc. por conjunto Atividade 4 – Map. Associativo por Conjunto ● Considere uma MP com 64MB de capacidade associada a uma memória cache associativa de 32KB, com 4 conjuntos e linhas de largura de 16 bytes. ● Determine o formato do endereço para ser interpretado pelo sistema de controle de cache. Atividade 4 – Map. Associativo por Conjunto ● MP = 64M = 226 → Endereço de 26 bits ● Largura da linha = 16B = 24 ● Linhas da cache = 32KB/16B = 8K ● Conjuntos = 8K/4 = 2K = 211 ● Formato do endereço (tag/conjunto/byte): 11 11 4 Algoritmos de substituição ● Uma vez que a cache estiver cheia, e um novo bloco for trazido para a cache, um dos blocos existentes precisa ser substituído ● Para o mapeamento direto, existe apenas uma linha possível para qualquer bloco em particular e nenhuma escolha é possível ● Para as técnicas associativa e associativa em conjunto, um algoritmo de substituição é necessário ● Mais comuns: – First in First out (FIFO) → primeiro a entrar, primeiro a sair – Least Recently Used (LRU) → substitui a linha de cache que está na cache há mais tempo sem referências a ela – Least Frequently Used (LFU) → substitui a linha de cache que tem o menor número de referências – Aleatório Exemplo: FIFO x LRU FIFO: 14 falhas LRU: 11 falhas Belady’s Belady’s: 9 falhas ● O algoritmo ideal de Belady trapaceia. ● Ele olha adiante no tempo para ver qual endereço substituir. ● Portanto, não é um algoritmo de substituição real. ● Fornece um quadro de referência para uma determinada sequência de acesso a quadros estáticos. Exemplos de cache no mundo real Pentium IV ● 2 Níveis – Cache L1 (interna ao processador) – Cache L2 (externa) Pentium IV ● MP – 16 MB – Endereçamento em nível de byte ● L1 – 8KB – Associativa por conjunto – 4-way – Linhas de 64 bytes ● 16MB → 224 → endereço de 24 bits ● Blocos: 16MB/64 = 262.144 (218) ● Linhas: 8K / 64 = 128 (27) linhas ● Byte: 64 → 2⁶ ● Conjuntos: 128/4 = 32 (25) ● Endereço: 13 5 6 Pentium IV ● L2 – 256 KB – Associativa por conjunto – 8-way – Linhas de 128 bytes ● Endereço: 9 8 7 Tarefa de casa: → Como chegar nesses valores?? Pentium IV ● Desempenho Arquiteturas AMD (2012→ )(2011→ ) (2014→ ) Intel Xeon 8124M https://www.cpu-world.com/CPUs/Xeon/Intel-Xeon%208124M.html Sugestões de leitura ● Mario Monteiro - Introdução à Organização de Computadores - 5a Ed. – Capítulo 5 ● Willian Stallings – Arquitetura e Organização de Computadores – Capítulo 4 ● How L1 and L2 CPU Caches Work, and Why They’re an Essential Part of Modern Chips https://www.extremetech.com/extreme/188776-how-l1-and-l2-cpu- caches-work-and-why-theyre-an-essential-part-of-modern-chips-bar Slide 1 Slide 2 Slide 3 Slide 4 Slide 5 Slide 6 Slide 7 Slide 8 Slide 9 Slide 10 Slide 11 Slide 12 Slide 13 Slide 14 Slide 15 Slide 16 Slide 17 Slide 18 Slide 19 Slide 20 Slide 21 Slide 22 Slide 23 Slide 24 Slide 25 Slide 26 Slide 27 Slide 28 Slide 29 Slide 30 Slide 31 Slide 32 Slide 33 Slide 34 Slide 35 Slide 36 Slide 37 Slide 38 Slide 39 Slide 40 Slide 41 Slide 42 Slide 43 Slide 44 Slide 45 Slide 46 Slide 47 Slide 48 Slide 49 Slide 50 Slide 51 Slide 52 Slide 53 Slide 54 Slide 55 Slide 56 Slide 57 Slide 58 Slide 59 Slide 60 Slide 61 Slide 62 Slide 63 Slide 64 Slide 65 Slide 66 Slide 67 Slide 68 Slide 69 Slide 70 Slide 71 Slide 72 Slide 73 Slide 74 Slide 75 Slide 76 Slide 77 Slide 78 Slide 79 Slide 80 Slide 81 Slide 82 Slide 83 Slide 84 Slide 85 Slide 86 Slide 87 Slide 88 Slide 89 Slide 90