Hierarquia e caches

Localidade, decomposição do endereço, associatividade e estados de leitura.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Um ciclo lê as palavras consecutivas de um vetor. Se cada acesso fosse até à DRAM, a memória principal poderia atrasar o processador dezenas de ciclos. A cache guarda blocos próximos do CPU, para que uma transferência sirva várias leituras.

Os registos e a SRAM, memória RAM estática, são rápidos mas caros por bit. A DRAM, memória RAM dinâmica, permite uma memória principal maior. Ambas são voláteis: perdem o conteúdo sem alimentação. O armazenamento conserva-o. A hierarquia combina estes níveis, transferindo blocos, também chamados linhas.

Localidade e organização

Localidade temporal: voltar a usar um dado recente. Localidade espacial: usar endereços próximos. Um ciclo percorre um vetor contíguo e pode reutilizar a linha que contém vários elementos.

Uma cache guarda dados, etiqueta e bit de validade. A etiqueta identifica o bloco da memória; validade distingue uma entrada utilizável de dados antigos sem significado. Uma cache write-back guarda também um bit dirty, explicado em Políticas de cache.

OrganizaçãoOnde pode entrar um bloco?Escolha da vítima
Mapeamento diretoUma única entradaDeterminada pelo índice
Associativa por conjuntos de AA viasQualquer via do seu conjuntoNecessária quando o conjunto está cheio
Totalmente associativaQualquer entradaNecessária quando a cache está cheia

Um acesso acerta, ou é um hit, quando encontra uma entrada válida com a etiqueta pedida; caso contrário há uma falta, ou miss. Numa cache de AA vias comparam-se as AA etiquetas do conjunto selecionado, não as de todos os conjuntos.

O número de conjuntos é S=C/(BA)S=C/(B A), com capacidade de dados CC, bytes por bloco BB e associatividade AA. Distingue conjunto, via e bloco da memória.

Decompor um endereço

Constrói primeiro por divisão inteira e só depois lê os bits. Para linha de 64 bytes e 32 conjuntos, com endereço EE:

bloco=E//64,offset=E mod 64,ıˊndice=bloco mod 32,etiqueta=bloco//32.\text{bloco} = E // 64, \quad \text{offset} = E \bmod 64, \quad \text{índice} = \text{bloco} \bmod 32, \quad \text{etiqueta} = \text{bloco} // 32.

Para 0x12345678, bloco 0x48D159, offset 56, índice 25 e etiqueta 0x2468A. O início da linha é 0x12345640. Confere sempre que índice e offset cabem nos bits previstos antes de comparar etiquetas.

A divisão separa três decisões: o bloco determina que bytes transferir; o índice escolhe onde procurar; a etiqueta confirma se essa posição contém o bloco pedido.

Para endereços de nn bits, com B=2bB=2^b bytes por bloco e S=2sS=2^s conjuntos:

etiqueta⏟n−s−bıˊndice⏟sdeslocamento⏟b.\underbrace{\text{etiqueta}}_{n-s-b}\quad\underbrace{\text{índice}}_s\quad\underbrace{\text{deslocamento}}_b.

As contas seguintes usam endereços de byte. Se um exercício fornece endereços de palavras de 4 B, converte primeiro para bytes, multiplicando por 4, ou expressa o tamanho da linha em palavras. Não mistures as duas unidades.

O deslocamento escolhe o byte dentro da linha, não uma linha. Para palavras de 4 bytes, os dois bits baixos escolhem um byte dentro da palavra; os restantes bits de deslocamento escolhem a palavra.

Uma cache direta de 2 KiB, com linhas de 64 B e endereços de 32 bits, tem 32 linhas, portanto 5 bits de índice, 6 de deslocamento e 21 de etiqueta.

No desenho, os 6 bits baixos escolhem o byte, os 5 seguintes escolhem uma das 32 linhas e os 21 restantes distinguem blocos que concorrem por essa linha. Para o endereço do exemplo, (25×64)+56=1656(25\times64)+56=1656 são os 11 bits baixos. A etiqueta recupera o resto:

E=(0x2468A×32+25)×64+56=0x12345678.E=(\mathtt{0x2468A}\times32+25)\times64+56=\mathtt{0x12345678}.

Esta reconstrução permite conferir a decomposição e, numa substituição, recuperar o endereço da linha antiga.

Seguir uma sequência de leituras

Modelo: cache direta, 4 linhas de 16 B, inicialmente inválida. Lê os endereços 0,4,64,0,16,20:

AcessoBloco da memóriaÍndiceEtiquetaResultado e alteração
0000Falta; carregar linha 0, etiqueta 0
4000Acerto; mesma linha
64401Falta; substituir linha 0 pela etiqueta 1
0000Falta; repor etiqueta 0 na linha 0
16110Falta; carregar linha 1
20110Acerto; mesma linha

São 4 leituras de blocos na memória principal e 2 acertos. Alterar só o deslocamento não provoca substituição.

Em uma cache de 2 vias com a mesma capacidade, há 2 conjuntos. Os blocos 0 e 4 continuam no mesmo conjunto, mas cabem simultaneamente, por isso a leitura posterior de 0 pode acertar. Maior associatividade permite evitar conflitos, mas não elimina faltas por capacidade nem garante melhor tempo de acesso.

Aumentar a linha também não garante melhoria. Com capacidade fixa, linhas maiores aproveitam vizinhos, mas deixam menos linhas disponíveis e transferem mais bytes em cada falta. Dados sem localidade espacial podem expulsar dados úteis sem compensar esse custo.

Substituição e tipos de falta

Segue um conjunto de 2 vias, inicialmente vazio, com a sequência A, B, A, C:

AcessoLRU: menos para mais recenteFIFO: chegada mais antiga para mais nova
A[A][A]
B[A, B][A, B]
A[B, A][A, B]
C[A, C], expulsa B[B, C], expulsa A

O acerto em A atualiza a recência LRU, mas não a chegada FIFO. As listas representam a ordem da política, não a posição física das vias.

LRU substitui o bloco usado há mais tempo. FIFO substitui o carregado há mais tempo; um acerto altera LRU, mas não a ordem de chegada FIFO. Usa primeiro uma via inválida. O estado da política faz parte do traço.

Uma falta é compulsória na primeira referência a um bloco: nenhum estado anterior da cache a evitaria. É de capacidade se ocorreria mesmo numa cache totalmente associativa de igual capacidade sob a política de referência. É de conflito se resulta apenas do mapeamento restrito. Esta classificação exige comparar modelos, não adivinhar a partir de um único endereço.

A escolha da vítima em uma falta compulsória pode mudar faltas futuras. Em caches partilhadas, invalidações acrescentam faltas por coerência.

Contar os bits físicos

Para 8 linhas diretas de 16 B e endereços 24 bits: b=4,s=3,t=17b=4,s=3,t=17. Sem dirty ou outros metadados:

8×(16×8+17+1)=1168 bits=146 bytes.8\times(16\times8+17+1)=1168\ \text{bits}=146\ \text{bytes}.

A capacidade anunciada de dados é só 128 B. Para write-back, acrescenta 8 bits dirty; para uma política de substituição, considera também o seu estado, se pedido.

Endereços de uma matriz

Em C, uma matriz contígua em ordem por linhas A[R][K] tem endereço base + (iK+j)×tamanho. Variar j percorre dados adjacentes; variar i salta uma linha inteira. Trocar a ordem dos ciclos pode melhorar localidade, desde que conserve dependências e significado. Processar pequenos blocos de uma matriz permite reutilizar dados antes de os expulsar, mas o bloco deve caber no nível relevante da cache.

Considera A[8][8] de palavras de 4 B, base 0, e uma cache direta de duas linhas de 16 palavras. A palavra (i,j) tem número 8i+j8i+j. O bloco é (8i+j)//16(8i+j)//16 e o índice é esse bloco módulo 2. A cache começa vazia em cada percurso.

PercursoPrimeiros números de palavraBlocos correspondentesFaltas em 64 leituras
Por linhas0, 1, 2, …, 15, 16, …16 referências a cada bloco, de 0 a 34
Por colunas0, 8, 16, 24, 32, 40, 48, 560, 0, 1, 1, 2, 2, 3, 332

Por linhas, cada bloco carregado serve 16 leituras consecutivas. Por colunas, 2 expulsa 0 e 3 expulsa 1; a coluna seguinte volta aos blocos expulsos. Há quatro faltas por coluna, embora o programa leia as mesmas 64 palavras. A diferença está na ordem dos acessos.

Exercícios

Separar capacidade de dados e metadados

Cache direta: 8 linhas de 16 B, endereços 24 bits, só etiqueta e validade. Quantos bits físicos requer?

Pista
Calcula deslocamento e índice.
Solução

8×(128+17+1)=1168 bits. A capacidade de dados é 128 B, ou seja, os 146 B físicos incluem metadados.

Erros frequentes

Contar bytes como bits ou usar a capacidade total com metadados para obter o índice.

Voltar à explicação
Distinguir duas políticas

Cache totalmente associativa de 2 linhas, inicialmente vazia. Acede a blocos 0,1,0,2. Que vítima escolhem LRU e FIFO no último acesso?

Pista
O terceiro acesso é um acerto.
Solução

Depois de 0,1,0, LRU tem 1 como menos recente e substitui 1. FIFO ainda tem 0 como mais antigo e substitui 0, porque o acerto não muda a fila de chegada.

Confere a tua resposta:

  • Atualizei recência no acerto de 0.
  • Mantive a chegada FIFO inalterada nesse acerto.
  • Identifiquei vítimas distintas.

Erros frequentes

Alterar a fila FIFO em um acerto ou escolher uma vítima sem atualizar o estado.

Voltar à explicação
Seguir o conteúdo por acesso

Cache direta 8 linhas de 16 B, vazia. Leituras de palavras em 8,12,4,128,16,24,44,8,0. Quantas leituras de linhas da memória principal?

Pista
Agrupa endereços em linhas de 16 B.
Solução

Os blocos pedidos são 0,0,0,8,1,1,2,0,0 e os índices são 0,0,0,0,1,1,2,0,0. O traço é falta, acerto, acerto, falta, falta, acerto, falta, falta, acerto: cinco leituras de linha. O bloco 8 expulsa o bloco 0; a penúltima leitura repõe 0 e permite o acerto final.

Erros frequentes

Tratar 12 e 4 como linhas distintas ou supor que a linha inicial sobrevive à leitura 128.

Voltar à explicação
Seguir uma cache de duas vias

Cache de 64 B, linhas de 16 B, duas vias e LRU, inicialmente vazia. Lê os endereços de byte 0,32,0,64,32. Quantas faltas ocorrem?

Pista

Há dois conjuntos; calcula bloco=endereço/16 e conjunto=bloco mod 2.

Solução

Os blocos são 0,2,0,4,2: falta, falta, acerto, falta, falta. Ao entrar 4, LRU expulsa 2; ao voltar 2, expulsa 0. Há 4 faltas, apesar de a capacidade total poder guardar quatro linhas.

Erros frequentes

Distribuir cada via como se fosse um conjunto ou manter 2 na cache depois de o expulsar.

Voltar à explicação
Comparar percursos de matriz

Matriz 8x8 de palavras em ordem por linhas desde o endereço de palavra 0. Cache de dados diretamente mapeada com 2 linhas de 16 palavras, inicialmente vazia; palavra w usa a linha (w // 16) mod 2. Compara faltas por linhas e por colunas.

Pista

Por linhas, cada falta serve 16 leituras seguidas; conta blocos 0 a 3.

Solução

Por linhas: blocos 0, 1, 2 e 3 falham uma vez cada, total 4 faltas em 64 leituras. Por colunas: a primeira coluna lê 0, 8, 16, 24, 32, 40, 48 e 56 com 4 faltas, mas cada coluna seguinte volta a falhar porque os blocos foram expulsos, total 32 faltas. A diferença vem da reutilização da linha, não do número de leituras.

Confere a tua resposta:

  • Contei linhas de cache por percurso.
  • Expliquei a reutilização por linhas.
  • Relacionei o salto por colunas com novas faltas.

Erros frequentes

Contar só leituras sem contar linhas distintas tocadas.

Voltar à explicação

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.