Hierarquia de memória e caches

Aprenda por que um computador combina memórias pequenas e rápidas com memórias grandes e lentas e como as caches mantêm os dados necessários a um programa próximos do processador. Compare SRAM, DRAM e flash, localize blocos em caches de mapeamento direto e associativas por conjunto, classifique faltas e compare políticas de escrita. Calcule taxas de acertos, o tempo médio de acesso à memória e o custo das paradas de memória, veja como a memória virtual e a TLB traduzem endereços e escreva laços e estruturas de dados que aproveitem bem a cache.

IntermediárioAula 5 de 6 do curso Curso de Organização e arquitetura de computadores

O que você vai aprender

  1. Descrever como os programas reutilizam dados e código, comparar as tecnologias de memória que os armazenam e explicar como níveis pequenos e rápidos trabalham em conjunto com níveis grandes e lentos.
    • Reconhecer a localidade temporal e espacial em programas
      Identificar os dois tipos de localidade nos acessos a código e dados e explicar por que permitem que uma memória pequena e rápida atenda à maioria dos acessos.
    • Comparar memórias SRAM, DRAM e flash
      Descrever como SRAM, DRAM e flash armazenam bits e comparar sua velocidade, densidade, custo por bit, volatilidade e posição típica na hierarquia.
    • Descrever como os níveis da hierarquia trabalham em conjunto
      Identificar os níveis dos registradores ao armazenamento, usar o vocabulário de acertos e faltas e explicar como a hierarquia cria a ilusão de uma memória grande e rápida.
  2. Usar os campos de etiqueta, índice e deslocamento de um endereço para localizar um bloco, acompanhar sequências de acessos e comparar organizações de cache, do mapeamento direto à associação completa.
    • Dividir um endereço em etiqueta, índice e deslocamento
      Determinar os tamanhos dos campos de uma cache de mapeamento direto a partir de sua capacidade e do tamanho dos blocos, dividir um endereço em seus campos e calcular o armazenamento necessário à cache.
    • Acompanhar acessos em uma cache de mapeamento direto
      Acompanhar uma sequência de endereços em uma pequena cache de mapeamento direto, registrar cada acerto ou falta e o conteúdo da cache e identificar blocos que se substituem mutuamente.
    • Usar caches associativas por conjunto e totalmente associativas
      Localizar blocos em caches associativas por conjunto de n vias e totalmente associativas, escolher uma vítima com uma política de substituição e avaliar taxas de faltas menores diante do custo de hardware e do tempo de acerto.
  3. Descrever o que acontece em uma falta, classificá-las por causa, relacionar tamanho da cache, tamanho do bloco e associatividade à taxa de faltas e comparar as maneiras como as caches tratam escritas.
    • Tratar faltas na cache e classificar suas causas
      Descrever as etapas de uma falta na cache, classificá-las como compulsórias, de capacidade ou de conflito e explicar como o tamanho da cache, o tamanho do bloco e a associatividade alteram cada tipo.
    • Comparar políticas de escrita para caches
      Explicar como caches com escrita direta e escrita de volta mantêm a memória atualizada, o que fazem os buffers de escrita e os bits de modificação e como as políticas com e sem alocação na escrita tratam faltas de escrita.
  4. Calcular taxas de acertos, tempo médio de acesso à memória e ciclos de parada de memória, incluí-los no CPI e no tempo de execução e analisar sistemas com vários níveis de cache.
    • Calcular a taxa de acertos e o tempo médio de acesso à memória
      Calcular taxas de acertos e de faltas e o tempo médio de acesso à memória de uma cache, incluindo combinações de acessos a instruções e dados, e usá-los para comparar projetos.
    • Incluir paradas de memória no CPI e no tempo de execução
      Adicionar ciclos de parada de memória à equação de desempenho da CPU, determinar quanto uma cache custa a um programa e explicar por que processadores mais rápidos sofrem mais com memória lenta.
    • Analisar caches multinível
      Explicar por que os processadores usam vários níveis de cache, distinguir taxas locais e globais de faltas e calcular o tempo médio de acesso à memória e o CPI para hierarquias de dois e três níveis.
  5. Descrever como endereços virtuais são traduzidos em endereços físicos por uma tabela de páginas, por que uma falta de página é uma falta tratada pelo sistema operacional e como a TLB acelera a tradução.
    • Traduzir um endereço virtual com uma tabela de páginas
      Explicar o que a memória virtual oferece, dividir um endereço virtual em número de página e deslocamento, traduzi-lo por meio de uma entrada da tabela de páginas e descrever o que acontece em uma falta de página.
    • Acelerar a tradução de endereços com uma TLB
      Explicar como o buffer de tradução de endereços armazena traduções em cache, acompanhar um acesso pela TLB, pela tabela de páginas e pela cache e ver como os acessos à cache e a tradução se sobrepõem.
  6. Organizar laços e estruturas de dados para que os programas usem bem a hierarquia de memória e aplicar blocagem e pré-busca para reutilizar dados enquanto estão na cache.
    • Organizar laços e dados para explorar a localidade
      Ordenar laços conforme o armazenamento dos vetores, evitar passos de acesso prejudiciais e escolher organizações de dados que tragam apenas dados úteis para a cache.
    • Aplicar blocagem aos cálculos e usar pré-busca
      Reestruturar laços em blocos que permanecem na cache enquanto são reutilizados, escolher um tamanho de bloco e explicar como a pré-busca em hardware e em software oculta a latência da memória.

Guia de estudo de Hierarquia de memória e caches

6 capítulos

1

Explicar por que os computadores usam uma hierarquia de memória

Os programas usam repetidamente uma pequena parte de seu código e de seus dados. Essa reutilização explica por que uma cache pequena pode atender à maioria dos acessos mesmo quando o programa inteiro é muito maior. Acompanhe a diferença entre a reutilização no tempo e os endereços próximos, compare as células que compõem SRAM, DRAM e flash e relacione essas tecnologias a acertos, faltas e transferências pela hierarquia. O mesmo padrão de acesso determinará mais adiante se um projeto de cache ou uma transformação de laço ajuda.

1.1 Como os programas reutilizam dados próximos

Uma cache funciona porque o próximo acesso à memória muitas vezes está relacionado a um acesso recente. Durante um intervalo curto, a maioria dos programas usa apenas uma pequena parte de seu espaço de endereçamento. Esse padrão é a localidade. Uma cache mantém essa parte ativa próxima ao processador, onde pode atender rapidamente aos acessos.

Reutilização no tempo e no espaço

Localidade temporal significa reutilizar um item pouco depois de acessá-lo. Um laço busca repetidamente as instruções de seu corpo. Um total acumulado é lido e atualizado muitas vezes. Manter esses itens disponíveis evita buscá-los novamente em um nível mais lento.

Localidade espacial significa acessar itens em endereços próximos. Uma varredura de vetor lê elementos adjacentes, e código sequencial busca instruções sucessivas. Uma cache explora isso buscando um bloco inteiro, também chamado de linha de cache, em uma falta. Bytes próximos chegam antes de o programa solicitá-los.

Esses padrões podem ocorrer juntos. As instruções de um laço são adjacentes e executadas repetidamente, portanto o fluxo de instruções tem localidade espacial e temporal. Um elemento de vetor lido exatamente uma vez não tem reutilização temporal, embora a varredura do vetor ao redor tenha localidade espacial.

Conte blocos em uma varredura de vetor

Considere este laço em C com inteiros de 4 bytes e blocos de cache de 64 bytes:

for (int i = 0; i < 1000; i++) {
    sum += a[i];
}

Um bloco comporta 64/4=16 inteiros. O vetor ocupa 1000×4=4000 bytes. Se seu primeiro elemento estiver alinhado ao início de um bloco, a varredura acessará ⌈4000/64⌉=63 blocos: 62 blocos completos e um bloco parcial.

Em uma cache inicialmente vazia, sem pré-busca ou interferência, o primeiro acesso a cada bloco resulta em falta. Os elementos restantes desse bloco resultam em acerto. Assim, o vetor causa 63 faltas em 1000 acessos, ou cerca de 6,3%. Contar uma falta por elemento ignoraria todos os dados vizinhos úteis buscados em cada falta.

As variáveis do código-fonte sum e i são reutilizadas com frequência. No entanto, um compilador normalmente as mantém em registradores, de modo que sua reutilização no código-fonte não precisa gerar acessos à cache de dados. Analise os acessos à memória executados pelo programa compilado ao estimar o tráfego da cache.

O conjunto de trabalho deve caber e coexistir

O conjunto de trabalho é a coleção de blocos usados durante um intervalo de tempo escolhido. Se eles couberem na cache e as regras de posicionamento permitirem que coexistam, os acessos repetidos resultarão principalmente em acertos após os carregamentos iniciais. O intervalo de tempo importa: um programa inteiro pode ser enorme enquanto um laço ativo usa apenas alguns blocos.

A capacidade, por si só, não basta. Dois blocos muito usados podem ser mapeados para uma entrada de mapeamento direto e substituir um ao outro enquanto outras entradas permanecem vazias. Portanto, um conjunto de trabalho pode caber em número de bytes e ainda assim não permanecer na cache.

Nós dispersos de uma lista encadeada e consultas aleatórias em uma tabela hash grande frequentemente têm pouca localidade espacial. Um percurso por colunas em um vetor armazenado por linhas também salta muitos elementos próximos. Esses padrões trazem bytes que podem não ser usados antes da substituição. O hardware explora a localidade fornecida pelo padrão de acesso; alterar a organização ou a forma de percorrer os dados no programa pode tornar útil uma parte maior de cada bloco buscado.

Principais conclusões

  • A localidade temporal reutiliza um item; a localidade espacial acessa endereços próximos.
  • Buscar um bloco inteiro faz com que acessos posteriores a bytes próximos resultem em acerto.
  • Um conjunto de trabalho deve caber na capacidade e coexistir conforme as regras de posicionamento da cache.
  • Variáveis do código-fonte mantidas em registradores não geram acessos à cache de dados.

1.2 Células de memória, transferências e compromissos

As tecnologias de memória envolvem compromissos entre velocidade, densidade, custo e persistência. O processador precisa de acesso rápido a uma pequena quantidade de dados e de espaço acessível para uma quantidade muito maior. SRAM, DRAM e flash atendem a partes diferentes dessa necessidade.

Compare as células
TecnologiaComo um bit é armazenadoRefrescamento e energiaFunção principal
SRAMUm circuito estável, normalmente com seis transistoresSem refrescamento; perde os dados sem energiaCaches no chip
DRAMCarga em um capacitor, acessado por um transistorRefrescamento periódico; perde os dados sem energiaMemória principal
Flash NANDUma célula não volátil cujo estado é programado eletricamenteMantém os dados sem energia; suporta um número limitado de escritasArmazenamento

Uma célula SRAM é rápida, mas ocupa uma área considerável, tornando a SRAM relativamente cara por bit. As células DRAM são menores, por isso a DRAM oferece mais capacidade a um custo menor por bit. Sua carga se dissipa. O refrescamento lê e restaura linhas dentro de um intervalo fixo; a DDR4 em temperatura normal usa um intervalo de 64 ms. “Estática” em SRAM significa ausência de refrescamento, não persistência após a perda de energia.

Por que o tempo de acesso à DRAM varia

A DRAM é organizada em bancos, com linhas e colunas em cada banco. Ativar uma linha copia seu conteúdo para um buffer de linha. Leituras e escritas selecionam então colunas dessa linha aberta. Para abrir outra linha no mesmo banco, ele precisa primeiro ser pré-carregado. Um acesso a uma linha já aberta evita esse trabalho de troca de linha.

Colunas consecutivas podem ser transferidas em uma rajada, adequada à busca de um bloco de cache. Distribuir requisições entre bancos e canais permite que as transferências se sobreponham. A memória DDR transfere dados nas duas bordas do clock. Esses recursos aumentam a taxa de entrega de dados sem eliminar a espera pelos primeiros dados.

Separe latência de largura de banda

Latência é o atraso até a chegada dos primeiros dados. Largura de banda é a quantidade transferida por unidade de tempo. Uma interface de alta largura de banda ainda pode ter um longo atraso inicial.

Por exemplo, um canal DDR5-4800 com um caminho de dados agregado de 64 bits transporta 8 bytes por transferência. Sua taxa de pico é 4800×106×8=38,4×109 bytes/s, ou 38,4 GB/s. A largura de banda sustentada pela aplicação pode ser menor porque comandos, mudanças de linha e outras tarefas consomem tempo.

Se uma requisição espera 60 ns e depois recebe um bloco de 64 bytes a 16 GB/s, a taxa de transferência é de 16 bytes/ns. A transferência leva 64/16=4 ns, totalizando cerca de 64 ns. Melhorar apenas a largura de banda reduz a parte de 4 ns, não os 60 ns iniciais.

A flash mantém dados, mas trata escritas de modo diferente

A flash NAND lê e programa páginas de vários KiB. Reutilizar uma página programada exige apagar seu bloco de apagamento maior, que contém muitas páginas. Leituras de página geralmente levam dezenas de microssegundos, a programação leva de centenas de microssegundos a alguns milissegundos, e o apagamento leva milissegundos.

Ciclos de programação e apagamento desgastam as células. A flash densa de vários bits geralmente suporta alguns milhares de ciclos, enquanto células de um bit podem suportar cerca de 100.000. Os controladores usam nivelamento de desgaste para distribuir as escritas pelos blocos.

Para dar uma ideia de escala, o acesso à SRAM leva aproximadamente 1 ns, à DRAM aproximadamente 50–100 ns, leituras de NAND aproximadamente 25–100 µs e o acesso a disco aproximadamente 5–10 ms. Os dispositivos reais variam. A hierarquia combina essas tecnologias porque uma única tecnologia não consegue reunir suas vantagens de velocidade, capacidade e preço.

Principais conclusões

  • SRAM e DRAM são voláteis; a flash mantém os dados sem energia.
  • O refrescamento da DRAM restaura a carga que se dissipa, enquanto buffers de linha e rajadas melhoram a eficiência dos acessos.
  • A latência mede o tempo inicial de espera; a largura de banda mede a taxa de transferência.
  • A flash programa páginas e apaga blocos maiores.
  • O nivelamento de desgaste distribui o desgaste de programação e apagamento pelos blocos de flash.

1.3 Acompanhe um acesso pela hierarquia

A hierarquia de memória coloca armazenamento pequeno e rápido próximo ao processador e armazenamento progressivamente maior mais distante. A localidade permite que os níveis pequenos atendam a uma grande fração das requisições, enquanto os níveis inferiores fornecem capacidade.

Níveis e unidades de transferência

Um caminho típico é formado por registradores, L1, L2, L3, memória principal e armazenamento. A L1 geralmente tem caches separadas de instruções e dados de cerca de 32–64 KiB cada por núcleo. A L2 frequentemente tem de centenas de KiB a alguns MiB por núcleo, enquanto a L3 costuma ser compartilhada e conter de vários a dezenas de MiB. A memória principal contém muitos GiB, e o armazenamento contém centenas de GB ou mais. Os projetos diferem em tamanho e compartilhamento.

Em um processador próximo de 3 GHz, latências representativas de carga são de cerca de 4–5 ciclos para a L1, 12–15 para a L2, 30–50 para a L3 e 200–300 para a DRAM. Uma L1 pode aceitar uma nova requisição a cada ciclo mesmo quando uma requisição precisa de vários ciclos para terminar: vazão e latência descrevem propriedades diferentes.

Os dados trafegam pelas caches em blocos, geralmente de 64 bytes. A memória virtual usa páginas, geralmente de 4 KiB, ao mover o conteúdo das páginas entre a memória e o armazenamento. Uma linha de cache e uma página agrupam dados para fins semelhantes em escalas diferentes; não são a mesma unidade de transferência.

Acertos, faltas e tempos

Um acerto significa que um nível contém os dados solicitados. Uma falta significa que ele deve obter os dados de um nível inferior. Ambos os termos se referem ao nível verificado: uma falta na L1 ainda pode ser um acerto na L2.

A taxa de acertos é o número de acertos dividido pelo número de acessos, e a taxa de faltas é um menos a taxa de acertos. O tempo de acerto inclui a verificação do nível e a decisão sobre se a requisição acerta. A penalidade por falta é o tempo adicional necessário em uma falta para obter e entregar o bloco.

Suponha que uma cache simplificada tenha tempo de acerto de 1 ciclo, taxa de acertos de 97% e penalidade adicional por falta de 100 ciclos. Todo acesso paga 1 ciclo, enquanto 3% pagam outros 100:

1+0,03×100=4 ciclos.

Uma falta leva 101 ciclos neste exemplo. Usar 100 como o tempo completo da falta cobraria a consulta de acerto de maneira inconsistente. Mesmo uma taxa de acertos alta deixa faltas caras visíveis na média.

Quem gerencia cada nível?

O compilador atribui valores adequados aos registradores. O hardware da cache move blocos automaticamente durante cargas, armazenamentos e buscas de instruções. Os programas usam endereços; eles não selecionam entradas da cache. O sistema operacional gerencia os mapeamentos da memória virtual com suporte do hardware e trata as páginas que precisam ser trazidas para a memória principal.

Separar as instruções dos dados na L1 permite que um pipeline busque uma instrução e acesse dados simultaneamente, sem competir por uma única porta da cache. As caches inferiores geralmente são unificadas e armazenam blocos de instruções e de dados.

Algumas hierarquias são inclusivas: um bloco presente acima também tem uma cópia abaixo. Outras são exclusivas ou não inclusivas, portanto uma cópia em cada cache inferior não é garantida. Desenhe uma hierarquia como um caminho de busca e transferência, não como uma promessa de que todos os níveis contêm subconjuntos idênticos.

Aumentar a L1 pode reduzir faltas, mas aumentar o atraso de acesso e o consumo de energia. Acrescentar caches inferiores maiores permite manter a L1 rápida e atender a muitas de suas faltas antes da DRAM. Avalie esse compromisso pelo tempo de acesso, não apenas pela capacidade.

Principais conclusões

  • Um acerto ou uma falta é relativo ao nível verificado.
  • O tempo de acerto é pago em toda consulta; a penalidade por falta é um tempo adicional nas faltas.
  • Caches transferem blocos, enquanto a memória virtual usa páginas.
  • Caches L1 separadas de instruções e dados permitem acessos simultâneos no pipeline.
  • A inclusão de cache é uma escolha de projeto.
  • Uma capacidade maior deve ser avaliada em relação ao tempo de acerto e ao consumo de energia.
2

Localizar dados em caches de mapeamento direto e associativas por conjunto

Um endereço de memória deve indicar à cache onde procurar e quais bytes retornar. Divida endereços em campos, acompanhe como as requisições substituem blocos e depois ofereça a cada bloco mais opções de posicionamento por meio de conjuntos e vias. Rastros pequenos tornam visíveis as regras do hardware: um byte diferente pode resultar em acerto em um bloco carregado, enquanto um bloco usado repetidamente pode resultar em falta após um conflito. Essas regras de consulta também determinam quantas etiquetas e bits de controle a cache deve armazenar.

2.1 Encontre a etiqueta, o índice e o deslocamento

Um endereço de byte identifica um byte na memória. Uma cache busca um bloco inteiro, portanto a consulta primeiro identifica esse bloco e depois seleciona os bytes solicitados dentro dele. Em uma cache de mapeamento direto, cada bloco tem exatamente uma entrada possível.

Divida o endereço por função

Para um bloco de 2b bytes, os b bits menos significativos do endereço formam o deslocamento. Dividir o endereço do byte pelo tamanho do bloco e descartar o resto fornece o endereço do bloco. O resto é o deslocamento.

Se a cache tem E entradas, o índice da entrada é

ıˊndice=enderec¸o do bloco mod E.

Quando o número de entradas é uma potência de dois, o índice é o grupo de bits do endereço imediatamente acima do deslocamento. Os bits mais significativos restantes formam a etiqueta, que informa à cache qual dos muitos blocos que compartilham um índice está presente.

A ordem dos campos, dos bits mais aos menos significativos, é etiqueta | índice | deslocamento. Para uma largura de endereço de A bits:

b=log⁡2(bytes do bloco),s=log⁡2E,t=A−s−b.

Use o número de entradas para calcular o índice. Calcular o logaritmo da capacidade em bytes contaria os bits de deslocamento uma segunda vez.

Resolva um exemplo de 16 KiB

Uma cache de mapeamento direto de 16 KiB com blocos de 64 bytes tem 16384/64=256 entradas. O deslocamento ocupa 6 bits, o índice 8 bits e a etiqueta 32−8−6=18 bits para endereços de 32 bits.

Para o endereço de byte 0x1234ABCD, os 6 bits menos significativos dão o deslocamento 13, ou 0x0D. Remover esses bits fornece o endereço de bloco 0x48D2AF. Seus 8 bits menos significativos são 0xAF, portanto o índice é 175. Os bits restantes fornecem a etiqueta 0x48D2.

O endereço do byte pode ser reconstruído a partir desses campos: concatene a etiqueta, o índice de 8 bits e o deslocamento de 6 bits. As larguras dos campos importam porque um dígito hexadecimal representa 4 bits; os limites não precisam ficar entre dígitos hexadecimais.

Uma etiqueta correspondente precisa de uma entrada válida

Cada entrada armazena dados, uma etiqueta e um bit de validade. O índice seleciona a entrada. Um acerto exige tanto um bit de validade definido quanto igualdade entre a etiqueta armazenada e a etiqueta solicitada. Na inicialização, uma entrada pode conter bits arbitrários; o bit de validade impede que esses bits sejam confundidos com um bloco carregado.

Quando o bloco está presente, acessos a outros bytes desse bloco também resultam em acerto. Um acerto não exige o mesmo endereço de byte usado para buscar o bloco.

Conte os metadados separadamente

A capacidade de cache informada normalmente conta apenas os dados. Aqui, cada entrada contém 512 bits de dados, 18 bits de etiqueta e 1 bit de validade, ou 531 bits. O armazenamento total é

256×531=135936 bits.

Somente os dados usam 131.072 bits. Etiquetas e validade acrescentam 4.864 bits, cerca de 3,7% do armazenamento de dados. Um projeto com escrita de volta também precisa de bits de modificação; projetos mais complexos precisam de mais informações de controle.

O índice usa bits menos significativos do endereço do bloco para que blocos sucessivos se distribuam por entradas sucessivas. Um endereço mais largo mantém inalteradas as larguras do deslocamento e do índice quando a capacidade e o tamanho do bloco permanecem fixos; os bits adicionais ampliam a etiqueta.

Principais conclusões

  • Calcule o número de entradas dividindo a capacidade de dados pelo tamanho do bloco.
  • Os bits menos significativos do endereço selecionam o deslocamento do byte; os bits seguintes selecionam a entrada.
  • Um acerto exige uma entrada válida e uma etiqueta correspondente.
  • A capacidade de dados anunciada não inclui etiquetas nem bits de controle.

2.2 Acompanhe uma cache de mapeamento direto

Um rastro de acessos à cache registra como cada acesso altera os blocos armazenados. Mantenha um estado separado para cada entrada e atualize esse estado imediatamente após cada falta. A próxima requisição usa a cache atualizada, não a cache como estava no início.

Prepare o rastro

Considere uma cache de mapeamento direto de 64 bytes com quatro entradas de 16 bytes. Ela começa vazia. Para cada endereço de byte, divida por 16 para encontrar o bloco e depois calcule o bloco módulo 4 para obter o índice. A etiqueta é o número do bloco dividido por 4, com a parte fracionária descartada. Há 4 bits de deslocamento e 2 bits de índice.

Em uma leitura, examine a entrada selecionada. Se ela for válida e a etiqueta corresponder, registre um acerto. Caso contrário, registre uma falta, substitua o bloco e a etiqueta dessa entrada e defina seu bit de validade. Em uma cache de mapeamento direto, não há escolha de substituição.

Acompanhe todos os oito acessos
Endereço de byteBlocoÍndiceEtiquetaResultadoBloco que fica na entrada selecionada
0x00000Falta0
0x04000Acerto0
0x40401Falta4
0x00000Falta0
0x14110Falta1
0x44401Falta4
0x08000Falta0
0x84802Falta8

O primeiro acesso preenche a entrada 0 com o bloco 0. O endereço seguinte, 0x04, ainda está dentro desse bloco de 16 bytes, portanto resulta em acerto apesar de indicar um byte diferente. 0x40 pertence ao bloco 4. Ele tem o mesmo índice do bloco 0, mas uma etiqueta diferente, portanto substitui o bloco 0.

O segundo 0x00 resulta, portanto, em falta. O uso anterior, por si só, não garante um acerto: o bloco ainda precisa estar presente. A requisição a 0x14 carrega o bloco 1 na entrada 1, deixando a entrada 0 inalterada.

Em seguida, 0x44 carrega novamente o bloco 4 na entrada 0. 0x08 precisa do bloco 0 e substitui o bloco 4. Por fim, 0x84 carrega o bloco 8 nessa mesma entrada. Ao final, a entrada 0 contém o bloco 8 e a entrada 1 contém o bloco 1; as entradas 2 e 3 permanecem inválidas.

Interprete o comportamento

Há um acerto e sete faltas, portanto a taxa de acertos é 1/8=12,5%. Os blocos 0, 4 e 8 competem pela entrada 0. A cache tem quatro entradas, mas esse padrão de acesso usa apenas duas delas. As substituições repetidas são causadas por conflitos de mapeamento, não por falta de armazenamento total para os quatro blocos distintos.

O carregamento de um bloco disponibiliza todos os seus bytes. Em uma varredura sequencial, uma falta pode, portanto, atender a muitos dos elementos seguintes. Aqui, os acessos conflitantes eliminam repetidamente esse benefício antes de o próximo byte próximo ser solicitado.

Para obter um rastro confiável, identifique explicitamente endereços de byte e números de bloco. Aplicar módulo 4 diretamente ao endereço do byte ignora a divisão pelo tamanho do bloco e envia requisições às entradas erradas. Registre a substituição mesmo quando o novo bloco já tiver sido carregado antes: toda falta instala o bloco solicitado e sua etiqueta na entrada selecionada.

Principais conclusões

  • Atualize o conteúdo da cache após cada falta.
  • Endereços de bytes diferentes em um mesmo bloco residente resultam em acerto.
  • Um bloco acessado anteriormente pode resultar em falta após ser substituído.
  • Conflitos de mapeamento podem causar faltas enquanto outras entradas permanecem vazias.
  • O exemplo tem um acerto em oito acessos, uma taxa de acertos de 12,5%.

2.3 Ofereça mais opções de posicionamento aos blocos

Uma cache associativa por conjunto oferece a um bloco várias entradas possíveis sem precisar pesquisar toda a cache. O índice seleciona um conjunto, e o bloco pode ocupar qualquer via desse conjunto. Isso reduz conflitos entre blocos que compartilham um índice.

Calcule conjuntos e campos

Para capacidade de dados C, tamanho de bloco B e associatividade n:

blocos=C/B,conjuntos=C/(Bn).

O índice do conjunto é o endereço do bloco módulo o número de conjuntos. O deslocamento continua dependendo apenas do tamanho do bloco. A etiqueta contém os bits mais significativos restantes.

Uma cache de 32 KiB e 8 vias com blocos de 64 bytes tem 512 blocos e 64 conjuntos. Com endereços de 32 bits, as larguras do deslocamento, do índice e da etiqueta são de 6, 6 e 20 bits. O endereço 0x1234ABCD tem deslocamento 13, conjunto 47 e etiqueta 0x1234A.

Com capacidade e tamanho de bloco fixos, dobrar a associatividade reduz o número de conjuntos à metade. Um bit de índice se torna um bit de etiqueta; nenhuma capacidade de dados é acrescentada.

OrganizaçãoPosicionamento permitidoÍndice
Mapeamento diretoUma entradaSeleciona essa entrada
n viasQualquer uma das n vias de um conjuntoSeleciona esse conjunto
Totalmente associativaQualquer entrada da cacheSem campo de índice

A consulta compara a etiqueta em paralelo com todas as etiquetas válidas no conjunto escolhido. Uma via com etiqueta correspondente fornece os dados por um seletor. Mais vias exigem mais comparações e hardware de seleção, o que pode aumentar o tempo de acerto e o consumo de energia.

Substitua um bloco somente quando o conjunto estiver cheio

Use primeiro uma via inválida. Quando todas as vias estiverem ocupadas, a LRU, ou substituição do bloco menos recentemente usado, remove o bloco cujo acesso mais recente ocorreu há mais tempo. Atualize a informação de uso recente tanto em acertos quanto em carregamentos. Um conjunto de 2 vias precisa de apenas um bit para registrar sua via LRU; conjuntos maiores frequentemente usam aproximações pseudo-LRU.

A FIFO remove o bloco carregado primeiro, mesmo que ele tenha sido acessado recentemente. A substituição aleatória escolhe uma vítima sem manter todas as informações de uso recente. Ela é simples e pode ter desempenho próximo ao da LRU em caches grandes.

Retome o pequeno rastro com duas vias

A cache de 64 bytes com blocos de 16 bytes agora tem dois conjuntos de duas vias. Os blocos 0, 4 e 8 são mapeados para o conjunto 0, enquanto o bloco 1 é mapeado para o conjunto 1. Para 0x00, 0x04, 0x40, 0x00, 0x14, 0x44, 0x08, 0x84, os resultados são falta, acerto, falta, acerto, falta, acerto, acerto, falta.

Os blocos 0 e 4 podem coexistir, portanto seus acessos repetidos resultam em acerto. Pouco antes do último acesso, o bloco 0 foi usado mais recentemente que o bloco 4. Pela LRU, carregar o bloco 8 substitui o bloco 4. Quatro dos oito acessos resultam em acerto, em comparação com um na versão de mapeamento direto.

A associatividade não pode eliminar faltas compulsórias nem fazer caber um conjunto de trabalho maior que a capacidade. Ela também não pode impedir conflitos quando mais de n blocos muito usados competem por um conjunto de n vias. Um ciclo repetido de n+1 desses blocos pode fazer a LRU apresentar falta todas as vezes. Acrescentar preenchimento aos vetores pode mudar seus mapeamentos de conjunto; escolher mais vias é apenas uma possível resposta a um problema de conflito.

Principais conclusões

  • O número de conjuntos é a capacidade de dados dividida pelo tamanho do bloco e pelo número de vias.
  • Maior associatividade altera a flexibilidade de posicionamento, não a capacidade de dados.
  • A LRU acompanha os acessos; a FIFO acompanha a ordem de inserção.
  • Preencha vias inválidas antes de substituir blocos válidos.
  • Caches totalmente associativas não têm campo de índice, mas ainda apresentam faltas de início a frio e de capacidade.
  • Mais vias podem reduzir faltas de conflito, com custo de hardware e de tempo.
3

Explicar faltas na cache e políticas de escrita

Uma falta pode resultar do primeiro uso, de capacidade limitada ou de blocos que competem pelas mesmas posições. Identificar sua causa ajuda a explicar quais mudanças de projeto podem reduzi-la. As instruções de armazenamento acrescentam um segundo problema: a hierarquia deve decidir quando os dados alterados chegam ao próximo nível e o que acontece se o bloco estiver ausente. Acompanhe o atendimento a faltas de leitura, políticas de escrita, buffers e substituições de blocos modificados para relacionar o estado da cache ao tráfego e aos atrasos que ele produz.

3.1 Explique o que causou uma falta

Uma falta na cache é um evento que tem tanto um mecanismo quanto uma causa. O mecanismo descreve como a requisição é atendida. A causa explica por que o bloco necessário estava ausente e qual mudança de projeto poderia ajudar.

Trate uma falta de leitura

Em um pipeline simples com execução em ordem, a cache detecta uma entrada inválida ou uma etiqueta diferente, e o processador para. A cache solicita o bloco ao próximo nível. Se a vítima escolhida estiver modificada, seus dados alterados devem ser preservados por meio da escrita de volta. O bloco recebido é instalado com sua etiqueta e seu bit de validade, e o acesso que aguardava é concluído. Uma falta na cache de instruções também espera pelo bloco da instrução e depois busca a instrução novamente.

A técnica de palavra crítica primeiro solicita primeiro a palavra necessária no bloco que está sendo transferido. O reinício antecipado permite que a execução recomece assim que essa palavra chega. Uma cache não bloqueante pode atender a outros acertos e acompanhar faltas pendentes enquanto um processador com execução fora de ordem realiza trabalho independente. Esses mecanismos reduzem a espera; eles não fazem desaparecer a dependência original dos dados.

Use os três Cs
Classe de faltaPor que o bloco está ausenteTeste de diagnóstico
CompulsóriaEste é seu primeiro acessoHaveria falta mesmo com capacidade ilimitada
CapacidadeOs blocos ativos excedem o espaço disponívelUma cache LRU totalmente associativa do mesmo tamanho também apresenta falta
ConflitoRestrições de posicionamento o substituíramUma cache LRU totalmente associativa do mesmo tamanho apresenta acerto

Aplique primeiro o teste de primeiro acesso. O primeiro acesso a um bloco é compulsório mesmo que sua entrada de destino já esteja ocupada. Para faltas posteriores, compare a cache real com uma cache LRU totalmente associativa de mesma capacidade de dados e mesmo tamanho de bloco, ambas recebendo o mesmo histórico de acessos.

No rastro anterior com quatro entradas, os blocos 0, 4, 1 e 8 causam, cada um, uma falta compulsória. A cache de mapeamento direto também apresenta faltas nos acessos repetidos aos blocos 0 e 4. Uma cache totalmente associativa de quatro entradas consegue manter os quatro blocos distintos, portanto essas três faltas repetidas são de conflito. Não há faltas de capacidade.

Escolha uma mudança que trate a causa

Aumentar a capacidade pode manter um conjunto de trabalho maior. Aumentar a associatividade pode permitir que blocos conflitantes coexistam. Aumentar o tamanho do bloco pode explorar a localidade espacial ao trazer mais dados vizinhos úteis a cada carregamento.

O tamanho do bloco tem efeitos opostos. Com capacidade de dados fixa, blocos maiores significam menos blocos residentes. Bytes não usados consomem espaço na cache, blocos úteis não relacionados podem ser deslocados e cada transferência pode demorar mais. A taxa de faltas frequentemente cai no início à medida que o tamanho do bloco aumenta e depois sobe quando esses custos superam o benefício da localidade espacial.

Uma cache maior também pode ter uma consulta mais longa, e vias adicionais exigem mais hardware de comparação. Avalie as mudanças pelo tempo médio de acesso, incluindo o tempo de acerto e a penalidade por falta, em vez de supor que uma taxa de faltas menor garante um projeto mais rápido.

Em sistemas de múltiplos núcleos, a invalidação após a escrita de outro núcleo pode causar faltas de coerência. A pré-busca pode trazer um bloco de primeiro uso antes de seu acesso por demanda, ocultando uma falta por demanda que a capacidade adicional, por si só, não pode evitar.

Principais conclusões

  • Classifique primeiros acessos como compulsórios antes de verificar outras causas.
  • Use uma cache LRU totalmente associativa do mesmo tamanho para distinguir faltas de capacidade e de conflito.
  • Blocos maiores oferecem localidade espacial útil, mas resultam em menos blocos residentes e transferências mais longas.
  • Reinício antecipado, palavra crítica primeiro e caches não bloqueantes reduzem a espera de maneiras diferentes.
  • Compare o tempo completo de acesso ao avaliar uma melhoria na taxa de faltas.

3.2 Decida quando as escritas chegam ao próximo nível

Uma instrução de armazenamento altera um valor, portanto a hierarquia precisa de uma regra para transmitir essa mudança ao nível inferior. Há duas escolhas separadas: o que fazer quando uma escrita resulta em acerto e o que fazer quando resulta em falta.

Escrita direta e escrita de volta
PolíticaAção em um acerto de escritaEfeito no próximo nível
Escrita diretaAtualiza a cache e envia a escrita ao nível inferiorCada escrita gera uma atualização no nível inferior
Escrita de voltaAtualiza a cache e marca seu bloco como modificadoUm bloco modificado é enviado ao nível inferior quando substituído

Um bit de modificação registra que um bloco com escrita de volta contém alterações ainda não escritas no próximo nível. Uma vítima não modificada não precisa de escrita de volta. Os dados alterados de uma vítima modificada devem ser preservados antes que sua entrada possa ser reutilizada. As leituras do processador obtêm o novo valor da cache mesmo enquanto a cópia inferior está desatualizada.

Para 100 escritas em uma variável de 4 bytes armazenada na cache, a escrita direta sem agrupamento envia 100 escritas, ou 400 bytes de dados úteis. A escrita de volta pode combinar essas alterações em uma escrita de bloco de 64 bytes na substituição. Essa comparação conta os dados úteis das atualizações, excluindo o carregamento inicial e a sobrecarga de protocolo.

O benefício depende da reutilização. Escritas repetidas em um bloco dão à escrita de volta a oportunidade de combinar atualizações; escritas espalhadas por muitos blocos podem levar a muitas substituições de blocos modificados. Caches inferiores geralmente usam escrita de volta para limitar o tráfego em direção à DRAM. Caches L1 de dados podem usar qualquer uma das políticas.

Um buffer de escrita oculta a espera, não o tráfego

Um buffer de escrita enfileira escritas pendentes para o nível inferior. Com escrita direta, o processador pode continuar assim que uma escrita entra no buffer, em vez de esperar a memória inferior terminar. O nível inferior se atualiza à medida que as escritas no buffer são processadas; ele pode ficar temporariamente atrás do valor na cache.

O buffer tem capacidade finita. Se as escritas chegarem mais rápido do que o nível inferior consegue aceitá-las por tempo suficiente, ele enche e o processador para. Um buffer altera quando o processador espera, não a largura de banda sustentável do destino.

Sem buffer ou sobreposição, se 10% das instruções forem de armazenamento e cada uma acrescentar 100 ciclos de espera, um CPI básico de 1 passa a ser 1+0,1×100=11. O buffer pode ocultar grande parte desse atraso quando o destino acompanha o ritmo em média.

Trate uma falta de escrita separadamente

A alocação na escrita busca o bloco ausente para a cache e depois aplica a escrita. Ela combina naturalmente com a escrita de volta porque acessos e escritas posteriores podem reutilizar esse bloco. A política sem alocação na escrita, também chamada de write-around, envia a escrita ao nível inferior sem carregar o bloco nessa cache. Ela combina naturalmente com a escrita direta e pode evitar o deslocamento de blocos úteis durante uma sequência de saída usada uma única vez.

Essas são escolhas independentes de política. Saber que uma cache usa escrita direta não informa, por si só, se uma falta de escrita aloca uma linha; um rastro deve especificar as duas políticas.

Uma falta em uma cache com escrita de volta que seleciona uma vítima modificada envolve dados de saída além do carregamento de entrada, aumentando a penalidade, a menos que buffers ou sobreposição ocultem parte do trabalho. Outros núcleos e dispositivos de entrada e saída também precisam de uma visão consistente quando a memória inferior está desatualizada. A coerência e os mecanismos do sistema coordenam essa visibilidade; um bit de modificação apenas registra alterações pendentes.

Principais conclusões

  • A escrita direta envia cada escrita ao nível inferior; a escrita de volta adia as alterações até a escrita do bloco modificado.
  • Um bit de modificação distingue blocos modificados de blocos não modificados.
  • Buffers de escrita ocultam a latência até encherem; eles não criam largura de banda.
  • As políticas com e sem alocação na escrita especificam o comportamento em faltas de escrita independentemente da política para acertos.
  • A substituição de um bloco modificado acrescenta tráfego de saída ao atendimento da falta.
  • A escrita direta com buffer pode deixar o nível inferior temporariamente desatualizado.
4

Calcular o desempenho da cache

Um projeto de cache só é útil se seus acertos e faltas resultarem em melhor tempo de execução. Combine tempo de consulta, frequência de faltas e atraso adicional por falta e depois relacione os custos de acesso às paradas por instrução. Separe o tráfego de instruções e dados, mantenha a consistência entre ciclos e tempo de clock e aninhe os custos das caches inferiores usando a fração de requisições que chega a cada nível. Esses cálculos mostram por que uma taxa de faltas menor ou um clock mais rápido pode trazer um benefício menor que o esperado.

4.1 Calcule o tempo médio de acesso à memória

Uma taxa de acertos alta é útil, mas não é uma medida completa de desempenho. Um pequeno número de faltas caras pode dominar a média, e um projeto que evita mais faltas ainda pode perder se sua consulta ficar lenta demais.

Comece com as definições de taxas e tempos
taxa de acertos=acertosacessos,taxa de faltas=faltasacessos.

As duas frações somam um. Converta porcentagens em frações antes de multiplicar: 5% é 0,05.

O tempo médio de acesso à memória, ou AMAT, é

AMAT=tempo de acerto+taxa de faltas×penalidade por falta.

Toda requisição verifica a cache, inclusive as que resultam em falta. A penalidade é o atraso adicional após essa consulta. De modo equivalente, pondere o tempo de acerto pela fração de acertos e o tempo total de falta pela fração de faltas; desenvolver a expressão fornece a mesma fórmula.

Com tempo de acerto de 1 ciclo, 5% de faltas e penalidade adicional de 100 ciclos, o AMAT é 1+0,05×100=6 ciclos. A 2 GHz, cada ciclo dura 0,5 ns, portanto isso equivale a 3 ns. Faça toda a aritmética em ciclos ou toda em tempo e depois converta o resultado final, se necessário.

Compare projetos completos

A cache A tem consulta de 1,0 ns e 5% de faltas. A cache B tem consulta de 1,2 ns e 3,5% de faltas. Com penalidade de 50 ns:

A=1+0,05×50=3,5 ns, B=1,2+0,035×50=2,95 ns.

B vence porque evitar faltas caras compensa mais do que a consulta mais lenta. Se a penalidade cair para 10 ns, A levará 1,5 ns e B levará 1,55 ns. Agora A vence. Uma melhoria na taxa de faltas tem valor proporcional à penalidade que evita.

Pondere corretamente os acessos a instruções e dados

Suponha que cada instrução produza uma busca de instrução e, em média, 0,3 acesso a dados. A taxa de faltas de instruções é de 2%, e a taxa de faltas de dados é de 4%. Em 100 instruções, há 100 buscas e 30 acessos a dados. As faltas esperadas são 100×0,02+30×0,04=3,2 em 130 acessos.

A fração combinada de faltas é, portanto, 0,02+0,3×0,041,3. Com tempos de acerto iguais de 1 ciclo e penalidades de 100 ciclos, o AMAT é de cerca de 3,46 ciclos por acesso à memória. Calcular diretamente a média de 2% e 4% daria erroneamente o mesmo peso aos dois tipos de acesso.

Estime uma penalidade de transferência

Uma requisição de bloco pode incluir a latência inicial seguida pelo tempo de transferência. Com latência de 60 ns, uma linha de cache de 64 bytes e largura de banda de 16 GB/s, a transferência leva 4 ns, resultando em uma penalidade adicional de cerca de 64 ns. A 3 GHz, há 3 ciclos/ns, portanto isso equivale a 192 ciclos.

Verifique o que os tempos de um problema incluem. Se ele fornecer o tempo completo de acesso com falta, subtraia a consulta de acerto antes de tratar esse número como uma penalidade adicional por falta. Cobrar a consulta duas vezes superestima o AMAT.

Principais conclusões

  • O AMAT soma a consulta de acerto ao custo adicional esperado das faltas.
  • Use frações decimais para as faltas e uma unidade de tempo consistente.
  • Pondere as taxas de instruções e dados pelo número de acessos de cada tipo.
  • Uma taxa de faltas menor pode perder para um tempo de acerto suficientemente mais lento.

4.2 Converta faltas em tempo de execução

O AMAT mede o tempo por acesso à memória. O CPI mede os ciclos por instrução executada. Para relacioná-los, conte quantas requisições de instrução e de dados cada instrução produz e quantos ciclos de parada essas requisições acrescentam.

Some os termos de parada

Para um processador simples com execução em ordem cujos acertos na cache estão incluídos no CPI básico, uma falta sem sobreposição acrescenta sua penalidade adicional. Com taxa de faltas de instruções mI, acessos a dados por instrução fD, taxa de faltas de dados mD e penalidade P em ciclos:

CPI de parada=mIP+fDmDP, tempo de CPU=contagem de instruc¸o˜es×(CPI baˊsico+CPI de parada)×perıˊodo de clock.

Nesse modelo, cada instrução tem uma requisição de busca de instrução. Apenas cargas e armazenamentos fazem requisições de dados, portanto multiplique sua taxa de faltas por sua frequência. Se suas penalidades forem diferentes, use uma penalidade separada em cada termo.

Passe das requisições às paradas

Considere CPI básico de 1,0, taxa de faltas de instruções de 2%, frequência de carga e armazenamento de 30%, taxa de faltas de dados de 4% e penalidade por falta de 100 ciclos. As paradas por instruções são 0,02×100=2,0 ciclos por instrução. As paradas por dados são 0,3×0,04×100=1,2. O CPI total é 4,2.

Com uma cache perfeita, o CPI voltaria a 1,0. Com o mesmo clock e a mesma contagem de instruções, isso representaria uma aceleração de 4,2 vezes. A taxa de faltas de dados é o dobro da taxa de faltas de instruções, mas as faltas de instruções custam mais tempo no total porque toda instrução é buscada e apenas 30% acessam dados.

Não insira o AMAT diretamente como CPI. O AMAT é por acesso e inclui o tempo de atendimento do acerto. O cálculo de CPI aqui acrescenta apenas as paradas além da execução básica já contabilizada.

Um clock mais rápido faz cada espera pela memória custar mais ciclos

A latência da DRAM em nanossegundos não diminui quando o clock do processador aumenta. Dobrar o clock converte a mesma espera de 100 ciclos pela memória em 200 ciclos no novo clock. O CPI do exemplo passa a ser

1+0,02×200+0,3×0,04×200=7,4.

Cada novo ciclo tem metade da duração, portanto o tempo de execução relativo muda de 4,2 ciclos antigos por instrução para o equivalente a 3,7 ciclos antigos. A aceleração é 4,2/3,7≈1,14, muito abaixo de dois.

Melhorias deslocam o gargalo

Se o CPI básico cair de 1,0 para 0,5 enquanto as paradas de memória permanecerem em 3,2, o CPI total passará a ser 3,7. As paradas passam a consumir 3,2/3,7≈86% dos ciclos. Melhorar o núcleo faz com que o atraso inalterado da memória represente uma parcela maior do tempo de execução, um exemplo da lei de Amdahl.

O modelo simples conta todos os atrasos de faltas como paradas. A execução fora de ordem e as caches não bloqueantes podem sobrepor faltas a trabalho útil ou a outras faltas. Contadores de hardware e medições de tempo de execução são necessários para avaliar essa sobreposição em uma máquina real. Ao comparar projetos com esse modelo, mantenha o mesmo fluxo de instruções e informe quais atrasos já estão incluídos no CPI básico.

Principais conclusões

  • Conte faltas de instruções para toda instrução e faltas de dados apenas para acessos a dados.
  • Acrescente paradas adicionais por falta a um CPI básico que já inclui acertos.
  • Converta novamente o tempo de memória em ciclos quando a frequência de clock mudar.
  • Compare o tempo de execução pelo CPI multiplicado pelo período de clock, não apenas pelo CPI.
  • A sobreposição pode fazer as paradas reais serem menores que a soma simples das penalidades por falta.

4.3 Aninhe os custos de vários níveis de cache

Uma cache inferior reduz a penalidade paga quando há uma falta na L1. Ela tem seu próprio tempo de consulta e sua própria taxa de faltas, portanto o custo esperado da hierarquia deve acompanhar a fração de requisições que chega a cada nível.

Relacione a taxa ao seu denominador

A taxa local de faltas de um nível é seu número de faltas dividido pelas requisições a esse nível. Sua taxa global de faltas é seu número de faltas dividido por todas as requisições de memória do processador.

Se a L1 apresentar falta em 4% das vezes e a L2 apresentar falta em 25% dessas requisições, apenas 0,04×0,25=0,01, ou 1% das requisições originais, chegarão à memória. Uma taxa local de faltas da L2 de 25% não informa, por si só, a fração de todas as requisições que chega à memória: a L1 filtrou o fluxo primeiro.

Para dois níveis verificados sequencialmente:

AMAT=H1+m1(H2+m2P).

Aqui, H1 e H2 são tempos de consulta, m1 e m2 são frações locais de faltas, e P é a penalidade adicional da memória. Apenas faltas na L1 pagam pela consulta à L2. Apenas faltas nos dois níveis pagam a penalidade da memória.

Avalie de dentro para fora

Use tempo de acerto da L1 de 1 ciclo, taxa de faltas da L1 de 4%, tempo de acerto da L2 de 12 ciclos, taxa local de faltas da L2 de 25% e penalidade da memória de 200 ciclos. Uma requisição que chega à L2 leva, em média, 12+0,25×200=62 ciclos adicionais. Assim,

AMAT=1+0,04×62=3,48 ciclos.

Sem a L2, o AMAT seria 1+0,04×200=9 ciclos. A consulta à L2 acrescenta trabalho a cada falta na L1, mas impede que a maioria dessas requisições pague o atraso muito maior da memória.

Não substitua m2 dentro dos parênteses pela taxa global de faltas da L2 de 1%. Isso multiplicaria pela fração de faltas da L1 duas vezes. Uma forma expandida equivalente usa diretamente a taxa global:

AMAT=H1+m1H2+(m1m2)P.
Acrescente a L3 usando a mesma lógica

Com tempo de acerto da L3 de 40 ciclos e taxa local de faltas de 40%, o termo de atendimento da L3 é 40+0,4×200=120 ciclos. O termo da L2 passa a ser 12+0,25×120=42 ciclos. O AMAT total é 1+0,04×42=2,68 ciclos.

A expressão completa é H1+m1(H2+m2(H3+m3P)). A L3 é cobrada apenas das requisições que resultam em falta nos dois níveis superiores. Um nível com consulta muito lenta ou pouquíssimos acertos pode acrescentar mais atraso do que economiza.

Use taxas por instrução para o CPI

Suponha que o CPI básico seja 1, que a L1 produza 0,032 falta por instrução e que a memória acrescente 100 ciclos. Sem L2, o CPI é 1+0,032×100=4,2. Acrescente uma L2 de 10 ciclos cuja taxa local de faltas seja de 25%:

CPI=1+0,032×10+0,032×0,25×100=2,12.

Com o mesmo clock, a aceleração é 4,2/2,12≈1,98. O valor 0,032 já representa faltas por instrução, portanto outro multiplicador de frequência de acesso contaria essa frequência duas vezes.

Principais conclusões

  • Taxas locais e globais de faltas têm denominadores diferentes.
  • Multiplique as frações locais de faltas para encontrar a fração que chega a um nível inferior.
  • Avalie tempos de atendimento aninhados do nível mais baixo para cima.
  • Cobre o tempo de consulta de um nível inferior apenas das requisições que chegam a esse nível.
  • Use diretamente as faltas por instrução ao calcular o CPI de parada.
  • Acrescentar uma cache só ajuda quando o atraso evitado supera o trabalho adicional de consulta.
5

Explicar como a memória virtual e as TLBs se integram à hierarquia

Os programas emitem endereços virtuais, enquanto as caches identificam os dados físicos ao final do processo. As tabelas de páginas fornecem o mapeamento e os direitos de acesso, e uma TLB mantém traduções usadas recentemente próximas ao processador. Acompanhe uma tradução de endereço, distinga uma tradução ausente de uma falta de página e veja como a indexação da cache pode se sobrepor à tradução. As mesmas ideias de hierarquia se aplicam aqui, mas entradas de tradução, blocos de dados e páginas têm funções diferentes.

5.1 Traduza páginas e verifique permissões

A memória virtual separa os endereços usados por um programa das posições que contêm seus dados na memória principal. Cada processo recebe seu próprio espaço de endereçamento virtual. O hardware traduz endereços usando mapeamentos do sistema operacional e verifica se cada acesso solicitado é permitido.

Substitua o número da página e preserve o deslocamento

Uma página é uma região de tamanho fixo de endereços virtuais. Um quadro de página é uma posição do tamanho de uma página na memória física. Com páginas de 4 KiB, cada página contém 4096 bytes, portanto o deslocamento na página precisa de 12 bits. Os bits mais significativos restantes do endereço virtual formam o número da página virtual, ou VPN.

Uma entrada da tabela de páginas, ou PTE, mapeia um VPN para um número da página física, ou PPN. A tradução substitui o número da página, mas preserva o deslocamento: a mesma posição de byte é selecionada dentro do quadro físico.

Para o endereço virtual 0x00403A7C, os 12 bits menos significativos fornecem o deslocamento 0xA7C, e o VPN é 0x00403. Se esse VPN for mapeado para o PPN 0x02F1C, o endereço físico será 0x02F1CA7C. Acrescentar um deslocamento de 12 bits equivale a multiplicar o PPN por 4096 e somar o deslocamento; somar o PPN sem deslocá-lo produziria o endereço errado.

Um mapeamento inclui permissões

Uma PTE registra validade, um número de página física e permissões como leitura, escrita, execução e acesso de usuário. Bits de acesso e de modificação registram o uso e a alteração. Um registrador privilegiado do processador identifica a tabela de páginas; o RISC-V usa satp. Programas de usuário não podem reescrever livremente esses mapeamentos.

Tabelas de páginas separadas permitem que o mesmo endereço virtual se refira a dados físicos diferentes em processos diferentes. Elas também permitem compartilhamento selecionado: dois processos podem mapear páginas virtuais para o mesmo quadro físico, por exemplo, para compartilhar código de biblioteca somente de leitura. Isolamento e compartilhamento são ambos consequências de mapeamentos controlados.

Uma falta de página precisa da atenção do sistema operacional

Uma falta de página é uma exceção gerada quando a tradução ou suas verificações de permissão não podem ser concluídas normalmente. Uma escrita em um mapeamento somente de leitura pode causar uma falta mesmo que a página já esteja na memória.

Quando uma página necessária está ausente da memória principal, o sistema operacional obtém um quadro físico, lê a página do armazenamento, atualiza o mapeamento e reinicia a instrução. Uma página vítima modificada pode precisar primeiro de escrita de volta. Algumas faltas são resolvidas sem armazenamento, como ao estabelecer um mapeamento para uma página existente ou tratar cópia na escrita. Um acesso que o sistema não pode permitir pode, por sua vez, terminar em erro de processo.

Faltas que exigem acesso ao armazenamento são caras. A 3 GHz, um atraso de 50 µs custa 150.000 ciclos, e 1 ms custa 3.000.000. Páginas grandes distribuem os custos de transferência por muitos bytes. Uma página virtual pode ocupar qualquer quadro adequado, e páginas modificadas usam escrita de volta porque enviar cada escrita ao armazenamento seria lento demais.

Tabelas de páginas também consomem memória

Uma tabela plana para endereços virtuais de 32 bits e páginas de 4 KiB precisa de 232−12=220 entradas. Com 4 bytes por entrada, isso equivale a 4 MiB por processo. Projetos reais usam tabelas multinível para evitar alocar uma tabela plana enorme para espaços de endereçamento esparsos; o RISC-V Sv39 usa três níveis.

A memória virtual inclui tradução de endereços, proteção e compartilhamento mesmo quando todas as páginas usadas cabem na DRAM. A paginação para o armazenamento é um uso desse mecanismo, não sua finalidade completa.

Principais conclusões

  • A tradução altera o número da página e preserva o deslocamento na página.
  • As permissões da PTE controlam leitura, escrita, execução e acesso de usuário.
  • Uma falta de página pode indicar uma página ausente ou um problema de permissão.
  • Algumas faltas de página são resolvidas sem leitura do armazenamento.
  • As tabelas de páginas permitem o isolamento de processos e o compartilhamento deliberado.
  • Uma tabela plana tem uma entrada por página virtual, portanto seu custo de armazenamento pode ser grande.

5.2 Armazene traduções em uma TLB

A tradução de endereços pode exigir várias leituras da tabela de páginas antes que um acesso a dados prossiga. Entradas da tabela de páginas podem resultar em acerto nas caches comuns, mas essas leituras ainda acrescentam trabalho. O buffer de tradução de endereços, ou TLB, armazena traduções usadas recentemente para que a maioria dos acessos possa evitar um percurso da tabela de páginas.

Acompanhe um acesso permitido

O número da página virtual é procurado na TLB. Uma entrada correspondente fornece o número da página física e informações de permissão. Após as verificações de permissão, o endereço físico identifica os dados na hierarquia de cache.

Em uma falta na TLB, um percurso da tabela de páginas obtém a tradução. Se o mapeamento for válido e permitir a requisição, a tradução será instalada na TLB e o acesso continuará. RISC-V e x86-64 normalmente usam mecanismos de percurso em hardware; algumas arquiteturas usam rotinas de software. Se o mapeamento não puder atender à requisição, o processador gerará uma falta de página para o sistema operacional.

Uma falta na TLB pode, portanto, acompanhar um acerto ou uma falta na cache de dados. Ela indica que a tradução estava ausente da TLB, não que a página estava ausente da DRAM. Por outro lado, um acerto na TLB pode acompanhar uma falta na cache ou uma falta de permissão para um acesso proibido. Tradução e presença dos dados respondem a perguntas diferentes.

Calcule a memória coberta pelas traduções

A cobertura da TLB é o número de entradas multiplicado pelo tamanho da página. Uma TLB de 64 entradas com páginas de 4 KiB cobre 256 KiB de uma vez. Com páginas de 2 MiB, 64 entradas cobrem 128 MiB. Acessar muitas páginas diferentes pode esgotar a capacidade de tradução mesmo quando apenas alguns bytes de cada página são usados.

TLBs de primeiro nível frequentemente contêm dezenas de entradas; níveis inferiores de TLB podem conter centenas ou milhares. Suas entradas incluem etiquetas de número de página, mapeamentos físicos, permissões e, muitas vezes, identificadores de espaço de endereçamento. A localidade dentro das páginas e a reutilização em acessos próximos mantêm altas as taxas de acertos de tradução.

Por exemplo, se 1% dos acessos exigirem um percurso de 30 ciclos e o tempo de acerto na TLB estiver oculto, os percursos acrescentarão, em média, 0,01×30=0,3 ciclos por acesso. Esse exemplo supõe que os percursos sejam concluídos normalmente e exclui o atendimento a faltas de página.

Sobreponha a indexação à tradução

Uma cache com índice físico e etiqueta física espera por um endereço físico antes de selecionar seu conjunto. Uma cache com índice virtual e etiqueta física, ou cache VIPT, começa a ler um conjunto enquanto a TLB traduz e depois compara as etiquetas físicas.

O projeto VIPT simples obtém todos os bits de índice e de deslocamento no bloco do deslocamento na página, pois a tradução preserva esses bits. Isso exige

capacidade da cachevias≤tamanho da paˊgina.

Com páginas de 4 KiB, uma cache de 32 KiB e 8 vias tem 4 KiB por via e atende à condição. Uma cache de 48 KiB e 12 vias também atende. Uma cache de 64 KiB e 8 vias tem 8 KiB por via e precisa de um bit do número da página para indexação, portanto exige mais vias ou tratamento adicional.

Mantenha atualizados os mapeamentos armazenados

As traduções pertencem a espaços de endereçamento. Uma troca de contexto pode esvaziar entradas antigas ou distingui-las com identificadores de espaço de endereçamento, ou ASIDs. Mudanças nos mapeamentos exigem a manutenção correspondente da cache de traduções; o RISC-V fornece sfence.vma. Quando uma página é removida da memória, sua tradução antiga não deve continuar utilizável na TLB. A TLB contém mapeamentos e direitos de acesso, enquanto caches comuns contêm os dados e as instruções do programa.

Principais conclusões

  • Uma TLB armazena traduções e permissões, não dados do programa.
  • Um percurso bem-sucedido da tabela de páginas resolve uma falta na TLB sem uma falta de página.
  • A cobertura da TLB é o número de entradas multiplicado pelo tamanho da página.
  • A indexação VIPT simples mantém os bits de índice e de deslocamento no bloco dentro do deslocamento na página.
  • ASIDs e a invalidação de traduções impedem o uso de mapeamentos do espaço de endereçamento errado ou de um mapeamento antigo.
6

Escrever programas que considerem o funcionamento da cache

Laços e organizações de dados determinam quais bytes um processador solicita em seguida. Acompanhe esses endereços para melhorar a localidade espacial, preservar dados úteis por meio da blocagem e entender quando a pré-busca pode ocultar uma espera. Compare percursos por linhas e colunas, organizações de registros e ocupações de memória dos blocos antes de medir uma mudança. Capacidade, conflitos de conjunto, cobertura de tradução e largura de banda da memória ajudam a explicar por que uma transformação funciona em uma carga de trabalho e ajuda menos em outra.

6.1 Escolha laços e organizações que usem cada linha de cache

Código que considera o funcionamento da cache aproveita os bytes buscados antes que seu bloco seja substituído. Comece pelos endereços gerados pelo laço interno. Depois, pergunte quais dados são reutilizados, qual é a distância entre os acessos e se esses blocos podem coexistir na cache.

Percorra vetores na ordem de armazenamento

C e C++ armazenam vetores retangulares por linhas. Colunas adjacentes de uma linha são adjacentes na memória. Fortran, MATLAB e Julia usam armazenamento por colunas; vetores NumPy usam armazenamento por linhas por padrão. O percurso interno eficiente segue a organização real dos dados.

Um vetor em C double a[1024][1024] ocupa 8 MiB. Cada linha da matriz ocupa 8.192 bytes. Com linhas de cache de 64 bytes, cada uma comporta oito valores double. Um percurso por linhas pode usar todos os oito antes de avançar, resultando em aproximadamente uma falta de início a frio a cada oito acessos em um modelo simples de busca por demanda.

Um percurso por colunas avança 8.192 bytes entre acessos consecutivos. Ele acessa 1.024 linhas de cache distintas antes de voltar a dados próximos na coluna seguinte. Essas linhas ocupam 64 KiB, ultrapassando uma L1 de 32 KiB. Elas também entram em conflito: em uma cache de 64 conjuntos, um passo de 128 linhas de cache preserva o índice do conjunto. Um conjunto de 8 vias não consegue conter 1.024 linhas concorrentes.

Acrescentar preenchimento a uma linha da matriz até ela ter 1.032 valores double faz seu passo chegar a 8.256 bytes, ou 129 linhas de cache. Linhas sucessivas da matriz avançam então um conjunto módulo 64, distribuindo as requisições. O preenchimento trata conflitos de mapeamento; a quantidade de dados continua importando.

Intercambie laços quando o resultado for preservado

O intercâmbio de laços muda qual laço é executado dentro de outro. Para multiplicação de matrizes armazenadas por linhas, a ordem i, j, k percorre uma linha de A, mas uma coluna de B. Em um modelo de varredura de dados grandes com pouca reutilização entre passagens, isso custa cerca de 1/8+1=1,125 falta por iteração interna.

Com i, k, j, o laço interno percorre linhas de B e C, enquanto um elemento de A é reutilizado. Contar uma nova sequência para ambas as linhas resulta em cerca de 1/8+1/8=0,25 falta por iteração, 4,5 vezes menos. Se a linha de C atualizada repetidamente permanecer na cache, a contagem se aproximará de 0,125. A capacidade da cache e os conflitos determinam qual reutilização é preservada.

O intercâmbio deve preservar o comportamento exigido da computação. Dependências, ponteiros sobrepostos e ordem de avaliação de ponto flutuante podem restringir transformações; compiladores precisam de prova de que uma mudança é permitida.

Busque os campos que você usa

Um vetor de estruturas agrupa todos os campos de um objeto. Uma estrutura de vetores agrupa um campo ao longo dos objetos. Se um registro de partícula contiver oito valores double em uma linha de cache de 64 bytes, somar apenas x em um milhão de registros alinhados buscará cerca de 64 MB. Um vetor x contíguo e separado buscará cerca de 8 MB, usando cada valor double trazido. Código que usa todos os campos de cada partícula juntos pode favorecer a organização original em estruturas.

Nós encadeados podem estar espalhados, e cada próximo endereço pode depender de um ponteiro recém-carregado. Vetores contíguos ou áreas de alocação de nós podem melhorar a localidade. Campos compactos usados com frequência também permitem que mais dados ativos caibam em cada nível.

Meça o tempo de execução e os contadores de hardware relevantes antes e depois de uma mudança. Faltas na cache podem explicar um laço lento, mas computação, largura de banda ou desvios podem ser o fator limitante. Mantenha comparáveis a entrada e os resultados para que uma diferença de velocidade reflita a mudança avaliada.

Principais conclusões

  • Ajuste o laço interno à ordem de armazenamento do vetor.
  • Passos grandes que são potências de dois podem concentrar requisições em um conjunto.
  • O preenchimento altera o mapeamento; organizações compactas reduzem os bytes buscados.
  • O intercâmbio de laços deve preservar o comportamento exigido da computação.
  • Escolha vetores de estruturas ou estruturas de vetores conforme os campos usados.
  • Meça o gargalo e verifique os resultados ao alterar o código.

6.2 Reutilize blocos e busque dados antecipadamente

O intercâmbio de laços melhora a ordem de acesso. A blocagem, também chamada de tiling, vai além ao manter uma pequena região de dados ativa até que sua reutilização útil termine. A pré-busca antecipa uma transferência futura para que seu atraso se sobreponha a trabalho útil.

Mantenha um grupo de blocos residente

Na multiplicação com blocagem de matrizes quadradas, um bloco de A e um bloco de B contribuem para um bloco de C. Um bloco de lado b contém b2 elementos. Trabalhar repetidamente nesses blocos pequenos reutiliza dados antes de passar à próxima região.

Para valores double de 8 bytes, três blocos exigem 3b2×8=24b2 bytes. Em uma cache de 32 KiB, o limite de capacidade é

24b2≤32768,b≤32768/24≈36,9.

Escolher um lado de 32 usa 24.576 bytes, ou 24 KiB, deixando algum espaço para outros dados. Escolher 36 apenas porque a aritmética permite deixa muito menos espaço e pode provocar conflitos. A capacidade é uma estimativa inicial; os tamanhos reais dos blocos são ajustados por medição.

Um percurso com blocagem avança o laço externo pelo tamanho do bloco. Seus limites internos param no menor valor entre o fim do bloco e o tamanho da matriz. Por exemplo, se uma dimensão for 70 e os blocos tiverem lado 32, o bloco final terá apenas seis elementos nessa dimensão. Um bloco final de tamanho completo acessaria posições além do vetor.

Estime o que a reutilização economiza

Em um modelo simplificado de matrizes grandes com linhas de cache de 64 bytes, a ordem ingênua i, j, k apresenta cerca de 1,125N3 faltas quando as linhas percorridas já não estão na cache na passagem seguinte. Uma versão com blocagem pode reduzir isso para cerca de N3/(4b), supondo que os três blocos de trabalho permaneçam na cache e ignorando conflitos.

Para N=1024 e b=32, essas estimativas são de cerca de 1,2 bilhão e 8,4 milhões de faltas, um fator de 144. Ambas as versões ainda realizam cerca de 2N3 operações de ponto flutuante. A economia está na movimentação repetida de dados, não na contagem de operações aritméticas da multiplicação. O modelo descreve uma reutilização ideal; a aceleração medida também depende da largura de banda, da execução e de outras sobrecargas.

Faça a pré-busca cedo o suficiente para ocultar a latência

Mecanismos de pré-busca em hardware reconhecem sequências como acessos sequenciais ou com passo constante. Eles solicitam linhas antes que acessos por demanda precisem delas. O software também pode solicitar buscas antecipadas, por exemplo, com __builtin_prefetch do GCC ou do Clang.

O momento importa. Uma requisição feita tarde demais deixa o acesso por demanda esperando. Uma requisição feita cedo demais pode trazer uma linha apenas para que ela seja substituída antes do uso. Uma requisição imprecisa consome largura de banda e espaço na cache sem ajudar o programa. O seguimento de ponteiros é mais difícil de antecipar porque o próximo endereço muitas vezes só é conhecido após a chegada do nó atual.

Uma pré-busca feita no momento certo pode transformar faltas posteriores por demanda em acertos, mas as linhas ainda trafegam pela hierarquia. Ela oculta a latência em vez de reduzir os dados úteis necessários a uma passagem sequencial. A blocagem ajuda quando valores são reutilizados; uma passagem única não tem dados repetidos a manter e já pode ser limitada pela largura de banda da memória.

Principais conclusões

  • A blocagem mantém blocos reutilizados ativos enquanto seus dados são úteis.
  • Estime o armazenamento dos blocos de todos os vetores necessários simultaneamente.
  • Trate blocos parciais nas bordas com limites adequados para os laços.
  • A blocagem reduz a movimentação de dados enquanto preserva a carga de operações aritméticas.
  • A pré-busca precisa de endereços úteis e antecedência suficiente; requisições imprecisas desperdiçam largura de banda.

Exercícios resolvidos de Hierarquia de memória e caches

6 Lições Interativas

1

De uma varredura de vetor a uma hierarquia de memória

13 passos
Relacionar a localidade do programa às tecnologias de memória e aos custos de acertos e faltas.
  1. 1
    IntroduçãoPor que manter uma memória pequena por perto?

    Um processador pode emitir trabalho muito mais rápido do que uma memória grande consegue responder a cada requisição. Uma cache ajuda quando um programa retorna a dados recentes ou usa endereços próximos; essa reutilização é chamada de localidade. Acompanhe uma varredura de vetor para ver quanto um único carregamento de linha pode atender e depois relacione essa reutilização às tecnologias e aos níveis que fornecem os dados, a hierarquia de memória.

  2. 2
    ExplicaçãoSepare dois tipos de localidade

    A localidade temporal reutiliza um item em breve: o corpo de um laço é executado repetidamente, e um total acumulado é atualizado em cada iteração. A localidade espacial usa endereços próximos: uma varredura sequencial de vetor lê elementos adjacentes.

    Um laço pode ter ambas em seu fluxo de instruções mesmo quando cada elemento do vetor é lido apenas uma vez. Identifique o que está sendo acessado antes de atribuir um tipo de localidade.

  3. 3
    ExemploQuanto uma linha fornece?

    Um vetor alinhado ao bloco contém 1000 inteiros de 4 bytes cada. As linhas de cache contêm 64 bytes. Cada carregamento fornece 64/4=16 inteiros consecutivos. Depois que o primeiro inteiro resulta em falta, os 15 seguintes podem resultar em acerto. A última linha não precisa estar cheia: o vetor de 4000 bytes precisa de ⌈4000/64⌉=63 linhas.

  4. 4
    DesafioPreveja uma varredura menor

    Um vetor alinhado contém 320 inteiros de quatro bytes. Em uma cache inicialmente vazia com busca por demanda, linhas de cache de 64 bytes, sem interferência e com espaço para o vetor, quantas leituras do vetor resultam em falta? Qual localidade proporciona os acertos restantes?

    ---reveal---

    Há 16 inteiros por linha e 320/16=20 linhas, portanto 20 leituras resultam em falta. As outras 300 resultam em acerto pela localidade espacial. Cada elemento é usado uma vez; esses acertos não exigem reutilização temporal dos elementos.

  5. 5
    Ideia-chaveUm conjunto de trabalho precisa de posições utilizáveis

    O conjunto de trabalho é formado pelos blocos usados durante um intervalo de tempo. Um conjunto ativo pequeno pode permanecer por perto mesmo quando o programa inteiro é grande.

    Capacidade e posicionamento importam. Se dois blocos ativos puderem usar apenas uma entrada compartilhada, eles poderão substituir um ao outro enquanto outras entradas permanecem vazias. Variáveis de laço mantidas em registradores também não precisam de espaço na cache de dados, mesmo que o código-fonte as leia repetidamente.

  6. 6
    ExplicaçãoCompare células de memória alimentadas por energia

    A SRAM mantém um bit em um circuito estável alimentado por energia, normalmente usando seis transistores. Ela não precisa de refrescamento e é rápida, mas custa uma área considerável por bit. A DRAM mantém carga em um capacitor; a fuga de carga exige refrescamento. Suas células mais densas a tornam adequada para uma memória principal grande.

    Ambas são voláteis. “Estática” descreve como a SRAM mantém seu estado enquanto recebe energia, não se ela sobrevive à perda de energia.

  7. 7
    ExemploPrimeiro espere, depois transfira

    A DRAM ativa uma linha no buffer de linha de um banco e atende a colunas selecionadas a partir dele. Rajadas e bancos com operações sobrepostas aumentam a taxa de entrega. Eles não eliminam o atraso inicial de acesso.

    Com latência inicial de 60 ns, uma linha de cache de 64 bytes transferida a 16 bytes/ns precisa de outros 4 ns. O atendimento total leva cerca de 64 ns. A maior parte dessa espera precede a transferência, embora a interface mova bytes rapidamente.

  8. 8
    ExplicaçãoEscolha um armazenamento que mantenha seu conteúdo

    A flash NAND mantém dados sem energia. Ela lê e programa páginas, enquanto apaga blocos maiores antes que o espaço programado possa ser reutilizado. Essas operações demoram muito mais que o acesso à SRAM ou à DRAM.

    O desgaste por programação e apagamento limita a vida útil de um bloco. O nivelamento de desgaste distribui atualizações pelos blocos para que dados lógicos alterados com frequência não desgastem precocemente uma única posição física.

  9. 9
    DesafioDiferencie persistência de refrescamento

    Um dispositivo precisa manter registros depois que a energia é desligada. Substituir DRAM por SRAM atenderia a esse requisito? Explique.

    ---reveal---

    Não. A SRAM dispensa refrescamento, mas ainda perde seus dados sem energia, assim como a DRAM. Um armazenamento não volátil, como a flash, atende ao requisito de persistência. Suas operações de página mais lentas e suas exigências de apagamento explicam por que ela tem uma função diferente da memória cache no chip.

  10. 10
    ExplicaçãoColoque os níveis em ordem

    Os registradores ficam mais próximos da execução, seguidos por L1, L2, L3, DRAM e armazenamento. As caches movem blocos, geralmente de 64 bytes, enquanto a memória virtual usa páginas, geralmente de 4 KiB.

    A L1 frequentemente separa caches de instruções e dados para que o pipeline possa acessar ambas ao mesmo tempo. Uma falta em um nível continua a busca no nível inferior; uma falta na L1 ainda pode ser um acerto na L2.

  11. 11
    ExemploCalcule o custo de uma falta ocasional

    Use uma consulta simplificada de 1 ciclo, 97% de acertos e penalidade adicional por falta de 100 ciclos. Toda requisição paga a consulta, e 3% pagam a penalidade:

    1+0,03×100=4 ciclos.

    Uma falta custa 101 ciclos aqui. O valor de 100 ciclos é tempo adicional, portanto cobrá-lo como o tempo total da falta omitiria a consulta nas faltas.

  12. 12
    DesafioRelacione o programa à sua média

    Dois programas usam a mesma cache de 1 ciclo e penalidade adicional de 80 ciclos. Um tem 2% de faltas; o outro tem 20%. Encontre seus tempos médios e explique por que o mesmo hardware produz resultados diferentes.

    ---reveal---

    As médias são 1+0,02×80=2,6 e 1+0,20×80=17 ciclos. Padrões de acesso diferentes produzem taxas de faltas diferentes. A cache explora a localidade fornecida por cada programa; sua capacidade e tecnologia, por si só, não determinam o resultado.

  13. 13
    RecapitulaçãoAnalise um acesso em três escalas

    Ao examinar o comportamento da memória, identifique o item reutilizado, o bloco transferido com ele e o nível que o atende. A localidade explica a reutilização provável, a tecnologia de memória explica custo e capacidade, e os tempos de acerto e falta transformam essas observações em uma estimativa do tempo de acesso. Para um programa concreto, comece pelo fluxo real de endereços.

2

Construa e acompanhe uma consulta à cache

15 passos
Dividir endereços, acompanhar o estado de substituição e comparar mapeamento direto com várias vias.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoUm endereço deve responder a duas perguntas
  2. 2
    ExplicaçãoRemova primeiro o deslocamento do byte
  3. 3
    ExplicaçãoConte as entradas antes dos bits de índice
  4. 4
    DesafioVerifique uma nova divisão de campos
  5. 5
    ExemploConsidere a etiqueta armazenada
  6. 6
    ExemploComece com uma cache vazia
  7. 7
    ExemploObserve uma entrada mudar de ocupante
  8. 8
    ExemploConclua a sequência de substituições
  9. 9
    DesafioAcompanhe sem confundir bytes e blocos
  10. 10
    ExplicaçãoTransforme entradas em conjuntos e vias
  11. 11
    ExemploAcompanhe o uso recente em cada acesso
  12. 12
    DesafioDiferencie LRU de FIFO
  13. 13
    Ideia-chaveSaiba o que mais vias podem oferecer
  14. 14
    DesafioCompare projetos de mesma capacidade
  15. 15
    RecapitulaçãoMantenha o estado ao longo da consulta
3

Diagnostique uma falta e preserve dados alterados

12 passos
Classificar faltas, acompanhar vítimas modificadas e separar políticas para acertos de escrita das políticas para faltas de escrita.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoUma falta tem uma causa e um caminho de atendimento
  2. 2
    ExplicaçãoAtenda a uma leitura em espera
  3. 3
    ExplicaçãoClassifique pela comparação correta
  4. 4
    DesafioSepare capacidade livre de conflitos
  5. 5
    ConexãoEscolha qual custo melhorar
  6. 6
    ExplicaçãoAcompanhe um bloco com escrita de volta
  7. 7
    ExplicaçãoEnfileire escritas diretas
  8. 8
    ExplicaçãoDefina uma regra separada para faltas de escrita
  9. 9
    DesafioAcompanhe uma escrita e uma leitura posterior
  10. 10
    ExemploConte o tráfego nas duas direções
  11. 11
    DesafioRelacione a classificação ao tráfego de escrita
  12. 12
    RecapitulaçãoMantenha as decisões separadas
4

Calcule o custo de uma hierarquia

16 passos
Partir de uma cache para analisar tráfego ponderado, CPI, mudanças de clock e vários níveis de cache.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoAssocie um denominador e uma unidade
  2. 2
    ExemploCalcule o AMAT de um nível
  3. 3
    DicaConverta após calcular
  4. 4
    DesafioInclua um tempo completo de falta informado
  5. 5
    ExemploPondere as requisições existentes
  6. 6
    ExemploPasse de acessos para instruções
  7. 7
    ExemploConclua com o tempo de execução
  8. 8
    DesafioAumente o clock do processador
  9. 9
    ConexãoVerifique se os atrasos se sobrepõem
  10. 10
    ExemploMantenha distintas as taxas locais e globais
  11. 11
    ExemploCalcule o custo de atendimento do nível inferior
  12. 12
    ExemploVolte ao fluxo original
  13. 13
    DesafioDiagnostique um erro de denominador
  14. 14
    ExemploInsira mais um nível condicional
  15. 15
    DesafioCombine o tráfego da cache com o CPI
  16. 16
    RecapitulaçãoEscolha o nível correto de contabilização
5

Traduza um endereço sem confundir consultas

15 passos
Acompanhar deslocamentos na página, permissões, percursos da TLB e a restrição de indexação em uma cache VIPT.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoUm endereço, dois problemas de consulta
  2. 2
    ExemploEncontre a parte inalterada
  3. 3
    ExemploUse a entrada da tabela de páginas
  4. 4
    DesafioTraduza outro byte
  5. 5
    ExplicaçãoUma página válida ainda tem direitos de acesso
  6. 6
    ExplicaçãoTrate uma página ausente
  7. 7
    ExemploEstime uma tabela plana
  8. 8
    ExplicaçãoReutilize traduções na TLB
  9. 9
    Ideia-chaveAcompanhe resultados independentes de acerto
  10. 10
    DesafioDecida se o armazenamento é necessário
  11. 11
    ExemploCalcule a cobertura de tradução
  12. 12
    ExplicaçãoInicie a indexação da cache durante a tradução
  13. 13
    DesafioVerifique um projeto de L1 proposto
  14. 14
    ConexãoInvalide traduções desatualizadas
  15. 15
    RecapitulaçãoMantenha separados o estado da tradução e o dos dados
6

Aproveite cada linha de cache buscada

13 passos
Analisar passos de acesso, escolher uma organização de dados, dimensionar blocos reutilizáveis e decidir o que a pré-busca pode ocultar.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoComece pelos endereços do laço interno
  2. 2
    ExemploUse todos os valores double de uma linha de cache
  3. 3
    ExemploVeja capacidade e conflitos juntos
  4. 4
    DicaAltere o passo entre linhas
  5. 5
    DesafioEscolha uma organização para o acesso
  6. 6
    ExplicaçãoIntercambie laços para criar sequências de acesso
  7. 7
    ExplicaçãoMantenha três blocos ativos
  8. 8
    ExemploDeixe espaço além da estimativa de capacidade
  9. 9
    DesafioPare os blocos de borda no limite do vetor
  10. 10
    Ideia-chaveDiferencie menos transferências de menos operações aritméticas
  11. 11
    ExplicaçãoBusque dados enquanto o trabalho útil continua
  12. 12
    DesafioExplique uma aceleração menor que a esperada
  13. 13
    RecapitulaçãoTeste uma mudança concreta

Questões de Hierarquia de memória e caches

50 Questões de Prática em 5 conjuntos

Conjunto 1: Comportamento da memória e consulta à cache10 Questões de Prática

Questão 1 de 10

Um programa lê cada elemento de um vetor contíguo uma vez, em ordem de endereço. Que tipo de localidade explica por que buscar uma linha de cache inteira ajuda?
  1. Localidade temporal em cada elemento
  2. Localidade espacial entre elementos
  3. Localidade temporal entre páginas
  4. Localidade espacial em valores repetidos
Mostrar respostaOcultar resposta
Resposta: B
Elementos adjacentes ocupam endereços próximos, portanto uma linha buscada fornece dados para várias leituras seguintes. A localidade temporal exige a reutilização de um item; ler cada elemento uma vez não proporciona reutilização temporal desses elementos, embora outras partes do programa possam ser reutilizadas.

Questão 2 de 10

Que propriedade faz a DRAM precisar de refrescamento enquanto a SRAM não precisa?
  1. A DRAM envia dados nas duas bordas do clock.
  2. A DRAM mantém dados quando a energia é desligada.
  3. A DRAM armazena cada bit em um circuito estável.
  4. A DRAM armazena carga que se dissipa gradualmente.
Mostrar respostaOcultar resposta
Resposta: D
Uma célula DRAM armazena carga em um capacitor, e a fuga exige que a carga seja restaurada periodicamente. Transferir nas duas bordas do clock melhora a largura de banda da interface, mas não é a razão do refrescamento. A SRAM mantém seu estado em um circuito alimentado por energia sem refrescamento periódico.

Questão 3 de 10

Uma requisição resulta em falta na L1 e em acerto na L2. Qual afirmação descreve esse acesso?
  1. A L2 fornece um bloco ausente da L1.
  2. A DRAM fornece um bloco ausente da L2.
  3. A instrução gera uma falta de página.
  4. A TLB precisa recarregar uma tradução.
Mostrar respostaOcultar resposta
Resposta: A
O acerto e a falta descrevem os níveis específicos verificados: a L1 não tinha o bloco, enquanto a L2 o tinha. Uma falta na L1 não exige a DRAM quando uma cache inferior pode atendê-la. Os resultados da cache não estabelecem se houve falta de tradução ou falta de página.

Questão 4 de 10

Uma cache de mapeamento direto tem 8 KiB de dados, blocos de 32 bytes e endereços de byte de 30 bits. Quais são as larguras da etiqueta, do índice e do deslocamento?
  1. 17, 8, 5 bits
  2. 12, 13, 5 bits
  3. 18, 7, 5 bits
  4. 17, 5, 8 bits
Mostrar respostaOcultar resposta
Resposta: A
A cache tem 8192/32=256 entradas, exigindo 8 bits de índice. Um bloco de 32 bytes precisa de 5 bits de deslocamento, restando 30−8−5=17 bits de etiqueta. Usar 13 bits de índice corresponderia a calcular o logaritmo da capacidade em bytes e contar o deslocamento no bloco duas vezes.

Questão 5 de 10

Uma cache de mapeamento direto tem oito entradas de 16 bytes. Para o endereço de byte 0x2B6, qual par fornece o índice da entrada e o deslocamento do byte?
  1. Índice 6, deslocamento 3
  2. Índice 2, deslocamento 6
  3. Índice 3, deslocamento 6
  4. Índice 3, deslocamento 11
Mostrar respostaOcultar resposta
Resposta: C
Dividir 0x2B6 por 16 fornece o bloco 0x2B, ou 43, com resto 6. O bloco 43 módulo 8 seleciona o índice 3. Usar os três bits menos significativos do endereço de byte sem deslocá-lo resultaria no índice 6, pois esses bits pertencem ao deslocamento do byte, não ao índice do bloco.

Questão 6 de 10

Uma cache vazia de mapeamento direto tem duas entradas de 8 bytes. Leituras acessam os endereços de byte 0x00, 0x07, 0x10, 0x04, nessa ordem. Qual é a taxa de acertos?
  1. 0%
  2. 25%
  3. 50%
  4. 75%
Mostrar respostaOcultar resposta
Resposta: B
O primeiro acesso carrega o bloco 0, e 0x07 resulta em acerto nesse bloco. O endereço 0x10 carrega o bloco 2 na mesma entrada e substitui o bloco 0, portanto 0x04 resulta em falta em seguida. Apenas um de quatro acessos resulta em acerto; contar o último acesso como acerto ignora a substituição intermediária.

Questão 7 de 10

Um vetor alinhado contém 192 valores de oito bytes. Uma cache inicialmente vazia usa linhas de cache de 64 bytes, tem espaço para o vetor inteiro e não realiza pré-busca. Sem outros acessos, quantas faltas ocorrem em uma varredura sequencial?
  1. 12
  2. 64
  3. 192
  4. 24
Mostrar respostaOcultar resposta
Resposta: D
Cada linha comporta 64/8=8 valores, portanto a varredura acessa 192/8=24 linhas. A primeira leitura de cada linha resulta em falta e seus sete valores seguintes resultam em acerto. Contar 192 faltas trataria o carregamento de uma linha como se fornecesse apenas o elemento solicitado.

Questão 8 de 10

Uma requisição de memória tem 45 ns de latência inicial, seguidos por uma transferência de 128 bytes a 32 GB/s. Qual é seu tempo total de atendimento nesse modelo?
  1. 49 ns
  2. 45 ns
  3. 77 ns
  4. 41 ns
Mostrar respostaOcultar resposta
Resposta: A
A 32 GB/s, a interface transfere 32 bytes por nanossegundo, portanto 128 bytes levam 4 ns. Somar os 45 ns iniciais resulta em 49 ns. Usar 77 ns confunde o valor da largura de banda com um atraso em vez de dividir o tamanho do bloco pela taxa de transferência.

Questão 9 de 10

Uma cache de mapeamento direto de 4 KiB com escrita de volta tem linhas de cache de 32 bytes e endereços de byte de 24 bits. Conte os dados, as etiquetas, um bit de validade e um bit de modificação por linha, sem outros metadados. Quantos bits são armazenados?
  1. 34.304 bits
  2. 34.944 bits
  3. 34.560 bits
  4. 33.024 bits
Mostrar respostaOcultar resposta
Resposta: C
Há 128 linhas, portanto as larguras do índice e do deslocamento são de 7 e 5 bits, restando uma etiqueta de 12 bits. Cada linha armazena 256 + 12 + 1 + 1 = 270 bits, totalizando 34.560 bits. A opção de 34.304 bits omite os dois bits de controle de cada linha, apesar de sua inclusão explícita na contagem de armazenamento.

Questão 10 de 10

Uma cache vazia de mapeamento direto tem quatro entradas de 16 bytes. Leituras acessam 0x24, 0x28, 0x64, 0x34, 0x2C, 0x68. Qual é a taxa de acertos e qual bloco fica no índice 2 ao final?
  1. 50%; bloco 2
  2. 25%; bloco 6
  3. 16,7%; bloco 2
  4. 16,7%; bloco 6
Mostrar respostaOcultar resposta
Resposta: D
A sequência de blocos é 2, 2, 6, 3, 2, 6. Apenas o segundo acesso resulta em acerto; os blocos 2 e 6 substituem um ao outro no índice 2, que termina contendo o bloco 6. A opção de 50% mantém incorretamente ambos os blocos conflitantes residentes, tratando a cache como se tivesse opções adicionais de posicionamento.
Conjunto 2: Posicionamento, faltas e escritas10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Um programa acessa um bloco pela primeira vez, e o acesso por demanda resulta em falta. Como essa falta é classificada no modelo dos três Cs?
  1. De conflito
  2. De capacidade
  3. Compulsória
  4. De coerência
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Uma cache com escrita de volta substitui um bloco válido cujo bit de modificação não está definido. O que deve acontecer com essa vítima?
  1. Ela deve ser escrita no nível inferior antes da substituição.
  2. Ela pode ser descartada sem uma escrita de volta.
  3. Sua substituição deve usar escrita direta.
  4. Seu bit de modificação deve ser definido antes da remoção.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Uma cache de 12 KiB tem linhas de cache de 64 bytes e três vias por conjunto. Quantos conjuntos ela tem?
  1. 32
  2. 192
  3. 64
  4. 256
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Um conjunto cheio de 2 vias usa LRU e inicialmente contém P e Q, com P menos recente. Os acessos são Q, P, R, Q, em que R está ausente. Quais blocos são substituídos nas duas faltas?
  1. Q, depois P
  2. P, depois R
  3. P, depois Q
  4. Q, depois R
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Uma cache sem alocação na escrita começa vazia. Uma escrita no endereço 0x80 é seguida por uma leitura de 0x80, sem acessos intermediários. O que acontece nessa cache?
  1. Escrita resulta em falta; leitura, em acerto.
  2. Escrita resulta em acerto; leitura, em acerto.
  3. Escrita resulta em acerto; leitura, em falta.
  4. Escrita resulta em falta; leitura, em falta.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Um acesso repetido por demanda resulta em falta em uma cache de mapeamento direto, mas em acerto em uma cache LRU totalmente associativa do mesmo tamanho que recebe o mesmo histórico. O que causou a falta segundo o teste dos três Cs?
  1. Um primeiro acesso ao bloco
  2. Uma restrição de posicionamento do bloco
  3. Capacidade totalmente associativa insuficiente
  4. Um estouro do buffer de escrita do nível inferior
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Uma cache com escrita direta tem um buffer de escrita finito. As escritas chegam mais rápido do que o nível inferior consegue aceitá-las durante um intervalo prolongado. O que acontece ao final?
  1. A cache muda para escrita de volta.
  2. O nível inferior descarta as escritas na fila.
  3. O processador para quando o buffer enche.
  4. O buffer elimina o limite de largura de banda.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Uma cache LRU totalmente associativa vazia de duas linhas recebe leituras dos blocos 1, 2, 3, 1, 2. Quantas faltas compulsórias, de capacidade e de conflito ocorrem?
  1. 2 compulsórias, 3 de capacidade, 0 de conflito
  2. 3 compulsórias, 0 de capacidade, 2 de conflito
  3. 3 compulsórias, 1 de capacidade, 1 de conflito
  4. 3 compulsórias, 2 de capacidade, 0 de conflito
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Uma cache vazia de uma linha, com escrita de volta e alocação na escrita, tem linhas de cache de 32 bytes. Ela recebe escritas em 0x00, 0x04, 0x20 e 0x24, seguidas por uma leitura de 0x40. Contando apenas carregamentos e escritas de volta de vítimas, quantos bytes se movem entre essa cache e o próximo nível?
  1. 160 bytes
  2. 96 bytes
  3. 128 bytes
  4. 192 bytes
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Uma cache vazia de 2 vias tem dois conjuntos e substituição LRU. As leituras de blocos repetem 0, 2, 4 indefinidamente. Qual é a taxa de acertos após o aquecimento e o que aconteceria em uma cache totalmente associativa de quatro linhas?
  1. Dois terços; ela também teria falta em um terço.
  2. Zero; ela teria acertos após as três primeiras faltas.
  3. Um terço; ela teria acertos após quatro faltas.
  4. Zero; ela também teria falta em todo acesso.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 3: Tempo de acesso e velocidade do programa10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Uma cache atende a 184 acertos em 200 acessos. Qual é sua taxa de faltas?
  1. 8%
  2. 16%
  3. 92%
  4. 0,08%
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Um relatório apresenta as faltas na L2 divididas por todas as requisições que chegaram à L2. Qual taxa é informada?
  1. Taxa global de faltas da L2
  2. Taxa global de faltas da L1
  3. Taxa local de faltas da L2
  4. Taxa local de acesso à memória
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Uma cache tem consulta de 2 ciclos, 6% de faltas e penalidade adicional de 75 ciclos por falta. A 2,5 GHz, qual é seu AMAT?
  1. 6,5 ns
  2. 1,8 ns
  3. 3,0 ns
  4. 2,6 ns
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

O CPI básico é 1,2, as faltas de instruções são 1%, 40% das instruções realizam um acesso a dados, as faltas de dados são 5% e todas as faltas acrescentam 80 ciclos sem sobreposição. Qual é o CPI total?
  1. 6,0
  2. 3,6
  3. 2,8
  4. 2,4
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

A L1 apresenta falta em 8% das requisições. A L2 tem taxa local de faltas de 15%. Qual fração das requisições originais resulta em falta nas duas caches?
  1. 1,2%
  2. 15%
  3. 23%
  4. 0,12%
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Uma consulta à cache leva 1 ns. Sua taxa de faltas é 10%, e um acesso completo com falta leva 41 ns, incluindo essa consulta. Qual é o AMAT?
  1. 5,1 ns
  2. 4,1 ns
  3. 5,0 ns
  4. 4,0 ns
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Cada instrução realiza uma busca e, em média, 0,5 acesso a dados. As taxas de faltas de instruções e dados são 1% e 7%. Ambas as caches têm consulta de 2 ciclos e penalidade adicional por falta de 60 ciclos. Qual é o AMAT por acesso à memória?
  1. 4,7 ciclos
  2. 3,8 ciclos
  3. 4,4 ciclos
  4. 2,7 ciclos
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

A consulta à L1 leva 2 ciclos e tem 5% de faltas. A consulta à L2 leva 8 ciclos e tem 20% de faltas locais. A consulta à L3 leva 30 ciclos e tem 10% de faltas locais. A memória acrescenta 150 ciclos após uma falta na L3. Qual é o AMAT?
  1. 2,45 ciclos
  2. 4,35 ciclos
  3. 3,95 ciclos
  4. 2,85 ciclos
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Um programa tem CPI básico de 1,5 e 2,5 ciclos de parada de memória sem sobreposição por instrução a 2 GHz. O clock sobe para 4 GHz; a contagem de instruções, o CPI básico, o número de faltas e os atrasos de memória em nanossegundos permanecem fixos. Qual é a aceleração?
  1. Cerca de 1,23 vez
  2. Cerca de 2,00 vezes
  3. Cerca de 0,62 vez
  4. Cerca de 1,60 vez
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

A cache A tem consulta de 0,8 ns e 6% de faltas. A cache B tem consulta de 1,1 ns e 4% de faltas. Ambas usam a mesma penalidade adicional por falta. Para qual penalidade seus AMATs se tornam iguais?
  1. 5 ns
  2. 10 ns
  3. 15 ns
  4. 30 ns
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 4: Páginas, TLBs e indexação da cache10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Qual parte de um endereço passa inalterada pela tradução comum de páginas?
  1. O número da página virtual
  2. O número da página física
  3. A base da tabela de páginas
  4. O deslocamento do byte na página
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Um acesso resulta em falta na TLB, e um percurso da tabela de páginas encontra um mapeamento válido que permite o acesso. Qual é o próximo passo normal?
  1. Ler a página do armazenamento.
  2. Instalar a tradução e continuar.
  3. Encerrar o processo por endereço inválido.
  4. Invalidar a linha da cache de dados.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Com páginas de 8 KiB, o endereço virtual 0x12345 é mapeado para o número da página física 0x2A. Qual é o endereço físico de byte?
  1. 0x54345
  2. 0x2A345
  3. 0x54045
  4. 0x16345
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Uma TLB totalmente associativa contém 96 traduções, todas para páginas de 16 KiB. Qual é sua cobertura?
  1. 96 KiB
  2. 1536 MiB
  3. 1,5 MiB
  4. 6 MiB
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Um processo escreve em uma página residente. A TLB apresenta acerto, mas seu mapeamento atual concede apenas acesso de leitura. O que acontece?
  1. A escrita é bem-sucedida porque a tradução acertou.
  2. A TLB deve falhar antes que uma falta possa ocorrer.
  3. A página deve ser recarregada do armazenamento.
  4. O processador gera uma falta de página por permissão.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Uma cache VIPT simples usa linhas de cache de 64 bytes e páginas de 4 KiB. Sua capacidade de dados é de 64 KiB. Qual é a menor associatividade que é potência de dois e mantém todos os bits de índice do conjunto e de deslocamento no bloco dentro do deslocamento na página?
  1. 8 vias
  2. 16 vias
  3. 32 vias
  4. 4 vias
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Uma tabela de páginas plana cobre um espaço virtual endereçado por byte de 36 bits usando páginas de 16 KiB e entradas de 8 bytes. Quanta memória uma tabela completa exige?
  1. 4 MiB
  2. 16 MiB
  3. 32 MiB
  4. 64 MiB
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Uma TLB LRU totalmente associativa vazia de quatro entradas usa páginas de 4 KiB. Um laço lê repetidamente um valor de 8 bytes em cada endereço 0x0000, 0x1000, 0x2000, 0x3000, 0x4000, nessa ordem. Todas as páginas estão residentes. O que acontece após o aquecimento?
  1. Toda consulta de tradução resulta em falta; faltas de página são desnecessárias.
  2. Só a primeira consulta de cada laço resulta em falta; faltas de página são desnecessárias.
  3. Toda consulta de tradução resulta em falta; cada uma exige leitura do armazenamento.
  4. Todas as consultas de tradução acertam; apenas 40 bytes são acessados.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Um acesso permitido tem acerto na cache de dados de 2 ciclos. Uma consulta à TLB sempre custa 1 ciclo antes da consulta à cache. Faltas na TLB ocorrem em 2% dos acessos e acrescentam um percurso de 40 ciclos; faltas na cache de dados ocorrem em 5% e acrescentam 80 ciclos. Nenhum custo se sobrepõe e não ocorrem faltas de página. Qual é o tempo médio de acesso?
  1. 6,8 ciclos
  2. 4,8 ciclos
  3. 7,6 ciclos
  4. 7,8 ciclos
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Os processos P e Q mapeiam páginas virtuais diferentes para o quadro físico 7. P pode escrever; Q só pode ler. P altera um byte, e a visibilidade é corretamente coordenada pelo sistema. O que acontece quando Q lê ou escreve posteriormente nesse byte mapeado?
  1. Q lê sua própria cópia separada e pode escrever.
  2. Q pode ler a alteração, mas uma escrita causa falta.
  3. Q sofre falta nas duas operações porque P escreveu.
  4. Q lê a alteração e herda o direito de escrita de P.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 5: Mudanças no código e compromissos da hierarquia10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Qual percurso visita elementos adjacentes de um vetor retangular comum em C a[i][j]?
  1. Aumentar i enquanto j permanece fixo.
  2. Diminuir i enquanto j permanece fixo.
  3. Aumentar j enquanto i permanece fixo.
  4. Aumentar i e j ao mesmo tempo.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Um vetor alinhado tem 600 registros de 48 bytes cada. Um laço lê apenas um campo de 8 bytes por registro. Qual organização minimiza os dados transferidos para esse campo em uma varredura com cache inicialmente vazia, linhas de cache de 64 bytes e sem pré-busca?
  1. Um vetor contíguo separado para o campo.
  2. Os mesmos registros na ordem original.
  3. Os mesmos registros percorridos em ordem inversa.
  4. Os mesmos registros com 16 bytes de preenchimento cada.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Três blocos quadrados de valores de 8 bytes devem caber em uma cache de 48 KiB. Qual dos lados de bloco listados cabe deixando pelo menos 8 KiB sem uso?
  1. 48
  2. 44
  3. 42
  4. 40
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

A pré-busca em software reduz as faltas por demanda na cache em uma varredura única, mas o tempo de execução permanece igual. A interface de memória já estava transferindo dados em seu limite sustentado. Qual explicação se encaixa?
  1. Apenas varreduras que reutilizam cada elemento podem ocultar a latência de transferência.
  2. A varredura ainda precisa das mesmas transferências limitadas pela largura de banda.
  3. A menor taxa de faltas por demanda prova que menos bytes são transferidos.
  4. Dados buscados antecipadamente podem contornar o limite de largura de banda da interface.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Uma cache tem 32 conjuntos, linhas de cache de 64 bytes e capacidade total suficiente para os dados ativos. Um percurso por colunas avança entre linhas de matriz de 256 valores double, todas com início alinhado a uma linha de cache. Qual preenchimento distribui os inícios de linhas sucessivas da matriz por todos os conjuntos?
  1. Acrescentar preenchimento até 264 valores double por linha.
  2. Acrescentar preenchimento até 272 valores double por linha.
  3. Acrescentar preenchimento até 288 valores double por linha.
  4. Acrescentar preenchimento até 320 valores double por linha.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Uma dimensão de matriz é 94 e o lado do bloco é 24. Cada coordenada de bloco identifica uma região, incluindo bordas parciais. Quantas regiões de bloco existem e quantos elementos há na região inferior direita?
  1. 16 regiões; 576 elementos
  2. 9 regiões; 484 elementos
  3. 16 regiões; 484 elementos
  4. 9 regiões; 576 elementos
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Um kernel de matriz com blocagem usa três blocos quadrados de valores double em uma cache de 32 KiB. Uma proposta altera o lado do bloco de 16 para 40 e prevê 2,5 vezes menos faltas usando o modelo de blocos residentes. Qual avaliação é justificada?
  1. Três blocos precisam de 12,5 KiB; a redução prevista é justificada.
  2. Três blocos precisam de 37,5 KiB; a premissa de residência não se sustenta.
  3. Três blocos precisam de 37,5 KiB; as faltas devem cair 6,25 vezes.
  4. Três blocos precisam de 37,5 KiB; a aritmética inalterada determina as faltas.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Um programa fixo tem 0,04 falta na L1 por instrução, CPI básico de 1 e penalidade da memória de 120 ciclos sem L2. Uma L2 proposta acrescenta uma consulta de 12 ciclos e tem 10% de faltas locais, com todas as paradas sequenciais. Qual é a aceleração com o mesmo clock?
  1. Cerca de 1,25 vez
  2. Cerca de 3,92 vezes
  3. Cerca de 2,00 vezes
  4. Cerca de 2,96 vezes
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Uma multiplicação de matrizes armazenadas por linhas muda de i-j-k para i-k-j. No modelo de varredura, a primeira tem 1,125 falta por iteração interna. Na nova ordem, B é percorrida com uma falta a cada oito iterações e a linha de C permanece na cache após o aquecimento. Ignorando outros tráfegos, qual é o fator de redução de faltas em regime estável?
  1. 4,5 vezes
  2. 8 vezes
  3. 9 vezes
  4. 0,25 vez
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Uma cache contém 128 linhas de dados. Um laço percorre repetidamente cinco blocos que são todos mapeados para um conjunto. Compare um projeto LRU de 4 vias com um de 8 vias de mesmo tamanho de linha e mesma capacidade de dados; os cinco blocos compartilham um conjunto em ambos. O que muda após o aquecimento?
  1. O de 4 vias tem falta sempre; o de 8 vias tem acerto sempre.
  2. Ambos têm acerto sempre porque cinco é menor que 128.
  3. O de 4 vias acerta uma vez por ciclo; o de 8 vias, duas.
  4. Ambos têm falta sempre porque o índice do conjunto é compartilhado.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Travou em uma questão sua? Ajuda com Tarefas

Termos-Chave

80 Termos-Chave, cada um com sua definição

A

Acerto na cache
Um acerto na cache ocorre quando o nível verificado já contém o bloco solicitado em uma entrada válida com etiqueta correspondente.
Uma requisição pode resultar em falta na L1 e em acerto na L2, portanto seu resultado deve ser indicado separadamente para cada nível.
Alocação na escrita
A alocação na escrita é uma política para faltas de escrita que busca o bloco ausente para a cache e depois aplica a escrita nesse bloco.
Uma leitura posterior pode acertar na linha instalada por uma escrita anterior com alocação em outro byte do mesmo bloco.
Armazenamento por linhas
O armazenamento por linhas mantém contiguamente os elementos de cada linha de um vetor retangular, colocando linhas consecutivas uma após a outra.
Em um vetor C a[i][j], variar j no laço interno percorre elementos adjacentes de uma linha.

B

Banco de memória
Um banco de memória é uma matriz de linhas e colunas da DRAM controlada separadamente, cujas operações podem se sobrepor às de outros bancos.
Entrelaçar requisições entre bancos pode aumentar a largura de banda oferecida enquanto um banco espera por uma operação de linha.
Bit de modificação
Um bit de modificação registra que um bloco armazenado na cache contém alterações ainda não propagadas ao próximo nível da hierarquia.
Uma vítima válida não modificada pode ser descartada, enquanto uma vítima válida modificada exige a preservação de seus dados alterados.
Bit de validade
Um bit de validade é um metadado da entrada que registra se a etiqueta e os dados armazenados descrevem um bloco utilizável na cache.
Uma entrada com bits de etiqueta correspondentes ainda resulta em falta quando seu bit de validade não está definido após a inicialização ou invalidação.
Blocagem
A blocagem organiza uma computação em torno de pequenas regiões de dados que permanecem na cache enquanto seus valores são reutilizados repetidamente.
Três blocos de matriz podem ser reutilizados em muitas multiplicações e adições antes que o algoritmo avance para o próximo grupo de blocos.
Buffer de escrita
Um buffer de escrita é uma fila finita que mantém escritas pendentes para o nível inferior, permitindo que a execução continue antes de essas escritas terminarem.
Uma longa rajada de escritas enche o buffer se o destino não conseguir processar as atualizações tão rápido quanto elas chegam.
Buffer de linha da DRAM
Um buffer de linha é um circuito que mantém uma linha ativada da DRAM para que os acessos possam selecionar colunas sem reabrir essa linha.
Requisições repetidas a uma linha já aberta evitam o pré-carregamento e a ativação necessários para trocar de linha nesse banco.
Buffer de tradução de endereços (TLB)
Um buffer de tradução de endereços, ou TLB, armazena traduções recentes de páginas virtuais e as permissões associadas para evitar percursos repetidos da tabela de páginas.
Um acerto na TLB ainda pode acompanhar uma falta na cache de dados porque a presença do mapeamento difere da presença da linha de dados.

C

Cache associativa por conjunto
Uma cache associativa por conjunto mapeia um bloco para um conjunto, mas permite que ele ocupe qualquer uma das várias entradas, chamadas vias, desse conjunto.
Dois blocos que compartilham um índice podem coexistir em um conjunto de duas vias, evitando substituições que o mapeamento direto exigiria.
Cache com índice virtual e etiqueta física (VIPT)
Uma cache com índice virtual e etiqueta física inicia a consulta ao conjunto com bits do endereço virtual e verifica a identidade com uma etiqueta física traduzida.
Uma L1 de 32 KiB e oito vias pode manter seus bits de conjunto e de deslocamento na linha dentro do deslocamento de uma página de 4 KiB.
Cache de mapeamento direto
Uma cache de mapeamento direto permite que cada bloco de memória ocupe exatamente uma entrada, determinada por seu endereço de bloco e pelo número de entradas.
Quando dois blocos ativos compartilham uma entrada, carregar qualquer um deles substitui o outro, mesmo que outras entradas estejam vazias.
Cache multinível
Uma cache multinível combina uma cache superior pequena e rápida com caches inferiores maiores que atendem a muitas faltas do nível superior antes da memória principal.
Uma requisição paga a consulta à L2 apenas quando resulta em falta na L1, portanto o AMAT aninhado pondera essa consulta pela fração de faltas da L1.
Cache não bloqueante
Uma cache não bloqueante permite que outros acertos ou faltas adicionais prossigam enquanto uma ou mais requisições de blocos permanecem pendentes.
Um processador com execução fora de ordem pode atender a uma carga independente presente na cache enquanto outra carga espera um carregamento da DRAM.
Cache totalmente associativa
Uma cache totalmente associativa tem um conjunto com todas as entradas, permitindo que qualquer bloco ocupe qualquer entrada sem um campo de índice.
Uma cache LRU totalmente associativa de mesma capacidade fornece a referência usada para separar faltas de conflito e de capacidade.
Cobertura da TLB
A cobertura da TLB é o intervalo total de endereços representado pelas traduções disponíveis, calculado como o número de entradas multiplicado pelo tamanho da página para páginas de mesmo tamanho.
Uma TLB de 64 entradas cobre 256 KiB com páginas de 4 KiB, mesmo que um laço acesse apenas alguns bytes de cada página.
Conjunto de trabalho
Um conjunto de trabalho é a coleção de blocos ou páginas que um programa usa ativamente durante um determinado intervalo de tempo.
Dois blocos do conjunto de trabalho podem entrar em conflito em uma entrada mesmo quando seu tamanho total é menor que a capacidade da cache.
CPI adicional por paradas de memória
O CPI adicional por paradas de memória são os ciclos adicionais por instrução atribuídos a esperas pela memória, com a sobreposição tratada conforme o modelo de temporização.
Uma contagem de 0,02 falta por instrução e uma penalidade de 100 ciclos sem sobreposição acrescentam dois ciclos ao CPI total.
CPI básico
CPI básico são os ciclos por instrução já necessários antes das paradas adicionais de memória modeladas, incluindo acertos normais na cache.
Um modelo de paradas acrescenta atrasos por falta ao CPI básico em vez de contar o tempo de acerto na cache uma segunda vez.

D

Deslocamento na página
O deslocamento na página é a posição do byte dentro de uma página, preservada quando seu número de página virtual é traduzido em um número de página física.
Dois endereços na mesma página compartilham uma tradução enquanto seus deslocamentos diferentes selecionam bytes diferentes.
Deslocamento no bloco
O deslocamento no bloco é a posição do byte dentro de uma linha de cache, representada pelos bits menos significativos do endereço quando o tamanho da linha é uma potência de dois.
Os seis bits menos significativos de um endereço de byte selecionam uma das 64 posições de byte em uma linha de cache de 64 bytes.

E

Endereçamento por byte
O endereçamento por byte atribui um endereço de memória distinto a cada byte, de modo que os números de bloco são obtidos removendo as informações de deslocamento do byte.
Endereços que diferem apenas nos bits menos significativos de deslocamento podem selecionar bytes diferentes da mesma linha residente.
Entrada da tabela de páginas
Uma entrada da tabela de páginas registra informações de tradução, como número da página física, validade, permissões e estado de acesso ou modificação.
Uma página residente ainda pode rejeitar uma escrita quando sua PTE permite leituras, mas não concede acesso de escrita.
Escrita de volta
A escrita de volta é uma política de cache que registra escritas em um bloco modificado na cache e envia esse bloco ao nível inferior quando ele é substituído.
Muitas escritas em uma linha residente podem ser combinadas em uma única transferência de bloco de saída quando a linha é substituída.
Escrita direta
A escrita direta é uma política de cache que envia cada escrita ao próximo nível e também atualiza a cópia na cache em caso de acerto, frequentemente usando um buffer de escrita.
Um buffer de escrita pode manter temporariamente a atualização do nível inferior mesmo que a escrita já tenha alterado o valor na cache.
Estrutura de vetores (SoA)
Uma estrutura de vetores armazena cada campo dos registros em seu próprio vetor contíguo, favorecendo varreduras desse campo em muitos registros.
Somar apenas posições horizontais pode buscar um vetor compacto de posições sem carregar os outros campos de cada partícula.
Etiqueta
Uma etiqueta é a informação dos bits mais significativos do endereço armazenada com uma entrada da cache para identificar qual bloco ocupa a entrada ou o conjunto selecionado.
O mesmo índice pode se referir a muitos blocos de memória, portanto uma comparação de etiquetas distingue o bloco atualmente armazenado na cache.

F

Falta compulsória
Uma falta compulsória é uma falta no primeiro acesso a um bloco no histórico, que o aumento da capacidade da cache, por si só, não pode evitar.
O primeiro acesso por demanda a cada linha de uma varredura sequencial de vetor com cache inicialmente vazia é compulsório sem busca antecipada.
Falta de capacidade
Uma falta de capacidade é uma falta posterior que também ocorre em uma cache LRU totalmente associativa de mesma capacidade que recebe o mesmo histórico de acessos.
Uma cache totalmente associativa de duas linhas apresenta falta quando um ciclo de três blocos retorna ao bloco recém-substituído.
Falta de coerência
Uma falta de coerência ocorre quando um bloco está ausente porque a escrita de outro núcleo causou a invalidação de sua cópia na cache.
Um núcleo pode apresentar falta em dados compartilhados usados recentemente depois que outro núcleo modifica a linha de cache correspondente.
Falta de conflito
Uma falta de conflito é uma falta posterior evitada por uma cache LRU totalmente associativa de mesma capacidade porque o posicionamento flexível mantém o bloco.
Uma entrada de mapeamento direto pode alternar entre duas etiquetas enquanto uma referência associativa do mesmo tamanho mantém ambos os blocos.
Falta de página
Uma falta de página é uma exceção causada quando a tradução de página ou as verificações de permissão não podem ser concluídas normalmente para um acesso.
Uma escrita proibida pode causar falta em uma página residente, enquanto alguns mapeamentos ausentes são resolvidos sem leitura do armazenamento.
Falta na cache
Uma falta na cache ocorre quando o nível de cache verificado não tem uma cópia utilizável do bloco solicitado e deve obtê-la do nível inferior.
Dois blocos alternados podem resultar em faltas repetidas quando o mapeamento direto faz cada um substituir o outro.

H

Hierarquia de memória
Uma hierarquia de memória é um conjunto de níveis de armazenamento que combina memórias pequenas e rápidas com outras maiores e mais lentas para explorar a localidade dos programas.
Uma falta na L1 pode ser atendida pela L2 antes que a requisição incorra no atraso muito maior de um acesso à DRAM.

Í

Índice da cache
O índice da cache é o campo do endereço que seleciona a entrada ou o conjunto em que um bloco de memória pode residir.
Em uma cache de mapeamento direto de quatro entradas, os blocos 0 e 4 selecionam o índice 0 apesar de terem etiquetas diferentes.

I

Identificador de espaço de endereçamento (ASID)
Um identificador de espaço de endereçamento, ou ASID, distingue traduções pertencentes a espaços de endereçamento diferentes quando suas entradas coexistem na TLB.
Dois processos podem reutilizar um número de página virtual sem usar a tradução um do outro quando as entradas têm ASIDs apropriados.
Intercâmbio de laços
O intercâmbio de laços troca a ordem de aninhamento dos laços para alterar o percurso enquanto preserva o comportamento exigido da computação.
Mudar qual índice de matriz varia mais rápido pode transformar um percurso por colunas em um percurso por linhas sem reduzir as operações aritméticas.
Invalidação de traduções de endereços
A invalidação de traduções impede que mapeamentos armazenados permaneçam utilizáveis após mudanças relevantes nas tabelas de páginas ou nas atribuições de espaços de endereçamento.
O RISC-V usa sfence.vma para coordenar o estado da cache de traduções com atualizações de mapeamento.

L

Largura de banda
Largura de banda é a quantidade de dados que um caminho de memória pode transferir por unidade de tempo, geralmente expressa em bytes por segundo.
Um caminho de transferência de 16 GB/s move 64 bytes em 4 ns assim que o fluxo de dados começa após sua latência inicial.
Latência
Latência é o tempo decorrido desde a emissão de uma requisição de memória até que seus primeiros dados solicitados estejam disponíveis.
Uma interface de memória larga pode entregar muitos bytes por segundo enquanto uma única carga dependente ainda espera dezenas de nanossegundos.
Lei de Amdahl
A lei de Amdahl limita a aceleração total pela fração do tempo de execução afetada por uma melhoria e pelo tempo que permanece inalterado.
Reduzir o custo de execução do núcleo faz as esperas pela memória representarem uma parcela maior do tempo de execução quando essas esperas permanecem fixas.
Linha de cache (bloco de cache)
Uma linha de cache, também chamada de bloco, é a unidade de tamanho fixo de dados armazenada e transferida por uma cache.
Uma linha de 64 bytes fornece oito valores double adjacentes mesmo quando o acesso que causou seu carregamento solicitou apenas um.
Localidade
Localidade é a tendência de um programa concentrar seus acessos em uma parte relativamente pequena de seu espaço de endereçamento durante um curto intervalo de tempo.
Um laço pode usar repetidamente uma pequena região ativa mesmo quando o programa alocou muitos gigabytes.
Localidade espacial
Localidade espacial é a tendência de acessar endereços próximos a um endereço acessado recentemente, tornando úteis os bytes vizinhos.
Uma varredura sequencial de vetor pode usar os valores restantes de uma linha de cache depois que o primeiro valor a traz para a cache.
Localidade temporal
Localidade temporal é a tendência de acessar novamente a mesma instrução ou o mesmo item de dados pouco depois de um acesso anterior.
As instruções dentro de um laço curto são buscadas repetidamente enquanto o laço processa elementos sucessivos.

M

Memória dinâmica de acesso aleatório (DRAM)
DRAM é uma memória volátil que armazena bits como carga em capacitores que exige refrescamento periódico, fornecendo memória principal densa e acessível.
Um programa grande pode manter suas páginas ativas na DRAM enquanto caches menores mantêm as linhas acessadas com mais frequência.
Memória estática de acesso aleatório (SRAM)
SRAM é uma memória volátil que mantém bits em circuitos estáveis alimentados por energia sem refrescamento periódico e é normalmente usada em caches rápidas.
Uma cache no chip usa SRAM para oferecer baixa latência enquanto mantém uma pequena quantidade de dados usados com frequência.
Memória flash NAND
A flash NAND é um armazenamento não volátil que lê e programa páginas, apaga blocos maiores e suporta um número limitado de ciclos de programação e apagamento.
Um controlador de SSD mapeia dados lógicos atualizados para espaço disponível na flash, em vez de tratá-la como uma DRAM gravável por byte.
Memória virtual
A memória virtual mapeia endereços de processos para a memória física enquanto oferece proteção, compartilhamento controlado e páginas mantidas no armazenamento.
Um processo ainda usa memória virtual quando todas as suas páginas ativas cabem na DRAM e ele não realiza troca de páginas com o armazenamento.

N

Nivelamento de desgaste
O nivelamento de desgaste é uma técnica do controlador que distribui escritas e apagamentos da flash entre blocos físicos para espalhar o desgaste das células.
Atualizações repetidas de um registro lógico podem ser colocadas em blocos físicos diferentes para evitar o desgaste de uma única posição.
Número da página física
O número da página física identifica o quadro físico usado por um mapeamento e forma a parte mais significativa do endereço de byte traduzido.
O endereço físico de byte é a base do quadro mais o deslocamento inalterado na página, não o número do quadro sem deslocamento somado ao deslocamento na página.
Número da página virtual
O número da página virtual é a parte mais significativa de um endereço virtual que identifica a página cujo mapeamento a tradução deve obter.
Com páginas de 4 KiB, remover os 12 bits menos significativos de deslocamento deixa o número da página virtual usado na tradução.

O

Ocupação de memória dos blocos
A ocupação de memória dos blocos é o armazenamento ocupado por todos os blocos que devem coexistir para que uma computação com blocagem mantenha a reutilização pretendida.
Três blocos de 32 por 32 de valores double ocupam 24 KiB, deixando algum espaço em uma cache de 32 KiB para outros dados ativos.

P

Palavra crítica primeiro
Palavra crítica primeiro é uma estratégia de carregamento que transfere a palavra solicitada antes das outras palavras do bloco de cache para reduzir sua espera.
Uma requisição de uma palavra perto do fim de uma linha pode receber essa palavra primeiro, em vez de esperar pelas palavras anteriores.
Passo de acesso
Um passo de acesso é a diferença de endereço entre acessos sucessivos em um percurso, medida em bytes ou em elementos, com a unidade especificada.
Um percurso por colunas em uma matriz armazenada por linhas avança pelo comprimento de uma linha em bytes em vez do tamanho de um elemento.
Penalidade por falta
A penalidade por falta é o atraso adicional após a consulta à cache necessário para buscar, instalar e entregar um bloco de um nível inferior.
Uma consulta de 2 ciclos com penalidade adicional de 80 ciclos faz um acesso completo com falta levar 82 ciclos em um modelo sequencial.
Percurso da tabela de páginas
Um percurso da tabela de páginas lê as entradas de mapeamento necessárias para traduzir um endereço após uma falta na TLB e verifica se o mapeamento permite o acesso.
Um percurso bem-sucedido preenche novamente a TLB, enquanto um mapeamento ausente ou não permitido pode gerar uma falta de página.
Período de clock
O período de clock é a duração de um ciclo do processador, igual ao inverso da frequência de clock e usada para converter CPI em tempo.
Dobrar a frequência de clock reduz o período de clock à metade, mas dobra os ciclos consumidos por um atraso inalterado da DRAM.
Poluição da cache
A poluição da cache é o deslocamento de blocos residentes úteis por dados que proporcionam pouco benefício, como pré-buscas imprecisas ou prematuras.
Uma pré-busca antecipada demais pode ocupar uma linha necessária ao trabalho atual e ser substituída antes do uso.
Pré-busca
A pré-busca solicita dados antes que um acesso por demanda precise deles, permitindo que a latência de transferência se sobreponha a trabalho útil quando a requisição é feita no momento certo.
Um mecanismo de pré-busca de sequências pode preparar linhas posteriores do vetor, mas requisições imprecisas ainda consomem largura de banda e espaço na cache.
Preenchimento de alinhamento
O preenchimento de alinhamento acrescenta armazenamento não usado entre regiões lógicas de dados, podendo alterar os passos de endereço e como essas regiões são mapeadas para conjuntos da cache.
Acrescentar oito valores double a um comprimento de linha que é potência de dois pode distribuir os inícios de linhas sucessivas por conjuntos diferentes.
Pseudo-LRU
Pseudo-LRU é um método aproximado de substituição que mantém menos informações de estado que a LRU exata enquanto tenta favorecer blocos usados recentemente.
Caches com alta associatividade frequentemente aproximam o uso recente porque registrar uma ordenação completa exige mais hardware.

Q

Quadro de página
Um quadro de página é uma posição do tamanho de uma página na memória principal física que pode conter o conteúdo mapeado por uma página virtual.
Dois processos podem compartilhar dados deliberadamente mapeando páginas virtuais selecionadas para o mesmo quadro físico.

R

Rastro de acessos à cache
Um rastro de acessos à cache é um registro ordenado de acessos e das mudanças de estado resultantes, usado para determinar acertos, faltas e substituições.
Atualizar cada entrada imediatamente após um carregamento permite que a próxima linha do rastro use o bloco residente correto.
Refrescamento da memória
Refrescamento é a restauração periódica da carga nas células DRAM para que a fuga não apague os valores armazenados nelas.
O refrescamento da DDR4 em temperatura normal cobre suas linhas dentro de um intervalo de 64 ms, com tempos mais restritos em temperaturas mais altas.
Reinício antecipado
O reinício antecipado retoma o acesso em espera quando sua palavra solicitada chega durante o carregamento de um bloco, antes que a linha inteira seja recebida.
O processador pode continuar com a palavra necessária enquanto o restante de uma linha longa ainda está sendo transferido.

S

Sem alocação na escrita
A política sem alocação na escrita trata uma falta de escrita enviando a escrita ao nível inferior sem instalar seu bloco na cache verificada.
Uma sequência de saída usada uma única vez pode evitar o deslocamento de dados reutilizáveis na cache quando suas faltas de escrita não alocam blocos.
Substituição do bloco menos recentemente usado (LRU)
A substituição LRU remove o bloco cujo acesso mais recente ocorreu há mais tempo entre as entradas válidas do conjunto selecionado.
Um acerto altera a informação de uso recente mesmo sem carregar um novo bloco, o que pode mudar a vítima escolhida na próxima falta.
Substituição excessiva de blocos
A substituição excessiva de blocos é a remoção e o recarregamento repetidos de blocos necessários ao trabalho ativo, produzindo muitas faltas porque eles não conseguem permanecer residentes juntos.
Percorrer ciclicamente três blocos em um conjunto LRU de duas vias pode substituir cada bloco pouco antes de seu próximo uso.
Substituição por ordem de chegada (FIFO)
A substituição FIFO remove o bloco que entrou primeiro em um conjunto, sem alterar a ordem de inserção quando esse bloco recebe um acerto.
Acertos repetidos podem tornar muito útil o bloco carregado há mais tempo, mas a FIFO ainda o seleciona antes dos que chegaram depois.

T

Taxa de acertos
Uma taxa de acertos é o número de acessos que encontram seu bloco no nível verificado dividido por todos os acessos a esse nível.
Noventa acertos em cem requisições à cache resultam em taxa de acertos de 90% e taxa complementar de faltas de 10%.
Taxa de faltas
Uma taxa de faltas é a fração de uma população especificada de requisições que não encontra seu bloco na cache medida.
Uma taxa de faltas de 4% é inserida como 0,04 ao multiplicá-la por uma penalidade adicional em um cálculo de AMAT.
Taxa de faltas ponderada
Uma taxa de faltas ponderada combina classes de requisições somando suas contagens esperadas de faltas e dividindo pelo número combinado de acessos.
As taxas de instruções e de dados precisam ser ponderadas pelo número de acessos quando cada instrução produz menos de uma requisição de dados.
Taxa global de faltas
Uma taxa global de faltas divide as faltas de um nível de cache pelas requisições originais de memória do processador, incluindo as requisições atendidas acima desse nível.
Faltas na L1 de 5% e faltas locais na L2 de 20% produzem uma taxa global de faltas da L2 de 1%.
Taxa local de faltas
Uma taxa local de faltas divide as faltas em um nível de cache apenas pelos acessos que chegaram a esse nível após a filtragem dos níveis superiores.
Uma taxa local de faltas da L2 de 20% descreve seu fluxo de requisições mais difíceis, não 20% de todos os acessos do processador.
Tempo de acerto
Tempo de acerto é o atraso para acessar um nível de cache e determinar se houve acerto, incluindo a consulta realizada nas faltas.
Uma consulta de 2 ciclos acrescenta dois ciclos a toda requisição antes de qualquer atraso adicional por falta ser contado.
Tempo médio de acesso à memória (AMAT)
O tempo médio de acesso à memória é o atraso esperado por requisição de memória, combinando o tempo de consulta e o custo adicional das faltas ponderado pela probabilidade.
Uma consulta mais lenta pode anular o benefício de menos faltas quando a penalidade evitada do nível inferior é pequena.

V

Vetor de estruturas (AoS)
Um vetor de estruturas armazena registros contiguamente com os campos de cada registro juntos, favorecendo o acesso a vários campos de um registro.
Uma atualização de partícula que usa posição e velocidade juntas pode aproveitar grande parte da linha buscada para uma partícula.
Via
Uma via é uma das entradas disponíveis da cache dentro de um conjunto, cada uma capaz de conter um bloco de dados com sua própria etiqueta.
Um conjunto de oito vias pode manter oito blocos concorrentes antes que um novo carregamento precise escolher uma vítima válida.

Sobre esta aula

Por StudeliRelatar um erro

Crie seus próprios Materiais de Estudo

Transforme suas anotações, slides e documentos em Guias de Estudo, Questões de Prática, Flashcards e mais 6 ferramentas.

Começar