Hierarquia de cache, ou cache multinível, é uma arquitetura de memória que usa uma hierarquia de armazenamentos de memória baseada em diferentes velocidades de acesso para armazenar dados em cache. Dados altamente solicitados são armazenados em cache em armazenamentos de memória de acesso rápido, permitindo acesso mais rápido pelos núcleos da unidade central de processamento (CPU).
A hierarquia de cache é uma forma e parte da hierarquia de memória e pode ser considerada uma forma de armazenamento em camadas. Este projeto foi concebido para permitir que os núcleos da CPU processassem mais rapidamente, apesar da latência de memória do acesso à memória principal. O acesso à memória principal pode atuar como um gargalo para o desempenho do núcleo da CPU, pois a CPU espera pelos dados, enquanto tornar toda a memória principal de alta velocidade pode ser proibitivamente caro. Os caches de alta velocidade são um compromisso que permite acesso rápido aos dados mais utilizados pela CPU, permitindo um clock da CPU mais rápido.

Na história do desenvolvimento de computadores e chips eletrônicos, houve um período em que os aumentos na velocidade da CPU superaram as melhorias na velocidade de acesso à memória. A diferença entre a velocidade das CPUs e da memória significava que a CPU ficaria frequentemente ociosa. As CPUs eram cada vez mais capazes de executar maiores quantidades de instruções em um determinado tempo, mas o tempo necessário para acessar os dados da memória principal impedia que os programas se beneficiassem totalmente dessa capacidade. Este problema motivou a criação de modelos de memória com taxas de acesso mais altas para realizar o potencial dos processadores mais rápidos.
Isso resultou no conceito de memória cache, proposto pela primeira vez por Maurice Wilkes, um cientista da computação britânico da Universidade de Cambridge em 1965. Ele chamou esses modelos de memória de "memória escrava". Entre aproximadamente 1970 e 1990, artigos de Anant Agarwal, Alan Jay Smith, Mark D. Hill, Thomas R. Puzak e outros discutiram melhores projetos de memória cache. Os primeiros modelos de memória cache foram implementados na época, mas mesmo enquanto os pesquisadores investigavam e propunham melhores projetos, a necessidade de modelos de memória mais rápidos continuava. Essa necessidade resultou do fato de que, embora os primeiros modelos de cache melhorassem a latência de acesso aos dados, devido a custos e limitações técnicas, não era viável para o cache de um sistema de computador se aproximar do tamanho da memória principal. A partir de 1990, ideias como adicionar outro nível de cache (segundo nível), como um backup para o cache de primeiro nível, foram propostas. Jean-Loup Baer, Wen-Hann Wang, Andrew W. Wilson e outros conduziram pesquisas sobre este modelo. Quando várias simulações e implementações demonstraram as vantagens dos modelos de cache de dois níveis, o conceito de caches multinível se popularizou como um modelo novo e geralmente melhor de memórias cache. Desde 2000, os modelos de cache multinível receberam ampla atenção e atualmente são implementados em muitos sistemas, como os caches de três níveis presentes nos produtos Intel Core i7.
Acessar a memória principal para cada execução de instrução pode resultar em processamento lento, com a velocidade do clock dependendo do tempo necessário para localizar e buscar os dados. Para esconder essa latência de memória do processador, o cache de dados é usado. Sempre que os dados são necessários ao processador, eles são buscados da memória principal e armazenados na estrutura de memória menor chamada cache. Se houver qualquer necessidade adicional desses dados, o cache é pesquisado primeiro antes de ir para a memória principal. Esta estrutura reside mais próxima do processador em termos do tempo necessário para pesquisar e buscar dados em relação à memória principal. As vantagens do uso de cache podem ser comprovadas calculando o tempo médio de acesso (AAT) para a hierarquia de memória com e sem o cache.
Os caches, por serem pequenos, podem resultar em falhas frequentes – quando uma busca no cache não fornece a informação procurada – resultando em uma chamada à memória principal para buscar dados. Assim, o AAT é afetado pela taxa de falha de cada estrutura na qual ele pesquisa os dados.
O AAT para a memória principal é dado pelo Tempo de acertomemória principal. O AAT para caches pode ser dado por:
O tempo de acerto para caches é menor que o tempo de acerto para a memória principal, portanto o AAT para recuperação de dados é significativamente menor ao acessar dados através do cache do que através da memória principal.
Embora o uso do cache possa melhorar a latência da memória, nem sempre resulta na melhoria necessária para o tempo gasto na busca de dados devido à forma como os caches são organizados e percorridos. Por exemplo, caches de mapeamento direto do mesmo tamanho geralmente têm uma taxa de falha maior do que caches totalmente associativos. Isso também pode depender do benchmark do computador que testa o processador e do padrão das instruções. Mas usar um cache totalmente associativo pode resultar em maior consumo de energia, pois precisa pesquisar todo o cache a cada vez. Devido a isso, o compromisso entre consumo de energia (e calor associado) e o tamanho do cache torna-se crítico no projeto do cache.

No caso de uma falha de cache, o propósito de usar tal estrutura será inútil e o computador terá que ir à memória principal para buscar os dados necessários. No entanto, com um cache multinível, se o computador falhar no cache mais próximo do processador (cache de nível um ou L1), ele pesquisará então o(s) próximo(s) nível(is) de cache e irá para a memória principal apenas se esses métodos falharem. A tendência geral é manter o cache L1 pequeno e a uma distância de 1–2 ciclos de clock do processador, com os níveis inferiores de cache aumentando em tamanho para armazenar mais dados do que o L1, sendo assim mais distantes, mas com uma taxa de falha menor. Isso resulta em um AAT melhor. O número de níveis de cache pode ser projetado pelos arquitetos de acordo com seus requisitos após verificar os compromissos entre custo, AATs e tamanho.
Com o escalonamento da tecnologia que permitiu que sistemas de memória fossem acomodados em um único chip, a maioria dos processadores modernos tem até três ou quatro níveis de cache. A redução no AAT pode ser compreendida por este exemplo, onde o computador verifica o AAT para diferentes configurações até caches L3.
Exemplo: memória principal = 50 ns, L1 = 1 ns com 10% de taxa de falha, L2 = 5 ns com 1% de taxa de falha, L3 = 10 ns com 0,2% de taxa de falha.

Em um cache banqueado, o cache é dividido em um cache dedicado ao armazenamento de instruções e um cache dedicado a dados. Em contraste, um cache unificado contém ambas as instruções e dados no mesmo cache. Durante um processo, o cache L1 (ou o cache de nível mais alto em relação à sua conexão com o processador) é acessado pelo processador para recuperar tanto instruções quanto dados. Exigir que ambas as ações sejam implementadas ao mesmo tempo requer múltiplas portas e mais tempo de acesso em um cache unificado. Ter múltiplas portas requer hardware e fiação adicionais, levando a uma estrutura significativa entre os caches e as unidades de processamento. Para evitar isso, o cache L1 é frequentemente organizado como um cache banqueado, o que resulta em menos portas, menos hardware e tempos de acesso geralmente menores.
Processadores modernos têm caches divididos, e em sistemas com caches multinível, os caches de nível inferior podem ser unificados enquanto os de nível superior são divididos.

Se um bloco presente na camada de cache superior também pode estar presente no nível de cache inferior é regido pela política de inclusão de cache do sistema de memória, que pode ser inclusiva, exclusiva ou não inclusiva não exclusiva (NINE).[carece de fontes]
Com uma política inclusiva, todos os blocos presentes no cache de nível superior também devem estar presentes no cache de nível inferior. Cada componente de cache de nível superior é um subconjunto do componente de cache de nível inferior. Neste caso, como há uma duplicação de blocos, há algum desperdício de memória. No entanto, a verificação é mais rápida.[carece de fontes]
Sob uma política exclusiva, todos os componentes da hierarquia de cache são completamente exclusivos, de modo que qualquer elemento no cache de nível superior não estará presente em nenhum dos componentes de cache inferiores. Isso permite o uso completo da memória cache. No entanto, há uma alta latência de acesso à memória.
As políticas acima exigem um conjunto de regras a serem seguidas para implementá-las. Se nenhuma delas for forçada, a política de inclusão resultante é chamada de não inclusiva não exclusiva (NINE). Isso significa que o cache de nível superior pode ou não estar presente no cache de nível inferior.
Existem duas políticas que definem a maneira como um bloco de cache modificado será atualizado na memória principal: write through e write back.[carece de fontes]
No caso da política write through, sempre que o valor do bloco de cache muda, ele também é modificado na hierarquia de memória de nível inferior. Esta política garante que os dados sejam armazenados com segurança, pois são escritos em toda a hierarquia.
No entanto, no caso da política write back, o bloco de cache alterado será atualizado na hierarquia de nível inferior apenas quando o bloco de cache for removido. Um "dirty bit" é anexado a cada bloco de cache e definido sempre que o bloco de cache é modificado. Durante a remoção, blocos com um dirty bit definido serão escritos na hierarquia de nível inferior. Sob esta política, há risco de perda de dados, pois a cópia mais recentemente alterada de um dado é armazenada apenas no cache e, portanto, algumas técnicas corretivas devem ser observadas.
No caso de uma escrita onde o byte não está presente no bloco de cache, o byte pode ser trazido para o cache conforme determinado por uma política write allocate ou write no-allocate. A política write allocate afirma que, no caso de uma falha de escrita, o bloco é buscado da memória principal e colocado no cache antes da escrita. Na política write no-allocate, se o bloco não for encontrado no cache, ele será escrito na hierarquia de memória de nível inferior sem trazer o bloco para o cache.
As combinações comuns das políticas são "write back, write allocate" e "write through, write no-allocate".

Um cache privado é atribuído a um núcleo específico em um processador e não pode ser acessado por nenhum outro núcleo. Em algumas arquiteturas, cada núcleo tem seu próprio cache privado; isso cria o risco de blocos duplicados na arquitetura de cache de um sistema, resultando em utilização reduzida da capacidade. No entanto, este tipo de escolha de projeto em uma arquitetura de cache multicamadas também pode ser bom para uma menor latência de acesso aos dados.
Um cache compartilhado é um cache que pode ser acessado por múltiplos núcleos. Como é compartilhado, cada bloco no cache é único e, portanto, tem uma taxa de acerto maior, pois não haverá blocos duplicados. No entanto, a latência de acesso aos dados pode aumentar à medida que múltiplos núcleos tentam acessar o mesmo cache.
Em processadores multi-core, a escolha de projeto para tornar um cache compartilhado ou privado impacta o desempenho do processador. Na prática, o cache de nível superior L1 (ou às vezes L2) é implementado como privado e os caches de nível inferior são implementados como compartilhados. Este projeto fornece altas taxas de acesso para os caches de alto nível e baixas taxas de falha para os caches de nível inferior.

Até 64 núcleos:
6 núcleos (desempenho | eficiência):
96 núcleos:
20 núcleos (4:1 núcleo "desempenho" | núcleo "eficiência"):
6 a 16 núcleos: