Por que o chip M1 da Apple é tão rápido?
(erik-engheim.medium.com)- O M1 não é uma única CPU, e sim um sistema inteiro com vários chips dentro de um grande pacote de silício. A CPU é apenas um deles
→ Um SoC (System on a Chip) que reúne CPU, GPU, memória, controlador de I/O etc.
- Em vez de colocar muitos núcleos genéricos, ele inclui chips especializados para tarefas específicas
→ CPU: executa o sistema operacional e os apps
→ GPU: realiza tarefas gráficas. UI dos apps, jogos 2D/3D etc.
→ ISP (Image Processing Unit): aumenta a velocidade do processamento de imagem
→ DSP (Digital Signal Processor): executa funções mais intensivas em matemática do que a CPU, como descompressão de arquivos de áudio
→ NPU (Neural Processing Unit): acelera machine learning, reconhecimento de voz, processamento de câmera etc.
→ Video Encoder/Decoder: processa arquivos/formatos de vídeo com baixo consumo de energia
→ Secure Enclave - criptografia, autenticação, segurança
→ UMA (Unified Memory Architecture): permite que CPU, GPU e outros núcleos troquem informações rapidamente
É por isso que esses chips têm desempenho excelente em edição de imagem/vídeo e em grandes codificações de vídeo
- O que há de especial na Unified Memory Architecture (UMA)?
→ Os chips anteriores que integravam CPU/GPU eram lentos
Os dois usavam áreas de memória diferentes, de maneiras diferentes.
Além disso, como a GPU esquenta muito, placas enormes com grandes ventoinhas de refrigeração é que mostravam alto desempenho
Mas isso exigia a cópia de muitos dados entre os dois, então era necessário um barramento como PCIe
→ A Unified Memory não aloca memória separadamente para CPU/GPU; elas simplesmente compartilham a mesma
Diferente de Shared Memory, CPU e GPU podem acessá-la ao mesmo tempo e, como basta trocar a informação de localização, não é necessário copiar os dados
- Se essa abordagem de SoC é tão boa, por que outros fabricantes não fazem o mesmo?
→ Eles fazem. A AMD começou a criar APUs com CPU/GPU no mesmo die de silício
→ Mas é difícil fazer isso na prática. Porque um SoC coloca o computador inteiro em um único chip, então combina mais com fabricantes de computadores como HP ou Dell
→ O modelo de negócios da Intel e da AMD é baseado em CPUs genéricas que as pessoas encaixam em placas-mãe de PC,
e o novo mercado de SoC não consiste em pegar produtos físicos de fornecedores diferentes e montar tudo, mas sim em montar IP (Intellectual Property)
→ Será que Intel, AMD e Nvidia conseguiriam licenciar IP para Dell ou HP?
→ Claro, Intel e AMD podem vender SoCs prontos, mas pode haver conflito de interesses entre fabricante de CPU, fabricante de PC e a Microsoft (por exemplo, o que deve ser incluído)
→ Mas para a Apple isso é simples. Ela faz tudo sozinha. "They control the whole widget"
- O desafio mais fundamental para tornar uma CPU rápida
→ O Firestorm, o núcleo de CPU de uso geral rápido do M1, é realmente muito rápido. Essa é a diferença em relação aos ARM anteriores, que eram mais lentos do que AMD/Intel tradicionais
→ O Firestorm supera a maioria dos núcleos Intel/AMD Ryzen em velocidade, algo que pelo senso comum não deveria acontecer.
→ Qual é a estratégia para fazer uma CPU rápida?
-
Executar instruções sequenciais mais rapidamente
-
Executar várias instruções em paralelo
Nos anos 80 isso era fácil. Bastava aumentar a frequência de clock para executar instruções mais rápido.
O computador faz algo a cada ciclo de clock, e esse "algo" é muito pequeno, então uma única instrução pode precisar de vários ciclos de clock
Mas, nos tempos modernos, há limites para aumentar a frequência de clock.
"O fim da Lei de Moore"
Por isso, hoje o importante é executar o máximo possível de instruções em paralelo
- Multi-core ou processadores Out-of-Order?
→ Há duas abordagens para execução paralela
- Colocar mais núcleos de CPU (do ponto de vista do desenvolvedor, adicionar mais threads)
Em teoria, os núcleos do processador podem executar várias threads (threads de software)
Isso funciona alternando entre threads, então é usado em situações em que se está esperando algo de I/O ou da rede
Threads de hardware aumentam a velocidade, mas o desenvolvedor precisa escrever código para aproveitá-las.
Esse modelo é adequado para servidores/cloud.
É por isso que empresas como a Ampere fabricam CPUs ARM para cloud como o Altra Max, com 128 núcleos.
A Apple é exatamente o oposto. A Apple é uma empresa que faz dispositivos para um único usuário
A maioria dos softwares desktop não é feita para aproveitar muitos núcleos.
Jogos podem ganhar desempenho em 8 núcleos, mas 128 núcleos seriam apenas desperdício.
Por isso, o que se precisa é de menos núcleos, porém mais poderosos
- Execução fora de ordem (Out-of-Order Execution, OoO) executa mais instruções em paralelo sem exigir uso explícito como no multithreading
Do ponto de vista do desenvolvedor, parece apenas que cada núcleo funciona mais rápido
Buscar dados em um local específico da memória é lento
Mas tanto faz buscar 1 byte ou 128 bytes: não há diferença no delay
Os dados se movem pelo barramento de dados, e se esse barramento for largo, é possível ler vários bytes ao mesmo tempo
Ao executar, a CPU processa vários blocos de instruções de uma vez, embora essas instruções tenham sido escritas para execução sequencial
Os microprocessadores modernos executam Out-of-Order.
Ou seja, analisam várias instruções para descobrir se há dependências entre elas.
01: mul r1, r2, r3 // r1 ← r2 × r3
02: add r4, r1, 5 // r4 ← r1 + 5
03: add r6, r2, 1 // r6 ← r2 + 1
Nas instruções acima, 1 e 2 têm dependência, mas a 3 não tem relação nenhuma com as anteriores.
Nesse caso, processadores Out-of-Order podem executar em paralelo a instrução 3, que não tem dependência.
Na prática, a CPU consegue identificar dependências não entre uma ou duas, mas entre centenas de instruções.
A CPU conecta as instruções em um grafo de nós, analisa isso e consegue identificar quais instruções podem ser executadas em paralelo e em quais pontos é preciso esperar resultados antes de continuar.
O motivo de o núcleo Firestorm do M1 entregar velocidade impressionante é que ele faz uma execução Out-of-Order extremamente boa.
Parece ser melhor do que qualquer outro no mercado mainstream, incluindo Intel/AMD.
- Então por que a execução Out-of-Order da AMD e da Intel é mais lenta que a do M1?
→ O que foi descrito acima, na prática, é chamado de ROB (Reorder Buffer), e não são instruções comuns de código de máquina (as que a CPU busca na memória para executar)
Essas instruções fazem parte da CPU Instruction Set Architecture (ISA), ou seja, aquilo que chamamos de x86, ARM, PowerPC etc.
→ Internamente, a CPU executa um conjunto totalmente diferente de instruções, invisível para o programador, chamado micro-operations (microinstruções, micro-ops ou μops), e o ROB é preenchido com essas micro-ops
→ Dá para pensar nas instruções ARM/x86 como uma API pública, e nas micro-ops como uma API privada.
→ CISC tem instruções grandes e complexas, então precisa necessariamente usar micro-ops, mas RISC pode escolher usar ou não.
(Por exemplo, CPUs ARM pequenas podem não usar micro-ops. Isso não significa que não consigam fazer OoO)
→ Por que isso importa? Porque "a velocidade depende de quão rápido e de quanto o ROB pode ser preenchido"
→ Quanto mais rápido ele for preenchido, mais oportunidades haverá para executar instruções em paralelo, melhorando o desempenho
→ O código de máquina é dividido em micro-ops por decodificadores.
→ Núcleos Intel/AMD têm 4 decodificadores,
enquanto a Apple tem 8 decodificadores 'insanos', e um ROB 3 vezes maior, então consegue armazenar basicamente 3 vezes mais instruções
- Então por que Intel e AMD não colocam mais decodificadores de instruções?
→ É aqui que começa o contra-ataque do RISC. O importante é que o núcleo Firestorm do M1 usa ARM RISC.
→ As instruções x86 têm de 1 a 15 bytes, enquanto no RISC elas têm tamanho fixo
→ Se todas as instruções tiverem o mesmo tamanho, basta cortá-las e distribuí-las para 8 decodificadores diferentes
→ Mas, no x86, não se sabe onde a próxima instrução começa, então não há alternativa a não ser analisar cada instrução de fato
→ O método brute-force usado por Intel e AMD para lidar com isso é decodificar em todos os possíveis pontos de início de instrução
Ou seja, precisam descartar continuamente palpites errados e erros.
Por isso é difícil adicionar mais decodificadores, enquanto para a Apple isso é muito mais fácil
→ Isso basicamente permite processar o dobro de instruções, na mesma frequência de clock, em comparação com CPUs AMD/Intel
→ Na prática, o x86 raramente usa instruções CISC complexas e costuma usar instruções curtas, quase como RISC, mas ainda assim precisa lidar com aquelas instruções de 15 bytes, então a complexidade continua existindo.
- Mas o núcleo Zen3 da AMD ainda é mais rápido, não é?
→ Em benchmarks, o Zen3 é mais rápido que o Firestorm, mas o Zen3 roda a 5Ghz e o Firestorm a 3.2Ghz
→ A Apple não aumenta mais a frequência de clock porque isso faz o chip esquentar.
→ Basicamente, o núcleo Firestorm é superior ao Zen3
→ O Zen3 pode consumir mais energia e gerar mais calor para ser usado em jogos, mas "a Apple decidiu não seguir por esse caminho"
→ Se a Apple quiser desempenho maior, ela adicionará mais núcleos. Assim, poderá obter mais desempenho com menos energia
- Futuro
→ AMD/Intel se colocaram contra a parede em dois pontos
-
Não têm um modelo de negócios que impulsione computação heterogênea e design de SoC
-
As instruções x86 CISC complexas viraram legado e dificultam melhorar o desempenho de OoO
→ Claro, não é game over. Dá para aumentar mais o clock, melhorar a refrigeração, usar mais núcleos...
→ A Intel está em situação pior. Já perde para o Firestorm em velocidade de núcleo e ainda tem uma GPU fraca no SoC.
→ Muitos núcleos são naturalmente bons para servidores, mas Amazon e Ampere estão pressionando com 128 núcleos. Intel/AMD precisam lutar nos dois lados
→ Felizmente, ao contrário de AMD/Intel, a Apple não vende seus chips no mercado
→ Talvez não seja imediato, mas os usuários de PC irão migrar lentamente para a Apple, e a Apple ganhará uma fatia maior do mercado de PCs
17 comentários
Você escreve muito bem mesmo.
Muito obrigado por organizar isso de um jeito tão fácil de entender. Sensacional!
Obrigado pelo ótimo conteúdo.
Muito obrigado!!
Eu queria comprar um dispositivo com M1, mas pelo visto eu é que deveria ter comprado ações..
Obrigado pelo ótimo texto!
Eu também voto que as ações da Apple têm um alto valor futuro.
Acho que um dia o Apple Car realmente vai acabar saindo.
O
weak memory modelestá se tornando cada vez mais importante.. A Apple agora está realmente se tornando uma empresa fechada com capacidade de fazer tudo, do chip à montagem, hardware, SO e apps (como o Jobs sonhava).Eu também estou pensando no M1 Mac mini ou no MacBook Air como meu próximo dispositivo..
Eu também estou saindo de um MacBook Pro 2015 para um M1... dizem que chega no fim do ano ou no começo do ano que vem!
Hoje fui conferir e já foi lançado no mercado nacional!
Uau! Guru, você é realmente o melhor!!
Obrigado ;)
Nesse texto também tem uma comparação entre RISC e CISC escrita pelo autor, e recomendo demais. Ele explica de forma bem fluida algo como: por que essa estrutura de instruções acabou surgindo?
Acho que, no geral, ele escreve muito bem. Este texto também é bem longo, mas flui muito bem na leitura.
Uau, ótimo conteúdo, obrigado.
Obrigado!
Parece até que estou assistindo de novo a uma aula de arquitetura de computadores haha
No fim, a Apple tem uma estrutura em que não há outra saída senão continuar ficando cada vez melhor naquilo que ela já faz de melhor
E a Intel e a AMD, o que fazem agora..
No episódio 16 do podcast do GeekNews que saiu hoje, apresentei rapidamente o truque de Memory-Order do chip M1, mas este texto entra em detalhes de um jeito diferente.
Acho que vamos acabar falando disso de novo no podcast da semana que vem ^^;