A dúvida clássica
"Se uma CPU topo de linha tem dezenas de núcleos a mais de 5 GHz, por que ela passa vergonha rodando IA perto de uma GPU intermediária?" É a pergunta de todo mundo que começa a olhar hardware para inteligência artificial, e a resposta não está na força bruta de cada núcleo. Está na arquitetura matemática para a qual cada chip foi desenhado.
CPUs: os mestres da lógica sequencial
Uma CPU moderna foi projetada para lidar com qualquer tipo de tarefa. Ela tem poucos núcleos, 8, 16, 32, mas cada um carrega instruções complexas, predição de desvio pesada, execução fora de ordem e caches ultrarrápidos de vários níveis. A maior parte do silício de um núcleo de CPU não é unidade de cálculo. É maquinário para descobrir o que calcular a seguir sem parar: prever o próximo salto, reordenar instruções, esconder a latência da memória.
É como uma equipe de cirurgiões: resolve problemas lógicos e condicionais, um passo de cada vez, com máxima precisão. O problema é que um modelo de linguagem não precisa de lógica ramificada. Precisa de bilhões de multiplicações simples, idênticas, ao mesmo tempo. Todo aquele maquinário de predição fica ocioso, porque não há nada para prever: a próxima operação é sempre a mesma.
Núcleos CUDA: paralelismo em massa
Enquanto a CPU tem dezenas de núcleos, uma GPU carrega milhares. Uma RTX 3060 tem 3.584; uma placa de datacenter passa de 16 mil. Cada um deles é muito mais simples do que um núcleo de CPU: sem predição elaborada, sem execução fora de ordem, com pouco cache. Em vez de poucos cirurgiões, um exército de operários fazendo contas básicas idênticas em sincronia. O modelo de execução se chama SIMT, single instruction, multiple threads: uma instrução, aplicada por grupos de 32 threads de uma vez, sobre dados diferentes.
Esse paralelismo já deixa a CPU para trás por ordens de grandeza em qualquer coisa que seja "faça a mesma conta em um milhão de elementos", que é a definição de renderizar pixels e de multiplicar matrizes.
Tensor Cores: o motor de multiplicação de matrizes
O salto definitivo para IA veio com os Tensor Cores. Eles não são núcleos de propósito geral. São blocos de silício dedicados a uma única operação: a multiplicação e acumulação de matrizes, GEMM, em formatos de baixa precisão, FP16, BF16, INT8, FP8.
A diferença é de granularidade. Um núcleo comum multiplica pares de números, e precisa de vários ciclos para percorrer um bloco de matriz. Um Tensor Core recebe uma matriz 4×4 (ou maior, nas gerações recentes), multiplica por outra e acumula o resultado numa terceira, em uma instrução de hardware, a fused multiply-add. É aceleração por hardware nativo feita sob medida para a matemática dos Transformers, em que praticamente tudo, atenção, projeções, feed-forward, é multiplicação de matrizes.
| Unidade | Quantidade típica | Desenhada para | Em IA |
|---|---|---|---|
| Núcleo de CPU | 8 a 64 | Lógica condicional, latência baixa, qualquer carga | Orquestração, tokenização, pré e pós-processamento |
| Núcleo CUDA | Milhares | Mesma operação em muitos dados | Operações elemento a elemento, normalizações, softmax |
| Tensor Core | Centenas | Multiplicar e acumular matrizes em baixa precisão | O grosso do cálculo: atenção e camadas densas |
Por que a CPU simplesmente não acompanha
Mesmo quando a CPU usa instruções vetoriais, AVX-512 ou as extensões de matriz AMX das gerações mais recentes, ela esbarra em dois limites que não se contornam com clock:
Densidade de silício para cálculo matricial
Uma GPU dedica ordens de magnitude mais circuitos exclusivamente a empilhar matrizes. A CPU gasta a maior parte da área em cache e em controle, porque é isso que a torna boa no que ela é boa. Não dá para ter as duas coisas na mesma área de chip.
A barreira da alimentação de dados
De nada adianta calcular rápido se a memória não entrega os dados a tempo. Em decode, cada token exige ler todos os pesos do modelo. A VRAM de uma GPU dedicada entrega centenas de gigabytes por segundo (360 numa RTX 3060) até alguns terabytes por segundo nas placas de datacenter. A RAM de um sistema desktop com dois canais de DDR5 fica entre 60 e 90. Mesmo que a CPU calculasse na velocidade da GPU, ela ficaria parada esperando a RAM na maior parte do tempo. Um modelo de 8 GB em RAM a 80 GB/s dá um teto de 10 tokens por segundo, por mais núcleos que se tenha.
Pense em intensidade aritmética: quantas operações você faz por byte que lê. Um chip é limitado por computação quando a intensidade é alta e por memória quando é baixa. O decode de um LLM tem intensidade baixíssima, uma operação por peso lido, e por isso a banda de memória decide antes do clock. A CPU perde nas duas frentes, mas perde primeiro na memória. É por isso que uma GPU "intermediária" com GDDR6 ganha de uma CPU "topo de linha" com DDR5: não é o motor, é a estrada.
Quando a CPU ainda faz sentido
Rodar IA em CPU é tentar cavar um túnel com bisturis de alta precisão. Funciona em emergências, e vale ser honesto sobre quais são:
- Ambiente de teste e integração contínua. Um modelo pequeno, quantizado, rodando em CPU responde devagar mas responde, e isso basta para validar que o pipeline funciona antes de ocupar uma GPU.
- Um usuário, modelo pequeno, sem pressa. Um modelo de 3 a 8 bilhões em INT4 numa CPU boa gera algo entre 5 e 15 tokens por segundo. Para uso pessoal, é tolerável. Para um time, não.
- Embeddings e classificadores pequenos. Modelos de centenas de milhões de parâmetros, em lote, rodam aceitavelmente em CPU e nem sempre justificam uma GPU.
- Pré e pós-processamento. Tokenização, parsing, orquestração de agentes, chamada de ferramentas. Isso é lógica condicional, e é exatamente para o que a CPU foi feita. Num servidor de inferência, a CPU não é inútil; ela só não é o lugar da multiplicação de matrizes.
Fora dessas situações, nada substitui o maquinário pesado feito especificamente para essa rocha. E, como discuto em outro texto sobre a hierarquia de largura de banda, a pior configuração de todas é a intermediária: um modelo que quase cabe na GPU e transborda um pouco para a RAM. Aí você paga o preço da CPU sem ter escolhido a CPU.
Resumo da conversa
- CPU: poucos núcleos complexos, otimizados para lógica condicional e latência. LLM não tem lógica condicional, tem multiplicação de matrizes.
- Núcleos CUDA: milhares de unidades simples executando a mesma instrução. Tensor Cores: blocos dedicados que multiplicam e acumulam matrizes inteiras numa instrução.
- A CPU perde em densidade de cálculo matricial e, antes disso, em alimentação de dados: DDR5 a 60–90 GB/s contra GDDR6 a 360 e HBM a milhares.
- Intensidade aritmética baixa do decode faz a banda de memória decidir antes do clock.
- CPU serve para teste, para um usuário sem pressa, para modelos pequenos e para tudo o que cerca a inferência. Não para servir um time.
Igor Nascimento