- A microarquitetura define como uma CPU implementa um ISA (Interface de Software) e determina seu IPC (Instruções por Ciclo), paralelismo interno e eficiência real, além da frequência ou do tamanho do cache.
- Tecnologias como AMD Zen e Zen 2 combinam caches otimizados, execução fora de ordem, SMT (Single-Module Technology) e grandes unidades vetoriais para aumentar o desempenho por ciclo e por watt.
- A estratégia de chiplets e Infinity Fabric permite aumentar o número de núcleos em EPYC e Ryzen, mantendo custos controlados e desempenho altamente competitivo.
A microarquitetura de uma CPU muitas vezes fica em segundo plano em relação a números mais chamativos, como GHz ou MB de cache, mas é justamente no projeto interno do processador que se definem a maior parte de seu desempenho real, sua eficiência e até mesmo o tipo de software que melhor pode aproveitá-lo.
Ao ler especificações técnicas que mencionam núcleos, threads, cache L3 ou AVX2 , você está, na verdade, vendo as consequências concretas de uma microarquitetura específica. Compreender como esses componentes são organizados internamente, o que diferencia um Zen 3 de um Zen 2, ou um Intel híbrido de um Ryzen clássico, é fundamental para escolher seu próximo processador com sabedoria e entender por que alguns se destacam em jogos, outros em renderização e outros ainda em tarefas de servidor.
ISA, macroarquitetura e microarquitetura: organizando os conceitos
Antes de nos aprofundarmos nas complexidades de pipelines e preditores, é útil distinguir entre três níveis frequentemente confundidos: macroarquitetura do sistema, ISA (Arquitetura Interna de Sistemas) e microarquitetura . Cada um descreve uma camada diferente do computador.
Por um lado, temos a macroarquitetura, ou projeto geral do sistema , que engloba tudo o que você vê na placa-mãe: CPU, controladores de memória, barramentos, memória principal, chips de entrada/saída, controladores de armazenamento, quaisquer aceleradores externos e lógica DMA. É uma visão geral de como os grandes componentes de hardware se conectam e como os dados fluem entre eles.
Acima disso está a ISA (Arquitetura do Conjunto de Instruções) , que é o conjunto de instruções que o processador entende: os tipos de dados que ele manipula, o tamanho da palavra, o número e o tipo de registradores, os modos de endereçamento, os formatos de instrução, etc. Quando você programa em assembly usando mnemônicos como ADD, SUB, MUL ou invoca extensões como SSE, AVX ou NEON, você está se comunicando diretamente com a ISA.
Por fim, temos o microcódigo, ou μISA , que define as microoperações internas que algumas arquiteturas complexas (como x86) usam para implementar suas instruções CISC. Esse microcódigo pode ser atualizado via firmware para corrigir erros ou adicionar suporte a novas instruções.
O que exatamente é a microarquitetura de uma CPU?
A microarquitetura da CPU é essencialmente o projeto interno que determina como as instruções da ISA são executadas e como os dados se movem dentro do chip. Dois processadores podem compartilhar a mesma ISA (por exemplo, AMD64 na Intel e AMD) e ainda assim apresentar comportamento e desempenho radicalmente diferentes devido a — ou talvez por causa de — suas microarquiteturas.
Este projeto inclui elementos como o tipo de unidade de controle , se é utilizado microcódigo programável ou lógica fixa; a hierarquia de memória; a profundidade do pipeline; quantas unidades funcionais trabalham em paralelo; e se o processador é capaz de executar instruções fora de ordem e de forma especulativa.
Além disso, o projetista deve escolher a profundidade do pipeline : desde CPUs simples sem pipeline, onde cada instrução é processada do início ao fim antes de iniciar a próxima, até projetos modernos com muitos estágios (buscar, decodificar, renomear, despachar, executar, gravar de volta, encerrar…) que permitem que dezenas de instruções estejam em andamento ao mesmo tempo.
Relacionado a isso está o número e o tipo de unidades de execução : ALUs para inteiros, unidades de multiplicação, divisores, FPUs para números de ponto flutuante escalares e vetoriais, AGUs (Unidades de Geração de Endereços) para calcular endereços de memória, unidades de salto, etc. Se houver várias unidades do mesmo tipo, falamos de processadores superescalares, capazes de despachar várias instruções por ciclo.
Essa é a base para técnicas avançadas como a execução especulativa , onde a CPU antecipa a resolução de um desvio e executa instruções de um dos desvios com antecedência. Se a previsão estiver correta, economiza-se tempo; se falhar, o trabalho realizado é descartado e o pipeline é esvaziado, com a penalidade correspondente.
A maioria das CPUs modernas de alto desempenho também usa execução fora de ordem (OoO) . Em vez de seguir estritamente a ordem do programa, o processador reordena internamente as instruções e executa primeiro aquelas cujos dados estão prontos, evitando ciclos ociosos enquanto outras aguardam memória ou o resultado de operações anteriores.
Para que tudo isso funcione sem violar a semântica do programa, utiliza-se a renomeação de registradores . O compilador vê um conjunto limitado de registradores lógicos, mas a microarquitetura os traduz em um banco maior de registradores físicos, atribuindo dinamicamente novos destinos para quebrar falsas dependências e permitir maior paralelismo.
Por fim, o projeto pode se concentrar em adicionar paralelismo no nível do núcleo e dos threads . Isso inclui tudo, desde CPUs de núcleo único até chips com dezenas ou centenas de núcleos (manycore), sistemas multiprocessadores com múltiplos soquetes interconectados por redes mesh de alta velocidade (Infinity Fabric, Intel Mesh, NVLink, etc.) e suporte a multithreading simultâneo (SMT), para que cada núcleo físico possa lidar com dois ou mais threads lógicos.
Compatibilidade, ISA e famílias de microarquitetura
Como uma microarquitetura é apenas uma implementação específica de uma ISA (Conjunto de Instrumentos de Arquitetura) , uma única ISA pode ter dezenas de microarquiteturas diferentes ao longo dos anos e em diferentes fabricantes. É exatamente isso que acontece com x86-64/AMD64 ou ARM.
Analisando apenas a AMD dentro da ISA AMD64, encontramos famílias tão diversas quanto K8/Hammer, K10, Bulldozer e toda a série Zen (Zen, Zen+, Zen 2, Zen 3, Zen 4...). Todas executam o mesmo conjunto básico de instruções, mas sua organização interna, caches, pipelines e abordagens de execução paralela são completamente diferentes.
Ao mudarmos de ISA (Arquitetura de Interface de Software), o salto em compatibilidade é absoluto. Um processador baseado em ARM A64 (como o Apple Silicon) não consegue executar binários compilados para x86-64, e vice-versa, a menos que uma camada de tradução ou emulação como Rosetta 2, QEMU ou similar seja utilizada, com o consequente custo de desempenho.
Mesmo entre processadores que compartilham um ISA (Conjunto de Instruções de Software), não há garantia de que todos suportem o mesmo conjunto de instruções ou extensões. Um chip mais antigo pode não ter AVX2 ou AVX-512, ou um SoC ARM pode implementar apenas um subconjunto de extensões opcionais. Portanto, um binário que utiliza amplamente o AVX-512 pode não inicializar em uma CPU que oferece apenas SSE4.
Ao compilar software, é prática comum gerar binários genéricos para uma ISA específica (por exemplo, x86-64 com pelo menos SSE2) sem utilizar completamente nenhuma microarquitetura em particular, de forma que o executável rode no maior número possível de CPUs. No entanto, se você compilar com flags de otimização para uma microarquitetura específica (-march=znver3, -mtune=skylake, etc.), poderá melhorar significativamente o desempenho nessa família específica, ao custo de perder a compatibilidade com outras.
Licenças ISA e propriedade intelectual do design
Não apenas o código do programa é protegido por licenças: ISAs e microarquiteturas também são propriedade intelectual. Ninguém pode clonar legalmente uma ISA x86 ou AMD64 sem uma licença, assim como um projeto de CPU proprietário não pode ser copiado sem permissão.
No âmbito das ISAs (Arquivos de Interface de Software), existem três abordagens principais. Por um lado, existem as ISAs fechadas , onde o proprietário controla rigorosamente quem pode implementar núcleos compatíveis. O exemplo clássico é a IA-32 (x86-32), historicamente propriedade da Intel, que concedeu licenças à AMD, VIA e outras empresas, não sem batalhas judiciais.
Uma situação semelhante ocorre com o AMD64/x86-64 , inicialmente projetado pela AMD e posteriormente licenciado para a Intel (que o denominou EM64T) por meio de acordos de licenciamento cruzado. Outras empresas, como a Hygon na China, também obtiveram licenças para versões específicas (por exemplo, Zen 1 para o mercado chinês).
Em seguida, temos as ISAs com licenciamento flexível , onde o proprietário oferece tanto licenças da ISA quanto núcleos IP prontos para integração. ARM, SPARC ou OpenPOWER se encaixam aqui: você pode pagar para usar Cortex A/M/R ou Neoverse como estão, ou por uma licença que permite projetar suas próprias microarquiteturas sobre a ISA, como a Apple faz com seus M1/M2/M3 ou a Qualcomm com seu Kryo.
Por fim, existem ISAs de código aberto , onde qualquer pessoa pode criar microarquiteturas compatíveis sem pagar royalties pela ISA (embora possa patentear ou fechar sua própria implementação). O RISC-V é o melhor exemplo: a ISA está sob uma licença BSD permissiva e há opções que variam de kernels completamente abertos em Verilog ou Chisel a projetos comerciais fechados.
Além da ISA, cada microarquitetura específica (um núcleo Zen 4, um Cortex X4, um projeto de GPU, etc.) é um bloco de propriedade intelectual patenteada ou registrada. Também existem projetos abertos, publicados como núcleos flexíveis em HDL para síntese em FPGAs ou integração em SoCs personalizados.
Explorando mais a fundo as microarquiteturas modernas: o caso AMD Zen.
Para ver como tudo isso se traduz em desempenho no mundo real, nada melhor do que analisar uma família de produtos específica. A AMD transformou drasticamente seus negócios graças ao Zen e suas iterações subsequentes , passando da difícil era Bulldozer e dos antigos processadores FX para competir de igual para igual (e às vezes até superar) a Intel nos mercados de desktops, servidores e laptops.
Após o fracasso da estratégia AMD Fusion , a empresa se reestruturou e optou por um design de alto desempenho liderado, entre outros, por Jim Keller. O plano Zen visava aumentar agressivamente o IPC (instruções por ciclo) em comparação com o Bulldozer, melhorar o desempenho por watt e recuperar terreno no desempenho de núcleo único, área na qual a Intel detinha a liderança há anos.
Uma das principais mudanças foi o fortalecimento do front-end , a parte responsável por buscar e preparar as instruções. O Zen introduziu um cache de micro-operações que armazena micro-operações já decodificadas, semelhante ao que algumas microarquiteturas da Intel, como o Conroe, faziam. O Bulldozer não possuía esse recurso e dependia mais da hierarquia clássica de cache de instruções, o que impactava negativamente seu desempenho.
O decodificador do Zen consegue traduzir até quatro instruções CISC x86-64 por ciclo em micro-operações semelhantes às do RISC. Essas micro-operações são então colocadas em uma fila alimentada pelo buffer de micro-operações, que por sua vez pode despachar até seis micro-operações por ciclo para os agendadores de back-end. É aqui que a execução fora de ordem começa.
A AMD separou claramente os caminhos de processamento de inteiros e de ponto flutuante . No lado dos inteiros, as ALUs, AGUs e a lógica de carga/armazenamento são alimentadas pela fila de micro-operações. Essa lógica é capaz de realizar duas cargas de 16 bytes e um armazenamento de 16 bytes por ciclo a partir de um L1D de 32 KB e 8 vias, com uma política de write-back.
Os circuitos de ponto flutuante e vetoriais alimentam as unidades FMAC e AVX. Com duas portas de multiplicação e duas de adição, o Zen pode executar simultaneamente duas operações FMA de 128 bits ou uma operação AVX de 256 bits por ciclo de clock. Esse paralelismo em nível de instrução é uma das chaves para seu alto desempenho em cargas de trabalho computacionalmente intensivas.
Hierarquia de cache, TLB e organização de memória no Zen
A hierarquia de memória no Zen é organizada em três níveis de cache: L1 separado para instruções e dados, L2 privado por núcleo e L3 compartilhado . Embora herde a estrutura básica de microarquiteturas anteriores, os tamanhos, a associatividade e as políticas foram refinados.
O cache L1I (cache de instruções) oferece 64 KB por núcleo, com 4 caminhos associativos, dobrando o número de caminhos por módulo em comparação com o Bulldozer e reduzindo conflitos. O cache L1D (cache de dados) foi aumentado para 32 KB, 8 caminhos e uma política de write-back, em comparação com os 16 KB, 4 caminhos e write-through do Bulldozer, melhorando significativamente tanto a taxa de acertos quanto a eficiência de escrita.
O cache L2 é implementado com 512 KB por núcleo e 8 vias, em vez dos 2 MB compartilhados em 16 vias por módulo da geração anterior. O cache L3 , por sua vez, oferece vários MB por núcleo com associatividade de 16 vias, atuando como o último nível compartilhado antes de acessar a DRAM.
Em paralelo, o Zen separa os TLBs em ITLBs (para instruções) e DTLBs (para dados) , cada um com vários níveis e centenas de entradas, todos com proteção de paridade. Isso reduz significativamente a latência de tradução de endereços virtuais para físicos, o que se torna cada vez mais crítico à medida que os tamanhos de memória aumentam.
Quando falamos de um cache de 2, 4 ou 8 vias , estamos descrevendo sua associatividade, que está intimamente relacionada à ideia de intercalação na memória. Mais associatividade significa mais maneiras diferentes de armazenar um bloco de memória nesse cache, reduzindo conflitos, mas ao custo de uma lógica ligeiramente mais complexa e um pequeno aumento na latência.
Também é importante entender a diferença entre write-through e write-back . No write-through, cada escrita atualiza simultaneamente o cache e a memória principal, simplificando a consistência , mas aumentando o tráfego. No write-back, apenas o cache é escrito e a linha é marcada com um bit de modificação; a DRAM só é atualizada quando essa linha é removida, economizando largura de banda e melhorando o desempenho, ao custo de uma lógica ligeiramente mais complexa.
Zen e Zen+: um salto no IPC e na eficiência
Zen representou um salto de IPC muito significativo para a AMD em comparação com Bulldozer , graças à combinação de um front-end melhor, um preditor de ramificação melhor, mais unidades de execução, SMT em vez de CMT (cada núcleo completo lida com duas threads, em vez de compartilhar parte da FPU entre dois núcleos lógicos) e uma hierarquia de cache muito mais sensata.
Além do design, a AMD se beneficiou de processos de fabricação mais avançados com FinFET e nós menores , que permitem maior densidade de transistores, menor consumo de energia com o mesmo desempenho e frequências mais altas, mantendo TDPs ( curva de tensão-frequência ) razoáveis. Esse equilíbrio entre desempenho e consumo de energia foi crucial para recuperar a competitividade em laptops e servidores.
A transição do Bulldozer para o Zen também trouxe filas de aposentadoria mais longas, agendadores de instruções maiores, maior largura de banda interna, previsão de desvios com técnicas baseadas até mesmo em redes neurais simples e uma SMT capaz de aproveitar melhor as unidades de execução disponíveis.
Nesse contexto, surge o Zen+ , que podemos ver como o equivalente a um "tick" na antiga estratégia Tick-Tock da Intel: o mesmo design básico do Zen, mas fabricado em um nó mais refinado, com melhorias de frequência, ligeiras reduções de latência e ajustes de temporização interna. Não se trata de uma revolução arquitetônica, mas sim de um refinamento que se traduz em alguns pontos de desempenho adicionais.
Zen 2: chiplets, AVX2 completo e refinamento profundo.
Com o Zen 2 , a AMD não está apenas aprimorando o processo: está introduzindo mudanças substanciais na microarquitetura e lançando em larga escala sua estratégia de chiplets . Em vez de um único chip monolítico grande, está dividindo o design em vários chips de computação (CCDs) menores de 7 nm e um chip de E/S separado de 12 nm para memória, PCIe e interconexões.
Essa abordagem de chiplets melhora o rendimento por wafer (é mais fácil fabricar chips pequenos e sem defeitos), reduz custos e facilita o aumento do número de núcleos: basta adicionar mais CCDs para atingir 16, 32 ou mais núcleos em EPYC e Threadripper. A contrapartida é uma comunicação interna ligeiramente mais complexa, dependente da interconexão Infinity Fabric, que a AMD vem aprimorando geração após geração.
Em termos de desempenho bruto, a AMD fala em um aumento de cerca de 15% no IPC (Instruções por Ciclo) para o Zen 2 em comparação com o Zen+ na mesma frequência, e uma melhoria geral de desempenho por watt que pode chegar a cerca de 75% em comparação com o primeiro Zen, quando as melhorias de design e processo são combinadas.
No backend vetorial, o Zen 2 traz a peça que faltava: oferece suporte completo a AVX2 de 256 bits em uma única micro-operação , sem dividir as instruções em duas operações de 128 bits, como acontecia no Zen/Zen+. Isso significa que as unidades de execução vetorial agora são verdadeiramente de 256 bits e podem processar cargas de trabalho AVX2 em velocidade máxima com uma penalidade de frequência muito menor do que em outros projetos.
O cache de micro-operações também está sendo reforçado, aumentando para 4K entradas (o dobro do tamanho), aproveitando parte da área liberada pela redução pela metade do cache L1I, mas dobrando sua associatividade de 4 para 8 vias. Simulações internas levaram a AMD a concluir que, para a maioria das cargas de trabalho do mundo real, um cache de micro-operações maior é mais vantajoso do que um cache L1I maior.
A capacidade do cache L3 por bloco de núcleo foi duplicada , o que ajuda a reduzir as falhas de último nível, embora a latência de acesso aumente de aproximadamente 35 para 40 ciclos. Para mitigar esse efeito, o Zen 2 aprimora as larguras de banda de carga e armazenamento e refina a política de pré-busca.
Outro aspecto importante é o preditor de ramificações. O Zen 2 utiliza um preditor TAGE (TAgged GEometric) com mais de 7 entradas, capaz de aproveitar históricos de comprimento variável e entradas marcadas. Isso reduz o aliasing entre diferentes ramificações e, de acordo com a AMD, diminui o número de previsões incorretas em cerca de 30% em comparação com o esquema anterior, o que se traduz diretamente em menos limpezas de pipeline e maior IPC (intervalo entre processos).
Back-end Zen 2: AGUs, buffers e latências ajustadas
Em toda a infraestrutura de processamento, o Zen 2 continua a despachar até seis micro-operações por ciclo a partir do buffer de reordenação, que foi expandido para aproximadamente 224 entradas (em comparação com as 192 do Zen). As unidades de agendamento são divididas em quatro filas para ALUs com 16 entradas cada e uma fila para AGUs com 28 entradas.
O número de Unidades de Geração de Endereços (AGUs) aumenta de duas para três, embora elas não sejam todas idênticas: duas delas podem lidar tanto com leituras quanto com escritas, enquanto a terceira é especializada em operações de armazenamento. Essa distribuição foi projetada para perfis de software típicos, onde as leituras geralmente são mais frequentes e críticas do que as operações de armazenamento.
No plano de ponto flutuante, o back-end pode aceitar quatro micro-operações por ciclo para suas unidades vetoriais FMA de 256 bits, suportadas por um conjunto de registradores físicos de 160 entradas. Os caminhos de carga/armazenamento de 256 bits foram aprimorados para alimentar essas unidades a uma taxa sustentada sob cargas de trabalho vetoriais pesadas.
O Zen 2 também ajusta a latência de certas operações : por exemplo, a multiplicação de ponto flutuante reduz sua latência de 4 para 3 ciclos, o que ajuda em loops de cálculo numérico muito compactos. E, em geral, há um conjunto de pequenas otimizações distribuídas por todo o pipeline que, juntas, resultam no aumento do IPC observado em benchmarks sintéticos e aplicações do mundo real.
Em relação à hierarquia interna por grupos de núcleos, a AMD utiliza o conceito CCX (Core Complex) : um bloco de 4 núcleos que compartilham o mesmo cache L3 (16 MB no Zen 2). Esse tamanho extra implica em uma latência ligeiramente maior, mas, em contrapartida, reduz a taxa de falhas, especialmente em aplicações com grandes conjuntos de dados.
Para referência, podemos relembrar valores aproximados de latência interna: cerca de 4 ciclos para L1 , cerca de 12 para L2 e cerca de 40 ciclos para L3. A chave é manter o máximo de dados possível em L1/L2 e reduzir o tráfego para L3 e DRAM , algo que a microarquitetura e os compiladores trabalham em conjunto para alcançar.
Infinity Fabric: a cola usada em chiplets e seu impacto no desempenho.
Um componente nem sempre associado à microarquitetura, mas vital no Zen 2 e posteriores, é o Infinity Fabric . Esse barramento proprietário atua como uma "via" de comunicação entre os CCXs, CCDs, o chip de E/S, a memória e, em geral, entre todos os blocos do SoC.
Infinity Fabric é uma evolução do HyperTransport , o barramento de alta velocidade pioneiro da AMD anos atrás e também utilizado por terceiros como NVIDIA, Cisco, Sun e outros membros do consórcio. O IF herda a filosofia de links ponto a ponto escaláveis, mas adaptado às necessidades dos SoCs modernos e da interconexão CPU-GPU.
Na arquitetura Zen 2, a AMD introduz o IF2 , com suporte para PCIe 4.0 e um barramento interno de 512 bits entre os CCXs, o dobro da primeira versão. Isso se traduz em uma largura de banda mais efetiva e uma melhoria na eficiência que a AMD estima em cerca de 27% em comparação com o IF1, ajudando a mitigar a perda de desempenho na troca entre chiplets.
Além disso, o clock do Infinity Fabric é parcialmente desacoplado do clock da DRAM , permitindo que a memória principal opere em frequências mais altas em determinados cenários sem necessariamente forçar o IF a acompanhar, o que oferece mais espaço para ajustes finos para entusiastas e projetistas de sistemas.
Em processadores de servidor como o EPYC , com quatro ou mais chiplets de computação, o Infinity Fabric é o que possibilita conectar todos os chips com topologias quase completas (rotações de 180º, links diretos, etc.), atingindo larguras de banda die-to-die que podem facilmente ultrapassar 150 GB/s bidirecional, dependendo da velocidade da DDR utilizada.
A combinação de uma microarquitetura robusta em cada núcleo , um design escalável usando chiplets e interconexões suficientemente rápidas permite à AMD montar CPUs com 32, 64 ou mais núcleos com desempenho excepcional em cargas de trabalho altamente paralelas, mantendo um IPC competitivo por thread.
Em última análise, ao comparar processadores em benchmarks de jogos, renderização 3D, compilação massiva ou simulação científica, os números de GHz e de núcleos contam apenas parte da história. O que realmente faz a diferença é como a microarquitetura orquestra a execução interna , como utiliza ou desperdiça cada ciclo de clock e quais concessões o fabricante fez entre latência, largura de banda, consumo de energia e complexidade.
Índice
- 1 ISA, macroarquitetura e microarquitetura: organizando os conceitos
- 2 O que exatamente é a microarquitetura de uma CPU?
- 3 Compatibilidade, ISA e famílias de microarquitetura
- 4 Licenças ISA e propriedade intelectual do design
- 5 Explorando mais a fundo as microarquiteturas modernas: o caso AMD Zen.
- 6 Hierarquia de cache, TLB e organização de memória no Zen
- 7 Zen e Zen+: um salto no IPC e na eficiência
- 8 Zen 2: chiplets, AVX2 completo e refinamento profundo.
- 9 Back-end Zen 2: AGUs, buffers e latências ajustadas
- 10 Infinity Fabric: a cola usada em chiplets e seu impacto no desempenho.