College Online
0%

Hierarquia de Memoria e Cache

Modulo 1 · Aula 2 ~22 min de leitura Nivel: Intermediario

Video da aula estara disponivel em breve

O Problema da Lacuna Processador-Memoria

A velocidade dos processadores cresceu exponencialmente a partir dos anos 1980, mas a velocidade da DRAM nao acompanhou esse ritmo. Esse fenomeno, chamado memory wall, cria uma lacuna cada vez maior: o processador consegue consumir dados muito mais rapido do que a memoria principal consegue fornecê-los.

A solucao arquitetural e a hierarquia de memoria: uma serie de niveis de armazenamento com velocidade decrescente, capacidade crescente e custo por bit decrescente.

Diagrama — Hierarquia de Memoria
  Velocidade   Capacidade   Custo/bit
  maxima       minima       maximo
     |            |            |
     v            v            v
  ┌──────────────────┐
  │  Registradores   │  ~1 ns     ~1 KB     $$$$$$
  ├──────────────────┤
  │   Cache L1       │  ~2 ns     32-64 KB  $$$$$
  ├──────────────────┤
  │   Cache L2       │  ~5 ns     256 KB-1 MB $$$$
  ├──────────────────┤
  │   Cache L3       │  ~10 ns    4-64 MB   $$$
  ├──────────────────┤
  │ Memoria Principal│  ~50 ns    8-64 GB   $$
  │    (DRAM)        │
  ├──────────────────┤
  │  Armazenamento   │  ~100 us   256 GB-   $
  │  (SSD/HDD)       │            4 TB
  └──────────────────┘
     ^            ^            ^
     |            |            |
  Velocidade   Capacidade   Custo/bit
  minima       maxima       minimo

Principio da Localidade

A hierarquia de memoria so funciona porque os programas exibem localidade de referencia — a tendência de acessar dados e instrucoes em padroes previsiveis. Ha dois tipos fundamentais:

C
// Exemplo: este codigo exibe ambos os tipos de localidade
int soma_array(int *arr, int n) {
    int sum = 0;           // localidade temporal: sum acessado N vezes
    for (int i = 0; i < n; i++) {
        sum += arr[i];       // localidade espacial: arr[0], arr[1], arr[2]...
    }                        // localidade temporal: i incrementado N vezes
    return sum;
}
i
Por que localidade importa para o cache? Quando o processador acessa um dado, o cache traz nao so aquele dado, mas um bloco inteiro de dados vizinhos (tipicamente 64 bytes). Isso explora a localidade espacial. E o cache mantem esses dados por algum tempo, explorando a localidade temporal. Quanto melhor a localidade do programa, maior a taxa de acertos (hit rate) do cache.

Organizacao do Cache

Um cache e uma memoria SRAM pequena e rapida que armazena copias dos dados mais recentemente acessados da memoria principal. A questao central e: dado um endereco de memoria, como o cache decide onde armazenar esse dado e como encontrá-lo depois?

Existem tres estrategias de mapeamento:

Mapeamento Direto (Direct-Mapped)

Cada bloco de memoria so pode ir para uma unica posicao no cache, determinada por indice = endereco_bloco mod numero_linhas.

Diagrama — Cache Direct-Mapped
  Endereco (32 bits):
  ┌──────────┬──────────┬──────────┐
  │   Tag    │  Index   │  Offset  │
  │ (20 bits)│ (8 bits) │ (4 bits) │
  └──────────┴──────────┴──────────┘
                  │
                  v
  Cache (256 linhas, blocos de 16 bytes):
  ┌─────┬──────────┬────────────────────┐
  │Valid│   Tag    │   Dados (16 bytes) │  Linha 0
  ├─────┼──────────┼────────────────────┤
  │Valid│   Tag    │   Dados (16 bytes) │  Linha 1
  ├─────┼──────────┼────────────────────┤
  │ ... │   ...    │       ...          │
  ├─────┼──────────┼────────────────────┤
  │Valid│   Tag    │   Dados (16 bytes) │  Linha 255
  └─────┴──────────┴────────────────────┘

  Vantagem: simples e rapido (1 comparacao)
  Desvantagem: conflitos — dois blocos que mapeiam
               para a mesma linha se expulsam mutuamente

Cache Totalmente Associativo (Fully Associative)

Qualquer bloco pode ir para qualquer linha do cache. Nao ha indice — busca compara a tag com todas as linhas simultaneamente (usando CAM — Content Addressable Memory).

Cache Associativo por Conjuntos (Set-Associative)

Compromisso entre direto e totalmente associativo. O cache e dividido em conjuntos (sets), cada um com N linhas (N-way). O indice seleciona o conjunto; dentro do conjunto, qualquer linha pode ser usada.

Diagrama — Cache 2-Way Set-Associative
  Endereco:
  ┌──────────┬──────────┬──────────┐
  │   Tag    │Set Index │  Offset  │
  └──────────┴──────────┴──────────┘
                  │
                  v
  Set 0: ┌─────┬─────┬──────┐ ┌─────┬─────┬──────┐
         │Valid│ Tag │Dados │ │Valid│ Tag │Dados │   Way 0 e Way 1
         └─────┴─────┴──────┘ └─────┴─────┴──────┘
  Set 1: ┌─────┬─────┬──────┐ ┌─────┬─────┬──────┐
         │Valid│ Tag │Dados │ │Valid│ Tag │Dados │
         └─────┴─────┴──────┘ └─────┴─────┴──────┘
  ...

  Tipico em CPUs modernas:
  L1: 8-way, L2: 8-16 way, L3: 16-way

Politicas de Escrita

Quando o processador escreve um dado que esta no cache, ha duas politicas para manter a coerência com a memoria principal:

Quando uma escrita resulta em miss:

Tipos de Cache Miss

Os misses de cache sao classificados em tres categorias (os "tres Cs"):

  1. Compulsory (cold) miss: ocorre no primeiro acesso a um bloco. Inevitavel — o dado nunca esteve no cache. Pode ser reduzido com prefetching.
  2. Capacity miss: ocorre quando o cache nao consegue conter todos os blocos necessarios ao mesmo tempo. O working set do programa excede o tamanho do cache. Solucao: cache maior.
  3. Conflict miss: ocorre em caches de mapeamento direto ou set-associative quando dois blocos frequentemente usados mapeiam para o mesmo conjunto/linha. Nao ocorre em caches totalmente associativos. Solucao: aumentar a associatividade.
*
Impacto no desempenho Um cache L1 com hit rate de 95% parece bom, mas os 5% de misses podem representar dezenas de ciclos de penalidade cada. Se a taxa de miss dobra de 2% para 4%, o programa pode ficar 50% mais lento — o desempenho e extremamente sensivel à taxa de misses.

Politicas de Substituicao

Quando ocorre um miss e o conjunto esta cheio, e preciso escolher qual linha substituir:

No harness.os

A hierarquia de memoria e o conceito de cache sao analogias diretas para a arquitetura de conhecimento do harness.os:

Exercicios

  1. Um processador tem cache L1 de 32 KB com blocos de 64 bytes e mapeamento direto. Quantas linhas o cache possui? Quantos bits sao necessarios para tag, indice e offset em enderecos de 32 bits?
  2. Dois arrays de 4096 inteiros (16 KB cada) sao acessados alternadamente em um loop. O cache L1 tem 32 KB e mapeamento direto. Pode haver conflict misses? Justifique.
  3. Compare LRU e Random como politicas de substituicao para um cache L1 8-way. Qual a complexidade de implementacao de cada uma em hardware?
  4. Um programa tem hit rate de 97% no L1 (2 ciclos) e 90% no L2 (10 ciclos). O acesso a memoria principal custa 100 ciclos. Calcule o tempo medio de acesso a memoria (AMAT).
  5. Explique por que aumentar a associatividade de um cache reduz conflict misses mas aumenta o tempo de hit.

Resumo

Verifique seu entendimento

Em um cache 4-way set-associative, um bloco de memoria pode ser armazenado em:

  • Qualquer linha do cache inteiro
  • Exatamente uma linha especifica do cache
  • Qualquer uma das 4 linhas do conjunto determinado pelo indice do endereco
  • Em 4 linhas simultaneamente para redundancia