Caches de vários níveis são basicamente um compromisso entre capacidade e custo de acesso (latência / tempo e energia).
Pode ajudar compará-lo a comprar uma ferramenta. Ir à loja de hardware local (comparável ao cache L1) seria rápido e consumiria menos energia, mas a loja de hardware local é pequena e é mais provável que não tenha a ferramenta específica que se busca. Ir para a grande loja de ferragens (comparável ao cache L2) levará mais tempo e energia (está mais distante e a ferramenta vai demorar mais), mas é mais provável que a ferramenta esteja em estoque. Se mesmo a grande loja de ferragens não tiver a ferramenta, pode-se ir ao armazém do fabricante (comparável à memória principal), o que é quase certo que tenha a ferramenta. Se mesmo o armazém não tiver a ferramenta, espera-se uma espera ainda maior até que a fábrica do fabricante (comparável ao disco) produza mais da ferramenta.
Viver ao lado de uma grande loja de hardware (com um cache L1 muito grande) economizaria tempo se a diversidade de suprimentos de hardware buscada fosse normalmente excelente (alguns processadores PA-RISC voltados para cargas de trabalho comerciais faziam isso), mas normalmente uma pequena diversidade de suprimentos usado para que uma pequena loja local teria muito probabilidade de ter o item em estoque (alta probabilidade de um acerto de cache) e encontrar um item comumente usado é mais rápido em uma loja menor.
Como mencionado jcrawfordor, há algumas vantagens em compartilhar um nível de cache entre vários núcleos, pois ele pode: evitar armazenamento repetitivo do mesmo conteúdo de memória, permitir uso desbalanceado da capacidade de armazenamento (por exemplo, um núcleo pode usar todo o armazenamento L2 com um L2 compartilhado enquanto com cache L2 por núcleo, o núcleo seria restrito ao seu próprio cache L2), e simplificaria e agilizaria a comunicação entre os núcleos (o mesmo L2 seria acessado de qualquer maneira em uma falha L1 e não haveria necessidade de verificar se outros caches L2 tinha os dados).
(Vantagens de compartilhamento semelhantes podem ser aplicadas com relação a uma L2 e caches de dados e instrução L1 separados, mas esse compartilhamento de conteúdo geralmente é evitado (ou seja, uma linha de cache geralmente tem apenas código ou dados) e excluindo ações menos comuns como código de autodigitação e compilação JIT, raramente há comunicação entre um cache de instruções e um cache de dados.)
O compartilhamento tem sobrecarga, no entanto. Pode-se compará-lo a compras em uma loja de departamentos. Quanto mais compradores usarem a loja, maior será a probabilidade de haver uma linha em qualquer estação de checkout (comparável a bancos em um cache L2). Além disso, a entrada / saída compartilhada introduz atrasos (comparáveis aos atrasos de arbitragem para acesso ao cache), fornecendo múltiplas portas que suportam maior produtividade, mas aumenta o tempo necessário para escolher uma porta - a sobrecarga de escolha pode ser extremamente pequena (mas não não). existente) quando ninguém mais está entrando / saindo, mas quando a loja está ocupada, a escolha da porta se torna mais complexa. Se assumirmos que a loja estará ocupada, algum atraso na decisão pode ser evitado; mas apenas usar a porta mais conveniente seria mais rápido se a loja não estivesse ocupada (da mesma forma, um cache poderia levar o tempo extra para alocar um buffer para armazenar as informações de solicitação de memória, mesmo que esse buffer não fosse necessário se o cache não está ocupado - sem essa otimização, se o cache estiver ocupado, as duas etapas de determinar se o cache estava ocupado e alocar uma entrada de buffer ocorreriam em seqüência, portanto, o tempo total seria a soma dos dois, mas se o cache não está ocupado, a etapa de alocação de buffer é evitada).
O compartilhamento também pode aumentar a frequência de falhas de conflito, dada a limitada associatividade de um cache e pode causar escolhas ruins de substituição de cache (por exemplo, um núcleo usando um padrão de acesso de streaming com pouca reutilização de dados tenderia a usar capacidade que outro núcleo com reutilização freqüente de dados teriam maior benefício no uso). Existem técnicas para reduzir essas desvantagens, mas elas adicionam complexidade e outros custos.