Hierarquia de cache

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.

Diagrama de arquitetura de processo mostrando quatro processadores independentes, cada um conectado através de sistemas de cache à memória principal e ao sistema de entrada e saída
Organização genérica de cache multinível

Antecedentes

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.

Cache multinível

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.

Tempo médio de acesso (AAT)

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:

Tempo de Acertocache + (Taxa de Falhacache × Penalidade de Falhatempo levado para ir à memória principal após falha no cache).[mais explicações necessárias]

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.

Compromissos

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.

Evolução

Uma série de retângulos de proporções crescentes representando memória crescente desde registradores na CPU e cache L1 até L2, L3 e memória principal
Hierarquia de cache até o nível L3 de cache e memória principal com L1 no chip

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.

Ganhos de desempenho

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.

Desvantagens

Propriedades

três quadrados mostrando caches L1 separados na CPU para instruções e dados, um cache L2 fora do chip e memória principal
Organização de cache com L1 separado e L2 unificado

Banqueado versus unificado

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.

Políticas de inclusão

um diagrama de sistema de memória mostrando uma cópia do L1 dentro do L2 e uma cópia do L2 dentro do L3
Organização de cache inclusiva

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.

Políticas de escrita

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".

Compartilhado versus privado

Três CPUs cada uma com caches L1 privados no chip, mas compartilham o L2, L3 e a memória principal fora do chip.
Organização de cache com L1 privado e L2 e L3 compartilhados

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.

Modelos de implementação recentes

Organização de cache da microarquitetura Intel Nehalem

Intel Xeon Emerald Rapids (2024)

Até 64 núcleos:

Intel i5 Raptor Lake-HX (2024)

6 núcleos (desempenho | eficiência):

AMD EPYC 9684X (Zen 4, 2023)

96 núcleos:

Apple M1 Ultra (2022)

20 núcleos (4:1 núcleo "desempenho" | núcleo "eficiência"):

AMD Zen 3 (2022)

6 a 16 núcleos:

AMD Zen 2 (2019)

AMD Zen (2017)

Intel Kaby Lake (2016)

Intel Broadwell (2014)

IBM POWER7 (2010)

Ver também

Referências

  1. 1 2 Hennessy, John L; Patterson, David A; Asanović, Krste; Bakos, Jason D; Colwell, Robert P; Bhattacharjee, Abhishek; Conte, Thomas M; Duato, José; Franklin, Diana; Goldberg, David; Jouppi, Norman P; Li, Sheng; Muralimanohar, Naveen; Peterson, Gregory D; Pinkston, Timothy Mark; Ranganathan, Prakash; Wood, David Allen; Young, Clifford; Zaky, Amr (2011). Computer Architecture: a Quantitative Approach (em inglês) Sixth ed. [S.l.]: Elsevier Science. ISBN 978-0128119051. OCLC 983459758
  2. ↑ «Cache: Why Level It» (PDF)
  3. ↑ Ronald D. Miller; Lars I. Eriksson; Lee A Fleisher, 2014. Miller's Anesthesia E-Book. Elsevier Health Sciences. p. 75. ISBN 978-0-323-28011-2.
  4. ↑ Albert Y. Zomaya, 2006. Handbook of Nature-Inspired and Innovative Computing: Integrating Classical Models with Emerging Technologies. Springer Science & Business Media. p. 298. ISBN 978-0-387-40532-2.
  5. ↑ Richard C. Dorf, 2018. Sensors, Nanoscience, Biomedical Engineering, and Instruments: Sensors Nanoscience Biomedical Engineering. CRC Press. p. 4. ISBN 978-1-4200-0316-1.
  6. ↑ David A. Patterson; John L. Hennessy, 2004. Computer Organization and Design: The Hardware/Software Interface, Third Edition. Elsevier. p. 552. ISBN 978-0-08-050257-1.
  7. ↑ «Sir Maurice Vincent Wilkes | British computer scientist». Encyclopædia Britannica. Consultado em 11 de dezembro de 2016
  8. ↑ Berkeley, John L. Hennessy, Stanford University, and David A. Patterson, University of California. «Memory Hierarchy Design – Part 6. The Intel Core i7, fallacies, and pitfalls». EDN. Consultado em 13 de outubro de 2022
  9. ↑ Shane Cook, 2012. CUDA Programming: A Developer's Guide to Parallel Computing with GPUs. Newnes. pp. 107–109. ISBN 978-0-12-415988-4.
  10. ↑ Bruce Hellingsworth; Patrick Hall; Howard Anderson; 2001. Higher National Computing. Routledge. pp. 30–31. ISBN 978-0-7506-5230-8.
  11. ↑ Reeta Sahoo, Gagan Sahoo. Infomatic Practices. Saraswati House Pvt Ltd. pp. 1–. ISBN 978-93-5199-433-6.
  12. ↑ Phillip A. Laplante; Seppo J. Ovaska; 2011. Real-Time Systems Design and Analysis: Tools for the Practitioner. John Wiley & Sons. pp. 94–95. ISBN 978-1-118-13659-1.
  13. 1 2 3 Hennessey and Patterson. Computer Architecture: A Quantitative Approach. [S.l.]: Morgan Kaufmann. ISBN 9780123704900
  14. ↑ Cetin Kaya Koc, 2008. Cryptographic Engineering. Springer Science & Business Media. pp. 479–480. ISBN 978-0-387-71817-0.
  15. ↑ David A. Patterson; John L. Hennessy; 2008. Computer Organization and Design: The Hardware/Software Interface. Morgan Kaufmann. pp. 489–492. ISBN 978-0-08-092281-2.
  16. ↑ Harvey G. Cragon, 2000. Computer Architecture and Implementation. Cambridge University Press. pp. 95–97. ISBN 978-0-521-65168-4.
  17. ↑ Baker Mohammad, 2013. Embedded Memory Design for Multi-Core and Systems on Chip. Springer Science & Business Media. pp. 11–14. ISBN 978-1-4614-8881-1.
  18. ↑ Gayde, William. «How CPUs are Designed and Built». Techspot. Consultado em 17 de agosto de 2019
  19. ↑ Vojin G. Oklobdzija, 2017. Digital Design and Fabrication. CRC Press. p. 4. ISBN 978-0-8493-8604-6.
  20. ↑ «Memory Hierarchy»
  21. 1 2 Solihin, Yan (2016). Fundamentals of Parallel Multicore Architecture. [S.l.]: Chapman and Hall. pp. Chapter 5: Introduction to Memory Hierarchy Organization. ISBN 9781482211184
  22. ↑ Yan Solihin, 2015. Fundamentals of Parallel Multicore Architecture. CRC Press. p. 150. ISBN 978-1-4822-1119-1.
  23. ↑ Steve Heath, 2002. Embedded Systems Design. Elsevier. p. 106. ISBN 978-0-08-047756-5.
  24. ↑ Alan Clements, 2013. Computer Organization & Architecture: Themes and Variations. Cengage Learning. p. 588. ISBN 1-285-41542-6.
  25. ↑ «Performance Evaluation of Exclusive Cache Hierarchies» (PDF). Consultado em 19 de outubro de 2016. Cópia arquivada (PDF) em 13 de agosto de 2012
  26. ↑ David A. Patterson; John L. Hennessy; 2017. Computer Organization and Design RISC-V Edition: The Hardware Software Interface. Elsevier Science. pp. 386–387. ISBN 978-0-12-812276-1.
  27. ↑ Stefan Goedecker; Adolfy Hoisie; 2001. Performance Optimization of Numerically Intensive Codes. SIAM. p. 11. ISBN 978-0-89871-484-5.
  28. 1 2 Solihin, Yan (2009). Fundamentals of Parallel Computer Architecture. [S.l.]: Solihin Publishing. pp. Chapter 6: Introduction to Memory Hierarchy Organization. ISBN 9780984163007
  29. ↑ Harvey G. Cragon, 1996. Memory Systems and Pipelined Processors. Jones & Bartlett Learning. p. 47. ISBN 978-0-86720-474-2.
  30. ↑ David A. Patterson; John L. Hennessy; 2007. Computer Organization and Design, Revised Printing, Third Edition: The Hardware/Software Interface. Elsevier. p. 484. ISBN 978-0-08-055033-6.
  31. ↑ «Software Techniques for Shared-Cache Multi-Core Systems». 24 de maio de 2018
  32. ↑ «An Adaptive Shared/Private NUCA Cache Partitioning Scheme for Chip Multiprocessors» (PDF). Cópia arquivada (PDF) em 19 de outubro de 2016
  33. ↑ Akanksha Jain; Calvin Lin; 2019. Cache Replacement Policies. Morgan & Claypool Publishers. p. 45. ISBN 978-1-68173-577-1.
  34. ↑ David Culler; Jaswinder Pal Singh; Anoop Gupta; 1999. Parallel Computer Architecture: A Hardware/Software Approach. Gulf Professional Publishing. p. 436. ISBN 978-1-55860-343-1.
  35. 1 2 Stephen W. Keckler; Kunle Olukotun; H. Peter Hofstee; 2009. Multicore Processors and Systems. Springer Science & Business Media. p. 182. ISBN 978-1-4419-0263-4.
  36. 1 2 «Intel Broadwell Microarchitecture»
  37. 1 2 «Intel Kaby Lake Microrchitecture»
  38. ↑ «The Architecture of the Nehalem Processor and Nehalem-EP SMP Platforms» (PDF). Cópia arquivada (PDF) em 11 de agosto de 2014
  39. ↑ «IBM Power7». Cópia arquivada em 21 de agosto de 2010