Por que o chip M1 da Apple é tão rápido?
A experiência do mundo real com os novos Macs M1 começou a valer. Eles são rápidos. Muito rápido. Mas por que? Qual é a magia?
No YouTube, observei um usuário de Mac que comprou um iMac no ano passado. Foi maximizado com 40 GB de RAM custando cerca de US $ 4.000. Ele assistiu incrédulo como seu iMac hiper caro estava sendo demolido por seu novo M1 Mac Mini, pelo qual ele pagou míseros US $ 700.
No mundo real, teste após teste, os Macs M1 não estão apenas ultrapassando os Macs Intel top de linha, eles os estão destruindo. Em descrença, as pessoas começaram a perguntar como isso é possível?
Se você é uma dessas pessoas, você veio ao lugar certo. Aqui eu pretendo dividir em pedaços digeríveis exatamente o que a Apple fez com o chip M1. Especificamente, as perguntas que acho que muitas pessoas têm são:
- Quais são as razões técnicas para este chip M1 ser tão rápido?
- A Apple fez algumas escolhas técnicas realmente exóticas para tornar isso possível?
- Quão fácil será para a concorrência, como Intel e AMD, usar os mesmos truques técnicos?
Claro que você poderia tentar no Google, mas se você tentar aprender o que a Apple fez além das explicações superficiais, você rapidamente será enterrado em jargão altamente técnico, como M1, usando decodificadores de instruções muito amplos, enorme buffer de reordenação (ROB), etc. A menos que você seja um geek de hardware de CPU, muito disso será simplesmente impossível. Mas se você for, eu recomendo o artigo de Andrei Frumusanu na AnandTech, que se aprofunda nos detalhes. É graças ao seu trabalho árduo e pesquisa que conhecemos muitos detalhes técnicos importantes sobre o M1.
Para tirar o máximo proveito dessa explicação, aconselho a leitura do artigo anterior: “O que RISC e CISC significam em 2020?” Lá eu explico o que é um microprocessador (CPU) assim como vários conceitos importantes como:
- Arquitetura do conjunto de instruções (ISA)
- Tubulação
- Carregar/armazenar arquitetura
- Microcódigo x microoperações
Mas se você estiver impaciente, farei uma versão rápida do material que você precisa entender para entender a explicação sobre o chip M1.
O que é um microprocessador (CPU)?
Normalmente quando falamos de chips da Intel e AMD falamos de unidades centrais de processamento (CPUs) ou microprocessadores. Como você pode ler mais na história RISC vs. CISC, elas extraem instruções da memória. Em seguida, cada instrução é normalmente executada em sequência.
Uma CPU em seu nível mais básico é um dispositivo com um número de células de memória nomeadas chamadas registradores e um número de unidades computacionais chamadas unidades lógicas aritméticas (ALU). As ALUs realizam coisas como adição, subtração e outras operações matemáticas básicas. No entanto, estes são conectados apenas aos registradores da CPU. Se você quiser somar dois números, você tem que pegar esses dois números da memória e em dois registradores na CPU.
Aqui estão alguns exemplos de instruções típicas que uma CPU RISC como encontrada no M1 executa:
load r2, 200
add r1, r2
store r1, 310
Aqui r1 e r2 são os registradores sobre os quais falei. CPUs RISC modernas não podem fazer operações em números que não estão em um registrador como este. Por exemplo, ele não pode adicionar dois números que residem na RAM em dois locais diferentes. Em vez disso, ele precisa puxar esses dois números para um registro separado. Isso é o que fazemos neste exemplo simples. Pegamos o número no local de memória 150 na RAM e o colocamos no registrador r1 na CPU. Em seguida, colocamos o conteúdo do endereço 200 no registrador r2. Só então os números podem ser somados com a instrução add r1, r2. Após isso mandamos salvar o resultado da soma no endereço de memória 310.
O conceito de registros é antigo. Por exemplo, nesta calculadora mecânica antiga, o registro é o que contém os números que você está somando. Provavelmente a origem do termo caixa registradora. O registro é onde você registrou os números de entrada.
![]() |
Uma calculadora mecânica antiga com dois registradores: o acumulador e o registrador de entrada. As CPUs modernas normalmente têm mais de uma dúzia de registros e são eletrônicos e não mecânicos. |
O M1 não é uma CPU!
Mas aqui está uma coisa muito importante para entender sobre o chip M1: O M1 não é uma CPU, é um sistema inteiro de múltiplos chips colocados em um grande pacote de silício. A CPU é apenas um desses chips.
Basicamente, o chip M1 é um computador inteiro em um chip. O M1 contém uma CPU, unidade de processamento gráfico (GPU), memória, controladores de entrada e saída e muito mais coisas que compõem um computador inteiro. Isso é o que chamamos de sistema em um chip (SoC).
![]() |
M1 é um sistema em um chip. Ou seja, todas as peças que compõem um computador são colocadas em um chip de silício. |
Hoje, se você comprar um chip – seja da Intel ou da AMD – você realmente obtém o que equivale a vários microprocessadores em um único pacote. No passado, os computadores tinham vários chips fisicamente separados na placa-mãe do computador.
![]() |
Exemplo de uma placa-mãe de computador. Memória, CPU, placas gráficas, controladores de E/S, placas de rede e muitos outros componentes podem ser conectados à placa-mãe para se comunicarem entre si. |
No entanto, como hoje podemos colocar tantos transistores em uma matriz de silício, empresas como Intel e AMD começaram a colocar vários microprocessadores em um chip. Hoje nos referimos a esses chips como núcleos de CPU. Um núcleo é basicamente um chip totalmente independente que pode ler instruções da memória e realizar cálculos.
![]() |
Um microchip com vários núcleos de CPU. |
Este tem sido por muito tempo o nome do jogo em termos de aumento de desempenho: basta adicionar mais núcleos de CPU de uso geral. Mas há uma perturbação na força. Há um player no mercado de CPU que está se desviando dessa tendência.
A estratégia de computação heterogênea não tão secreta da Apple
Em vez de adicionar cada vez mais núcleos de CPU de uso geral, a Apple seguiu outra estratégia: eles começaram a adicionar chips cada vez mais especializados realizando algumas tarefas especializadas. O benefício disso é que os chips especializados tendem a ser capazes de realizar suas tarefas significativamente mais rápido usando muito menos corrente elétrica do que um núcleo de CPU de uso geral.
Este não é um conhecimento inteiramente novo. Por muitos anos, chips especializados, como as unidades de processamento gráfico (GPUs), estão nas placas gráficas Nvidia e AMD, realizando operações relacionadas a gráficos muito mais rapidamente do que CPUs de uso geral.
O que a Apple fez foi simplesmente dar uma mudança mais radical nessa direção. Em vez de apenas ter núcleos e memória de uso geral, o M1 contém uma ampla variedade de chips especializados:
- Unidade de processamento central (CPU) — os “cérebros” do SoC. Executa a maior parte do código do sistema operacional e seus aplicativos.
- Unidade de processamento gráfico (GPU) — lida com tarefas relacionadas a gráficos, como visualizar a interface do usuário de um aplicativo e jogos 2D/3D.
- Unidade de processamento de imagem (ISP) — pode ser usada para acelerar tarefas comuns realizadas por aplicativos de processamento de imagem.
- Processador de sinal digital (DSP) — lida com funções matematicamente mais intensivas do que uma CPU. Inclui descompactação de arquivos de música.
- Unidade de processamento neural (NPU) — usada em smartphones de última geração para acelerar tarefas de aprendizado de máquina (IA). Isso inclui reconhecimento de voz e processamento de câmera.
- Codificador/decodificador de vídeo — lida com a conversão de arquivos e formatos de vídeo com baixo consumo de energia.
- Secure Enclave — criptografia, autenticação e segurança.
- Memória unificada — permite que a CPU, GPU e outros núcleos troquem informações rapidamente.
Isso é parte do motivo pelo qual muitas pessoas que trabalham em edição de imagens e vídeos com os Macs M1 estão vendo essas melhorias de velocidade. Muitas das tarefas que eles executam podem ser executadas diretamente em hardware especializado. Isso é o que permite que um Mac Mini M1 barato codifique um arquivo de vídeo grande sem suar a camisa, enquanto um iMac caro tem todos os seus fans funcionando a todo vapor e ainda não consegue acompanhar.
![]() |
Em azul você vê vários núcleos de CPU acessando a memória e em verde você vê um grande número de núcleos de GPU acessando a memória. |
O que há de especial na arquitetura de memória unificada da Apple?
A “Arquitetura de Memória Unificada” (UMA) da Apple é um pouco complicada de entender. Para explicar o porquê, precisamos dar alguns passos para trás.
Por muito tempo, sistemas de computador baratos tiveram a CPU e a GPU integradas no mesmo chip (mesma matriz de silício). Estes têm sido notoriamente lentos. No passado, dizer “gráficos integrados” era essencialmente o mesmo que dizer “gráficos lentos”.
Estes eram lentos por vários motivos:
- Áreas separadas desta memória foram reservadas para a CPU e GPU. Se a CPU tivesse um pedaço de dados que queria que a GPU usasse, não poderia dizer “aqui tem um pouco da minha memória”. Não, a CPU teve que copiar explicitamente todo o bloco de dados sobre a área de memória controlada pela GPU.
- CPUs e GPUs não querem que sua memória seja atendida da mesma maneira. Vamos fazer uma analogia boba com comida: CPUs querem que seu prato de dados seja servido muito rapidamente pelo garçom, mas eles são totalmente legais com porções pequenas. Imagine um restaurante francês chique com garçons em patins para atendê-lo muito rapidamente.
![]() |
CPUs não precisam de muitos dados servidos, mas eles querem rápido. |
As GPUs, em contraste, querem porções enormes. Eles engolem grandes quantidades de dados porque são enormes máquinas paralelas, que podem mastigar muitos dados em paralelo. Imagine um lugar americano de junk food, onde a comida chega até sua mesa em carrinhos enormes.
![]() |
É assim que sua GPU quer sua memória: grandes porções. Quanto mais melhor. |
Com necessidades tão diferentes, colocar CPUs e GPUs no mesmo chip físico não foi uma boa ideia. As GPUs ficavam ali morrendo de fome enquanto recebiam pequenas porções francesas. O resultado foi que não fazia sentido colocar GPUs poderosas em um SoC. As pequenas porções de dados servidos podem ser facilmente mastigadas por uma pequena GPU fraca.
O segundo problema foi que GPUs grandes produzem muito calor e, portanto, você não pode integrá-las à CPU sem ter problemas para se livrar do calor produzido. Assim, placas gráficas discretas tendem a se parecer com a abaixo: Grandes feras com enormes ventoinhas. Eles têm memória dedicada especial projetada para servir aos cartões gananciosos grandes quantidades de dados.c
![]() |
GeForce RTX 3080 |
É por isso que essas placas têm alto desempenho. Mas eles têm um calcanhar de Aquiles: sempre que precisam obter dados da memória usada pela CPU, isso acontece por meio de um conjunto de traços de cobre na placa-mãe do computador chamado barramento PCIe. Tente chupar água através de um canudo super fino. Pode chegar à sua boca rapidamente, mas o rendimento é totalmente inadequado.
A arquitetura de memória unificada da Apple tenta resolver todos esses problemas sem ter as desvantagens da memória compartilhada da velha escola. Eles conseguem isso das seguintes maneiras:
- Não existe uma área especial reservada apenas para a CPU ou apenas para a GPU. A memória é alocada para ambos os processadores. Ambos podem usar a mesma memória. Nenhuma cópia é necessária.
- A Apple usa memória que atende a grandes blocos de dados e os atende rapidamente. Na fala do computador, isso é chamado de baixa latência e alto rendimento. Assim, a necessidade de estar conectado a tipos separados de memória é removida.
- A Apple reduziu o uso de watts da GPU, para que uma GPU relativamente poderosa possa ser integrada sem superaquecer o SoC. E os chips ARM produzem menos calor, permitindo que a GPU tenha um orçamento de calor maior do que uma GPU na mesma matriz de silício que uma CPU AMD ou Intel.
Alguns dirão que a memória unificada não é inteiramente nova. É verdade que diferentes sistemas a tiveram no passado. Mas a diferença nos requisitos de memória pode não ter sido tão grande. Em segundo lugar, o que a Nvidia chama de Memória Unificada não é realmente a mesma coisa. No mundo da Nvidia, a memória unificada significa simplesmente que há software e hardware que cuidam da cópia automática de dados entre a CPU separada e a memória da GPU. Assim, do ponto de vista dos programadores, a Apple e a Nvidia Unified Memory podem parecer iguais, mas não são a mesma no sentido físico.
É claro que há uma compensação nessa estratégia. Obter essa memória de alta largura de banda (grandes porções) requer integração total, o que significa que você tira a oportunidade dos clientes de atualizar sua memória. Mas a Apple procura minimizar esse problema tornando a comunicação com os discos SSD tão rápida, que eles funcionam essencialmente como uma memória antiga.
Se os SoCs são tão inteligentes, por que a Intel e a AMD não copiam essa estratégia?
Se o que a Apple está fazendo é tão inteligente, por que nem todo mundo está fazendo isso? Até certo ponto estão. Outros fabricantes de chips ARM estão colocando cada vez mais hardware especializado.
A AMD também começou a colocar GPUs mais fortes em alguns de seus chips e se move gradualmente em direção a alguma forma de SoC com as unidades de processamento acelerado (APU), que são basicamente núcleos de CPU e núcleos de GPU colocados no mesmo molde de silício.
No entanto, existem razões importantes pelas quais eles não podem fazer isso. Um SoC é essencialmente um computador inteiro em um chip. Isso o torna um ajuste mais natural para um fabricante de computadores real, como HP e Dell. Deixe-me esclarecer com uma analogia boba de carro: se o seu modelo de negócios é construir e vender motores de carro, seria um salto incomum começar a fabricar e vender carros inteiros.
Para ARM, em contraste, isso não é um problema. Fabricantes de computadores como Dell ou HP poderiam simplesmente licenciar a propriedade intelectual da ARM e comprar IP (intellectual property - Propriedade Intelectual) para outros chips, para adicionar qualquer hardware especializado que eles achem que seu SoC deveria ter. Em seguida, eles enviam o projeto finalizado para uma fundição de semicondutores como a GlobalFoundries ou TSMC, que hoje fabrica chips para AMD e Apple.
![]() |
Fundição de semicondutores TSMC em Taiwan. A TSMC fabrica chips para outras empresas como AMD, Apple, Nvidia e Qualcomm. |
Aqui temos um grande problema com o modelo de negócios da Intel e AMD. Seus modelos de negócios são baseados na venda de CPUs de uso geral, que as pessoas simplesmente encaixam em uma placa-mãe de PC grande. Assim, os fabricantes de computadores podem simplesmente comprar placas-mãe, memória, CPUs e placas gráficas de diferentes fornecedores e integrá-los em uma solução.
Mas estamos rapidamente nos afastando desse mundo. No novo mundo SoC, você não monta componentes físicos de diferentes fornecedores. Em vez disso, você monta IP (propriedade intelectual) de diferentes fornecedores. Você compra o design para placas gráficas, CPUs, modems, controladores de E/S e outras coisas de diferentes fornecedores e usa isso para projetar um SoC internamente. Então você consegue uma fundição para fabricar isso.
Agora você tem um grande problema, porque nem Intel, AMD ou Nvidia vão licenciar sua propriedade intelectual para a Dell ou HP para que eles façam um SoC para suas máquinas.
Claro que a Intel e a AMD podem simplesmente começar a vender SoCs completos. Mas o que eles devem conter? Os fabricantes de PCs podem ter ideias diferentes sobre o que devem conter. Você pode ter um conflito entre Intel, AMD, Microsoft e fabricantes de PCs sobre que tipo de chips especializados devem ser incluídos porque eles precisarão de suporte de software.
Para a Apple isso é simples. Eles controlam todo o sistema (ele produzem o software e o hardware). Eles fornecem, por exemplo, a biblioteca Core ML para desenvolvedores escreverem coisas de aprendizado de máquina. Se o Core ML é executado na CPU da Apple ou no Neural Engine é um detalhe de implementação que os desenvolvedores não precisam se preocupar.
O desafio fundamental de fazer qualquer CPU funcionar rapidamente
Portanto, a computação heterogênea é parte do motivo, mas não o único motivo. Os núcleos de CPU rápidos de uso geral no M1, chamados Firestorm, são genuinamente rápidos. Este é um grande desvio dos núcleos de CPU ARM no passado, que tendiam a ser muito fracos em comparação com os núcleos AMD e Intel.
O Firestorm, por outro lado, supera a maioria dos núcleos Intel e da AMD Ryzen. A sabedoria convencional dizia que isso não ia acontecer.
Antes de falar sobre o que torna o Firestorm rápido, ajuda a entender qual é realmente a ideia central de fazer uma CPU rápida.
Em princípio você realiza em uma combinação de duas estratégias:
- Execute mais instruções em uma sequência mais rapidamente.
- Execute muitas instruções em paralelo.
Nos anos 80, era fácil. Basta aumentar a frequência do clock e as instruções terminariam mais rapidamente. Cada ciclo de clock é quando o computador faz alguma coisa. Mas esse algo pode ser muito pouco. Assim, uma instrução pode exigir vários ciclos de clock para terminar porque é composta de várias tarefas menores.
No entanto, hoje aumentar a frequência do clock é quase impossível. Portanto, trata-se realmente de executar o maior número possível de instruções em paralelo.
Processadores multi-core ou fora de ordem?
Existem duas abordagens para isso.
- Adicione mais núcleos de CPU. Cada núcleo funciona independente e em paralelo.
- Faça com que cada núcleo da CPU execute várias instruções em paralelo.
Para um desenvolvedor de software, adicionar núcleos é como adicionar threads. Cada núcleo de CPU é como um thread de hardware.
Se você não sabe o que é um thread, pode pensar nele como o processo de execução de uma tarefa. Com dois núcleos, uma CPU pode realizar duas tarefas separadas simultaneamente: dois threads. As tarefas podem ser descritas como dois programas separados armazenados na memória ou podem ser o mesmo programa executado duas vezes. Cada encadeamento precisa de alguma contabilidade, como onde em uma sequência de instruções do programa o encadeamento está atualmente. Cada thread pode armazenar resultados temporários que devem ser mantidos separados.
Em princípio, um processador pode ter apenas um núcleo e executar vários threads. Nesse caso, ele simplesmente interrompe um thread e armazena o progresso atual antes de alternar para outro. Mais tarde, ele volta. Isso não traz muito aprimoramento de desempenho, a menos que o encadeamento tenha que parar com frequência para:
- Aguarde a entrada do usuário.
- Dados de uma conexão de rede lenta, etc.
O problema com os threads é que os desenvolvedores de software precisam escrever o chamado código multi-thread. Isso muitas vezes é difícil. No passado, esse era um dos códigos mais difíceis de escrever. No entanto, tornar o software de servidor multi-thread tende a ser fácil. É simplesmente uma questão de lidar com cada solicitação do usuário em um thread separado. Assim, neste caso, ter muitos núcleos é uma vantagem óbvia. Especialmente para serviços em nuvem.
Essa é a razão pela qual você vê os fabricantes de CPU ARM, como o Ampere, fabricando CPUs como o Altra Max, que possui impressionantes 128 núcleos. Este chip é feito especificamente para a nuvem. Você não precisa de um desempenho maluco de um único núcleo, porque na nuvem tudo se resume a ter o maior número possível de threads por watt para lidar com o maior número possível de usuários simultâneos.
![]() |
A CPU Ampere Altra Max ARM com 128 núcleos projetados para computação em nuvem, onde muitos threads de hardware são um benefício. |
A Apple, por outro lado, está no extremo oposto do espectro. Eles fazem dispositivos de usuário único. Muitas threads não é uma vantagem. Seus dispositivos são usados para jogos, edição de vídeo, desenvolvimento, etc. Eles querem desktops com belos gráficos e animações responsivas.
O software de desktop geralmente não é feito para utilizar muitos núcleos. Por exemplo, os jogos de computador provavelmente se beneficiarão de oito núcleos, mas algo como 128 núcleos seria um desperdício total. Em vez disso, você desejaria menos núcleos, mas mais poderosos.
Como funciona a execução fora de ordem
Para fazer um núcleo mais poderoso, precisamos que ele execute mais instruções em paralelo. A execução fora de ordem (OoOE) é uma maneira de executar mais instruções em paralelo, mas sem expor esse recurso como vários threads.
Os desenvolvedores não precisam codificar seu software especificamente para aproveitar o OoOE. Visto da perspectiva do desenvolvedor, parece que cada núcleo roda mais rápido. Observe que não é uma alternativa direta aos threads de hardware. Você deseja usar ambos, dependendo do problema específico que está resolvendo.
Para entender como o OoOE funciona, você precisa entender algumas coisas sobre memória. Solicitar dados em um local de memória específico é lento. Mas a CPU é capaz de obter muitos bytes ao mesmo tempo. Portanto, obter 1 byte específico na memória não leva menos tempo do que obter mais 100 bytes após esse byte na memória.
![]() |
Robot pickers em um armazém para Komplett.no, uma loja online na Noruega. |
Aqui está uma analogia: considere os catadores em um armazém. Podem ser os pequenos robôs vermelhos na imagem acima. Mover-se para vários locais espalhados por toda parte leva tempo. Mas pegar itens de slots adjacentes é rápido. A memória do computador é muito semelhante. Você pode buscar rapidamente o conteúdo das células de memória que são adjacentes.
Os dados são enviados através do que chamamos de barramento de dados. Você pode pensar nisso como uma estrada ou tubo entre a memória e as diferentes partes da CPU por onde os dados são enviados. Na realidade, é claro que são apenas alguns trilhos de cobre conduzindo eletricidade. Se o barramento de dados for grande o suficiente, você poderá obter vários bytes ao mesmo tempo.
Assim, as CPUs recebem um pedaço inteiro de instruções por vez para serem executadas. Mas eles são escritos para serem executados um após o outro. Os microprocessadores modernos fazem o que chamamos de execução fora de ordem (OoOE).
Isso significa que eles são capazes de analisar um buffer de instruções rapidamente e ver quais dependem de quais. Veja o exemplo simples abaixo:
02: add r4, r1, 5 // r4 ← r1 + 5
03: add r6, r2, 1 // r6 ← r2 + 1
A multiplicação tende a ser um processo lento. Então, digamos que são necessários vários ciclos de clock para serem executados. A segunda instrução simplesmente terá que esperar porque seu cálculo depende do conhecimento do resultado que é colocado no registrador r1.
No entanto, a terceira instrução na linha 03 não depende dos cálculos das instruções anteriores. Portanto, um processador fora de ordem pode começar a calcular essa instrução em paralelo.
No entanto, de forma mais realista, estamos falando de centenas de instruções. A CPU é capaz de descobrir todas as dependências entre essas instruções.
Ele analisa as instruções observando as entradas de cada instrução. As entradas dependem da saída de uma ou mais outras instruções? Por entrada e saída, queremos dizer registradores contendo resultados de cálculos anteriores.
Por exemplo, a instrução add r4, r1, 5 depende da entrada de r1 que é produzida por mul r1, r2, r3. Podemos encadear esses relacionamentos em gráficos longos e elaborados pelos quais a CPU pode trabalhar. Os nós são as instruções e as arestas são os registradores que os conectam.
A CPU pode analisar esse gráfico de nós e determinar quais instruções pode executar em paralelo e onde precisa aguardar os resultados de vários cálculos dependentes antes de continuar.
Muitas instruções terminarão mais cedo, mas não podemos oficializar seus resultados. Caso contrário, fornecemos o resultado na ordem errada. Para o resto do mundo, deve parecer que as instruções foram executadas na mesma sequência em que foram emitidas.
Como uma pilha, a CPU continuará exibindo instruções concluídas do topo, até atingir uma instrução que não foi concluída.
Basicamente, você tem duas formas de paralelismo: uma com a qual o desenvolvedor deve lidar explicitamente ao escrever o código e outra totalmente transparente. É claro que o último depende de muitos transistores na CPU dedicados à magia de execução fora de ordem. Esta não é uma solução viável para CPUs pequenas com poucos transistores.
É a execução superior fora de ordem que está fazendo os núcleos Firestorm no M1 arrasarem. Na verdade, é muito mais forte do que qualquer coisa da Intel ou AMD e eles podem nunca conseguir alcançá-lo. Para entender o porquê, precisamos entrar em alguns detalhes mais técnicos.
Instruções ISA vs Micro-Operações
Anteriormente, pulei alguns detalhes sobre como a execução fora de ordem (OoOE) funciona.
Os programas carregados na memória são compostos de instruções de código de máquina projetadas para Arquiteturas de Conjunto de Instruções (ISA - Instruction-Set Architecture) específicas, como x86, ARM, PowerPC, 68K, MIPS, AVR etc.
Por exemplo, a instrução x86 para buscar um número do local de memória 24 em um registrador, você pode escrever:
MOV ax, 24
x86 tem registradores chamados ax, bx, cx e dx (lembre-se que estas são as células de memória dentro da CPU em que você executa as operações). No entanto, a instrução ARM equivalente ficaria assim:
LDR r0, 24
Os processadores AMD e Intel entendem o x86 (ISA), enquanto os chips Apple Silicon, como o M1, entendem a ARM (ISA).
No entanto, internamente, a CPU trabalha em um conjunto de instruções totalmente diferente, invisível para o programador. Chamamos essas micro-operações (micro-ops ou μops). Estas são as instruções com as quais o hardware fora de ordem funciona.
Mas por que o hardware OoOE não funciona com instruções regulares de código de máquina? Porque a CPU precisa anexar muitas informações diferentes às instruções para poder executá-las em paralelo.
Assim, enquanto uma instrução ARM normal pode ser de 32 bits (32 dígitos de 0 e 1), um micro-op pode ser muito mais longo. Ele contém informações sobre seu pedido.
01: mul r1, r2, r3 // r1 ← r2 × r302: add r4, r1, 5 // r4 ← r1 + 5
03: add r1, r2, 1 // r1 ← r2 + 1
Considere se executarmos a instrução 01: mul e 03: add em paralelo. Ambos armazenam seu resultado no registrador r1. Se escrevermos o resultado da instrução 03: add antes de 01: mul, então a instrução 02: add receberá a entrada errada. Por isso, é muito importante manter o controle da ordem das instruções. A ordem é armazenada com cada micro-op. Também armazena, por exemplo, que a instrução 02: add depende da saída de 01: mul.
É por isso que não podemos ter programas escritos usando micro-ops. Eles contêm muitos detalhes específicos dos componentes internos de cada microprocessador. Dois processadores ARM podem ter micro-ops muito diferentes internamente.
Além disso, micro-ops geralmente são mais fáceis de trabalhar para a CPU. Por quê? Porque cada um deles faz uma tarefa simples e limitada. As instruções regulares do ISA podem ser mais complexas, causando um monte de coisas e, portanto, frequentemente se traduzem em vários micro-ops. Assim, o nome “micro” vem da pequena tarefa que eles fazem, não do comprimento da instrução na memória.
Para CPUs CISC, geralmente não há alternativa a não ser usar micro-ops, caso contrário, as grandes e complexas instruções CISC tornariam pipelines e OoOE quase impossíveis de alcançar.
CPUs RISC têm uma escolha. Assim, por exemplo, CPUs ARM menores não usam micro-ops. Mas isso também significa que eles não podem fazer coisas como OoOE.
Por que a execução fora de ordem da AMD e da Intel é inferior ao M1?
Mas você se pergunta, por que isso importa? Por que esse detalhe é importante saber para entender por que a Apple tem vantagem sobre a AMD e a Intel?
É porque a capacidade de executar rápido depende da rapidez com que você pode preencher um buffer de micro-operações. Se você tiver um buffer grande, o hardware OoOE terá mais facilidade para localizar duas ou mais instruções que podem ser executadas em paralelo. Mas não faz sentido ter um buffer de instrução grande se você não puder reabastecê-lo rápido o suficiente depois que as instruções forem selecionadas e executadas.
A capacidade de reabastecer o buffer de instrução rapidamente depende da capacidade de cortar rapidamente a instrução do código de máquina em micro-ops. As unidades de hardware que fazem isso são chamadas de decodificadores.
E finalmente chegamos ao recurso matador do M1. O maior e mais mesquinho microprocessador Intel e AMD tem um total de 4 (quatro) decodificadores ocupados cortando instruções de código de máquina em micro-ops.
Mas isso não é páreo para o M1, que tem um número absolutamente inédito de decodificadores: 8 (oito). Significativamente mais do que qualquer outro processador na indústria. Isso significa que ele pode preencher o buffer de instruções muito mais rápido.
Para lidar com isso, o M1 também possui um buffer de instrução 3x maior do que o normal na indústria.
Por que a Intel e a AMD não podem adicionar mais decodificadores de instruções?
É aqui que finalmente vemos a vingança do RISC, e onde o fato de o núcleo M1 Firestorm ter uma arquitetura ARM RISC começa a importar.
Veja, uma instrução x86 pode ter de 1 a 15 bytes de comprimento. As instruções RISC têm comprimento fixo. Cada instrução ARM tem 4 bytes de comprimento. Por que isso é relevante neste caso?
Porque dividir um fluxo de bytes em instruções para alimentar oito decodificadores diferentes em paralelo torna-se trivial se todas as instruções tiverem o mesmo comprimento.
No entanto, em uma CPU x86, os decodificadores não têm ideia de onde a próxima instrução começa. Ele precisa realmente analisar cada instrução para ver quão longa ela é.
A forma como a Intel e a AMD lidam com isso é simplesmente tentando decodificar instruções em todos os pontos de partida possíveis. Isso significa que os chips x86 têm que lidar com muitas suposições e erros que devem ser descartados. Isso cria um estágio de decodificador tão complexo que é realmente difícil adicionar mais decodificadores. Mas para a Apple, é trivial em comparação continuar adicionando mais.
De fato, adicionar mais causa tantos outros problemas que quatro decodificadores de acordo com a própria AMD é basicamente um limite superior para eles.
Isso é o que permite que os núcleos M1 Firestorm processem essencialmente duas vezes mais instruções que CPUs AMD e Intel na mesma frequência de clock.
Pode-se argumentar como contraponto que as instruções CISC se transformam em mais micro-ops. Por exemplo, se cada instrução x86 se transformasse em 2 micro-ops enquanto cada instrução ARM se transformasse em 1 micro-op, então quatro decodificadores x86 produziriam o mesmo número de micro-ops por ciclo de clock que uma CPU ARM com 8 decodificadores.
Exceto que este não é o caso no mundo real. O código x86 altamente otimizado raramente usa instruções CISC complexas, o que se traduziria em muitas micro-ops. Na verdade, a maioria só se traduzirá em 1 micro-op.
No entanto, todas essas instruções simples do x86 não ajudam a Intel ou a AMD. Porque mesmo que essas instruções de 15 bytes sejam raras, os decodificadores precisam ser feitos para lidar com elas. Isso gera uma complexidade que impede a AMD e a Intel de adicionar mais decodificadores.
Mas os núcleos da AMDs Zen3 e do I9 12900k ainda são mais rápidos, certo?
Nos benchmarks de desempenho, os mais novos núcleos de CPU AMD, os chamados Zen3, e do Intel 12900K são um pouco mais rápidos que os núcleos Firestorm. Mas aqui está o pulo do gato: isso só acontece porque os núcleos da AMD e da Intel têm clock de 5 GHz ou mais. Os núcleos do Firestorm têm clock de 3,2 GHz. A Intel e AMD estão apenas superando o Firestorm por muito pouco, apesar de ter uma frequência de clock quase 60% maior.
Então, por que a Apple não aumenta a frequência do clock também? Porque uma frequência de clock mais alta faz com que os chips gastem mais energia e funcionem mais quentes. Esse é um dos principais pontos de venda da Apple. Seus computadores – ao contrário das ofertas da Intel e AMD – quase não precisam de refrigeração.
Em essência, pode-se dizer que os núcleos Firestorm são realmente superiores aos núcleos da Intel e da AMD, que só conseguem permanecer no jogo drenando muito mais corrente e ficando muito mais quente. Algo que a Apple simplesmente escolhe não fazer.
Se a Apple quiser maior desempenho, eles simplesmente adicionarão mais núcleos. Isso permite que eles mantenham o uso de watts baixo e ofereçam mais desempenho.
O futuro
Parece que a AMD e a Intel se colocaram em um canto em duas frentes:
- Eles não têm um modelo de negócios que facilite a busca de computação heterogênea e designs de SoC.
- Seu conjunto de instruções CISC x86 herdado está voltando para assombrá-los, dificultando a melhoria do desempenho OoO.
Contra-ataques x86
Não significa fim de jogo. Eles podem aumentar a frequência do clock e usar mais resfriamento, adicionar mais núcleos, reforçar os caches da CPU, etc. A maneira mais óbvia de combater a vantagem do decodificador RISC é o uso de caches micro-op. Esta é uma estratégia específica para superar a complexidade de decodificação de instruções de comprimento variável em processadores CISC. Antes de decodificar uma nova instrução, a CPU pode verificar se a mesma instrução já foi decodificada. A maioria dos programas tende a repetir muito certas instruções (loops), o que significa que isso funciona muito bem. Assim, enquanto você estiver correndo em loops apertados, eles podem desfazer a vantagem do M1.
Portanto, ainda não terminou o jogo, mas também demonstra que a AMD e a Intel precisam criar muito mais truques inteligentes para combater os problemas produzidos artificialmente por sua arquitetura de conjunto de instruções (ISA).
Portanto, está longe do fim do jogo, mas a Intel e a AMD estão jogando o jogo da CPU com uma deficiência. Eles podem ficar à frente investindo mais dinheiro nos problemas e produzindo em volumes maiores. Mas o quão eficaz isso será a longo prazo continua uma incógnita, eles enfrentam a Apple, que tem mais lucro do que qualquer outra empresa no mundo e uma enorme pilha de dinheiro para queimar.
Comentários
Postar um comentário