Voce pode explicar como os computadores funcionam de baixo para cima?
Para entender computadores, voce primeiro precisa aceitar uma realidade fisica. Nao existe magia dentro de um computador. Apenas sinais eletricos. Mais precisamente, apenas alta tensao e baixa tensao.
O material base para os chips que usamos hoje e o silicio. O silicio e um semicondutor. Semicondutores tem uma propriedade fisica: dopando-os com diferentes elementos e controlando a tensao no eletrodo, e possivel controlar se eles conduzem eletricidade ou nao. Essa estrutura minúscula que pode ser ligada e desligada pela eletricidade e chamada de transistor.
CPUs modernas contem dezenas de bilhoes de transitores. O processo atual de 3 nanometros da TSMC significa que esses transitores sao fabricados tao incrivelmente pequenos que dezenas de bilhoes cabem em um pedaco de silicio do tamanho de uma unha.
Voce so precisa lembrar de uma funcao central do transitor. Se voce aplicar uma alta tensao ao seu terminal de controle, ele conduz. Se voce aplicar uma baixa tensao, ele desliga. Essa e a realidade fisica fundamental. Definimos alta tensao como 1 logico e baixa tensao como 0 logico. Toda a ciencia da computacao e construida sobre esses dois estados.
Com transistores, podemos combina-los em portas logicas.
Suponha que conectemos dois transitores em serie. A corrente so pode fluir de uma extremidade a outra – gerando uma saida 1 – quando ambos os terminais de controle recebem alta tensao, ou seja, ambas as entradas sao 1. Se alguma for 0, a corrente e cortada e a saida e 0. Esse circuito fisico e chamado de porta AND.
Pela mesma logica, se dois transitores sao conectados em paralelo, a corrente flui – gerando uma saida 1 – desde que pelo menos uma entrada seja 1. So quando ambas sao 0 e que a saida e 0. Isso e uma porta OR.
Usando um metodo de conexao ligeiramente diferente, onde inserir 1 gera saida 0 e inserir 0 gera saida 1, criamos uma porta NOT.
Com as portas AND, OR e NOT, o mundo fisico entra oficialmente no mundo matematico. Recomendo fortemente um livro classico aqui chamado Code, de Charles Petzold. Este livro nao tem enrolacao – comeca pelo telegrafo e explica como conectar portas logisticas. E perfeito para construir essa primeira camada de intuicao fisica. Voce deveria dar uma olhada depois de ler este post – vai explodir sua mente.
Agora que temos portas logisticas, como fazemos um computador somar?
Em binario, 1 mais 1 e igual a 10. Isso significa que o bit atual se torna 0 e carregamos 1 para a proxima posicao. Isso sao na verdade duas operacoes logisticas. Primeiro, determinar o bit atual: se ambas as entradas sao 1, o bit atual e 0. Se uma entrada e 1 e a outra e 0, o bit atual e 1. Essa logica pode ser implementada combinando as portas basicas que discutimos – a chamamos de porta XOR. Segundo, determinar o carry: apenas quando ambas as entradas sao 1 e que carregamos, que e exatamente o que a porta AND faz.
Conecte uma porta XOR e uma porta AND juntas, e voce implementou fisicamente a adicao de um unico digito binario. Isso e chamado de meio-somador. Coloque varios meios-somadores em cascata, tratando o sinal de carry, e voce obtem um somador completo. Se voce conectar 64 desses somadores completos, voce obtem um circuito fisico que pode somar numeros binarios de 64 bits.
Quando voce escreve a linha de codigo a = b + c, o que acontece no nivel mais baixo e que os sinais eletricos representando b e c entram simultaneamente neste circuito somador feito de dezenas de milhares de transitores. Apos um atraso fisico extremamente curto, a outra extremidade do circuito produz tensoes altas e baixas estaveis representando o resultado.
Isso e o que se conhece como Unidade Logica e Aritmetica. Nao e nenhum componente misterioso – e apenas uma densa malha de portas logisticas semicondutoras, com fiacao rigida de acordo com regras matematicas projetadas por humanos. Alem da adicao, atraves de diferentes configuracoes de fiacao, ela tambem pode realizar subtracao, deslocamentos de bits e ate mesmo multiplicacao.
Mas ser capaz apenas de somar nao adianta nada. O resultado e apenas um monte de sinais eletricos – assim que a energia e cortada ou a entrada muda, o resultado desaparece. Um computador deve ser capaz de lembrar dados. Isso nos leva a memoria e aos registradores.
Como usar sinais eletricos para lembrar um estado? Engenheiros eletronicos inventaram um circuito extremamente engenhoso chamado flip-flop. E um circuito de porta logica com um laco de realimentacao. Simplificando, o sinal de saida e realimentado para a entrada. Esse design faz com que mesmo apos a remocao da entrada original, o circuito possa manter seu estado atual de alta ou baixa tensao usando realimentacao interna.
Quando voce da a este flip-flop um sinal de escrita especifico, ele atualiza seu estado interno e o trava. A menos que voce envie outro sinal de escrita, ele mantera esse 0 ou 1 indefinidamente.
Arranje 64 flip-flops em uma fileira, e voce pode armazenar um numero binario de 64 bits. Dentro da CPU, bem ao lado da ULA, essas unidades de armazenamento ultrarrrapidas feitas de flip-flops sao chamadas de registradores. Sua localizacao fisica e bem ao lado do circuito de computacao, o que significa que o sinal eletrico percorre a menor distancia possivel, entao eles sao extremamente rapidos. Claro, eles tambem sao extremamente caros de fabricar, entao so podem ser muito pequenos.
Aqui eu tenho que recomendar energicamente um livro absolutamente lendario: Computer Systems: A Programmer’s Perspective, mais conhecido no mundo da computacao como CSAPP. E o livro-texto usado na Universidade Carnegie Mellon. O que o torna incrivel e que ele faz a ponte da linguagem assembly para a arquitetura de hardware e sistemas operacionais. Depois de entende-lo, voce sabera porque alguns codigos rodam rapido e outros devagar – porque voce comecara a escrever codigo com uma mentalidade de nivel fisico.
Se voce quiser ir alem e interligar sistematicamente sistemas operacionais, organizacao de computadores, redes e outros fundamentos essenciais de uma so vez, montei uma colecao cobrindo estruturas de dados e algoritmos, organizacao de computadores e mais.
Mais de 1 milhao de downloads em toda a web – fundamentos de computacao que vao impulsionar suas habilidades.
Vamos continuar para fora. E se os registradores nao forem suficientes? Precisamos de armazenamento maior. E aqui que entram os pentes de RAM conectados a sua placa-mae. O nome tecnico e Memoria de Acesso Aleatorio Dinamica, ou DRAM.
O principio fisico da DRAM e completamente diferente dos registradores. Em vez de flip-flops, ela usa minúsculos capacitores para armazenar carga eletrica. Um capacitor com carga e 1, sem carga e 0. Como a estrutura do capacitor e extremamente simples – precisando apenas de um transistor e um capacitor para armazenar um bit de dados – a capacidade pode ser muito grande. Hoje em dia, dezenas ou mesmo centenas de gigabytes sao comuns.
Mas os capacitores tem uma falha fatal: eles perdem carga. Se deixados sozinhos, a carga representando 1 vaza completamente em milissegundos, tornando-se 0. Portanto, a placa-mae deve ter um circuito de controle dedicado que leia os dados da memoria e os recarregue em intervalos extremamente curtos. Isso e chamado de refresh dinamico. E por isso que quando voce desconecta seu computador, tudo na memoria desaparece instantaneamente.
Agora temos uma ULA que pode fazer matematica, e registradores e memoria que podem armazenar dados. A pergunta central e: como essas coisas inanimadas comecam a se mover? Quem as comanda a fazer primeiro adicao, depois multiplicacao, e finalmente armazenar o resultado?
Esse e o trabalho da unidade de controle, e e o mecanismo central que faz um computador ser uma maquina.
A placa-mae tem um oscilador de cristal – um cristal de quartzo que gera um sinal de pulso de frequencia fixa enquanto estiver alimentado. Por exemplo, se sua CPU e classificada em 4.0 GHz, significa que esse cristal gera 4 bilhoes de transicoes de alta para baixa tensao a cada segundo.
Essa e a batida do coracao do computador. Todas as portas logicas e flip-flops dentro da CPU operam em sincronizacao estrita com essa batida.
Dentro da CPU, ha um registrador muito especial chamado contador de programa. Ele contem apenas um endereco de memoria.
Quando a primeira batida soa, a CPU faz a primeira coisa: buscar a instrucao. Ela envia o endereco armazenado no contador de programa para a memoria atraves das trilhas metalicas na placa-mae. A memoria envia de volta a longa sequencia de 0s e 1s armazenada naquele endereco.
Essa longa sequencia de 0s e 1s e a instrucao. Quando a instrucao retorna a CPU, ela entra na unidade de controle. A unidade de controle tambem e apenas um monte de portas logicas com fia cao rigida – seu trabalho e decodificar. Por exemplo, quando ela ve que os primeiros digitos dos 0s e 1s que chegam sao 1011, sua estrutura de fia cao interna determina que essas altas e baixas tensoes ativam exatamente o interruptor que leva ao circuito de soma na ULA. Ao mesmo tempo, o resto da instrucao especifica quais registradores contem os dois valores de dados a serem somados.
Quando a proxima batida soa, a fase de execucao comeca. O circuito de soma ativado recebe os dados, os sinais eletricos atravessam a rede de portas logicas do somador em um instante, e o resultado e produzido.
Na proxima batida, o resultado e escrito de volta no registrador especificado.
Finalmente, o contador de programa incrementa automaticamente em um, apontando para a proxima instrucao na memoria. Entao o ciclo se repete. Bilhoes de vezes por segundo.
Esta e a verdade completa do nivel mais baixo de como um computador funciona. Nao ha inteligencia avancada alguma – apenas um oscilador de cristal que bate cegamente, um contador de programa que incrementa enderecos mecanicamente, uma unidade de controle que comuta roboticamente caminhos de sinal com base nos 0s e 1s que le, e uma ULA que converte passivamente niveis de tensao de entrada em novos niveis de tensao.
O codigo Python ou Java que voce escreve no seu trabalho diario e finalmente traduzido por um software chamado compilador em uma longa e tediosa sequencia de instrucoes de maquina especificas para a arquitetura da CPU – puros 0s e 1s.
Neste ponto, voce na verdade completou toda a cadeia da areia (silicio) ao programa. Muitas pessoas sentem que entendem neste estagio, mas no ambiente industrial real de hoje, apenas entender principios tradicionais de CPU nem chega ao nivel de aprovacao.
Dado o topico mais quente atual dos grandes modelos de IA, tenho que expandir seus horizontes. Vamos ver como e realmente a paisagem do poder computacional hoje.
Qualquer equipe trabalhando com grandes modelos hoje, seja para treinamento ou inferencia, absolutamente nao pode usar CPUs para computar. Por que?
Porque as CPUs foram projetadas para lidar com controle logico complexo. Olhe uma CPU: uma grande parte de sua area e dedicada a previsao de ramos, gerenciamento de cache e unidade de controle. A porcao realmente usada para computacao numerica pura – a ULA – nao e tao grande. E como se a CPU fosse um intelectual altamente educado que se destaca em processos de gestao complexos. Peça para ele calcular 1+1, ele consegue, e ele pode ate analisar se ha algum erro – mas ele so pode lidar com alguns de cada vez.
A essencia matematica no cerne dos grandes modelos e a multiplicacao de matrizes em escala extremamente grande. Por exemplo, multiplicar duas matrizes de varios milhares por varios milhares. Isso requer centenas de milhoes de operacoes de multiplicacao e adicao. A logica e extremamente simples – multiplicar-somar, multiplicar-somar – sem nenhuma ramificacao complexa, mas o volume de dados e estarrecedor.
Se voce usasse uma CPU tradicional para calcular isso, ela poderia certamente executar bilhoes de instrucoes por segundo, mas diante de centenas de bilhoes de parametros, seria uma gota no oceano.
Para realmente entender o que os grandes modelos estao calculando, se sua intuicao matematica ainda se baseia em formulas decoradas, recomendo fortemente que voce confira “Essence of Linear Algebra” do 3Blue1Brown. Para facilitar a revisao e deducao, voce pode combina-lo com este conjunto compilado de notas do 3Blue1Brown em chines e ingles. Ele consegue uma visualizacao intuitiva genuina da multiplicacao de matrizes avancada e transformacoes lineares. Depois de assistir, voce tera uma imagem mental real a nivel fisico de operacoes de multiplicacao-acumulacao em milhares e milhares de parametros.
Notas de Algebra Linear do 3Blue1Brown: Possivelmente a melhor compilacao chines-ingles na web
A natureza desse computo matricial massivo deu origem a GPU, a Unidade de Processamento Grafico – que agora deveria ser chamada de Unidade de Computacao Paralela de Proposito Geral.
A filosofia de design de uma GPU e completamente oposta a de uma CPU. Ela elimina a maior parte dos circuitos de controle complexos e grandes caches, preenchendo cada espaco fisico liberado com as ULAs mais simples possiveis. Um chip NVIDIA H100 atual contem dezenas de milhares de nucleos de computacao. Embora cada nucleo possa operar em uma frequencia mais baixa que um nucleo de CPU e tenha logica de controle fraca, todos podem trabalhar simultaneamente.
Pense em uma GPU como uma formacao de 100.000 alunos do ensino fundamental que so sabem aritmetica. Voce da a eles uma ordem extremamente simples: multiplique o numero a sua esquerda pelo numero a sua direita. Todos os 100.000 alunos calculam o resultado simultaneamente no mesmo ciclo de clock. Para as operacoes matriciais massivamente paralelas requeridas por grandes modelos, uma GPU e centenas a milhares de vezes mais eficiente que uma CPU.
Na verdade, IA – assim como o somador da CPU – nao e tao misteriosa assim. Ainda e apenas camada apos camada de logica e matrizes. Se voce quer construir sua compreensao de aprendizado profundo do zero, recomendo um livro que muitos no Twitter elogiaram por desmistificar completamente a IA: Deep Learning with Python. Depois de entender os calculos tensoriais na propagacao direta e reversa, voce percebera que tambem nao ha magica dentro dos grandes modelos.
Depois de ler este livro, fui completamente desmistificado sobre IA!
De volta ao hardware. Quando fazemos otimizacao de algoritmos de baixo nivel, a maior parte do nosso esforco vai para lutar com a largura de banda da VRAM. E tambem onde muitos programadores avancados tropecam.
Porque a ULA computa muito rapido. Como mencionado anteriormente, os modulos de memoria armazenam dados carregando e descarregando capacitores, e eles estam a uma certa distancia fisica da CPU ou GPU – sinais eletricos levam tempo para viajar pela placa-mae. O maior desafio enfrentado pelos chips de IA hoje e o que a academia chama de gargalo de von Neumann.
Isto e: milhares de nucleos de computacao terminam de processar os dados em suas maos em um instante, e entao so podem ficar ociosos, esperando que novos dados sejam trazidos da memoria lenta. Mesmo se voce tornar os circuitos de computacao no chip mais rapidos, se voce nao conseguir alimentar os dados rapidamente o suficiente, o poder computacional e desperdicado.
Para resolver esse problema, engenheiros de hardware foram levados ao extremo. Ja que os modulos de memoria comuns sao muito distantes e lentos, por que nao encapsular a memoria e o chip GPU diretamente no mesmo substrato? Para aumentar a largura do canal para transmissao de dados, em vez de usar fios tradicionais, eles usam uma tecnologia chamada interposers de silicio – perfurando milhares de vias condutoras microscopicas dentro do silicio para conectar diretamente a memoria e os nucleos de computacao. Isso e o que foi hypado aos ceus como Memoria de Alta Largura de Banda, ou HBM.
Se esta parte te excita profundamente e voce quer garantir um salario alto insubstituivel como arquiteto ou desenvolvedor de baixo nivel na proxima era da IA, recomendo fortemente que voce enfrente Computer Architecture: A Quantitative Approach. Este livro foi escrito por dois vencedores do Premio Turing, e quase todo engenheiro de hardware no Vale do Silicio tem um exemplar. Ele usa quantidades massivas de dados reais e formulas para te dizer porque os chips devem ser projetados com arquiteturas de cache especificas e exatamente onde estao os gargalos no paralelismo multicore. Embora seja incrivelmente arido de ler, e alguns capitulos sejam muito dificeis, e o caminho necessario para superar a lacuna cognitiva na compreensao de baixo nivel.
Voltando a sua pergunta original. Por que voce ainda se sente confuso depois de aprender todos esses termos? Porque o ensino tradicional corta a conexao vital entre entidades fisicas e abstracoes logicas.
Quando voce trata a CPU como uma caixa preta magica, esses termos parecem definicoes incompreensiveis. Mas se voce seguir as leis da fisica para cima:
- Porque altas e baixas tensoes podem formar portas logicas, obtivemos unidades aritmeticas que podem fazer matematica.
- Porque circuitos de realimentacao podem travar estados de tensao, obtivemos registradores que podem armazenar dados.
- Porque precisavamos controlar ritmicamente o fluxo de sinais eletricos, obtivemos osciladores de cristal e unidades de controle.
- Porque este sistema e complexo demais para humanos inserirem niveis de tensao diretamente, inventamos conjuntos de instrucoes, empacotando 0s e 1s em linguagem assembly, e finalmente em C e Python.
Como profissional que passou pela trincheira nesta industria, posso te dizer com muita responsabilidade: nesta era, frameworks frontend vao e vem, arquiteturas backend de microsservicos tem seu momento por alguns anos, e ate mesmo arquiteturas de grandes modelos de IA estao iterando a uma velocidade vertiginosa. Muitas tecnicas de desenvolvimento de aplicacoes de alto nivel que voce aprende hoje podem estar obsoletas no ano que vem. Na verdade, grandes modelos ja podem fazer muitas tarefas basicas de codificacao melhor que o programador medio.
Mas a unica coisa que nunca muda e este conjunto de principios fundamentais de funcionamento de computadores enraizados na fisica dos semicondutores. Nao importa como o software seja abstraido, nao importa o quao sofisticados os algoritmos se tornem, tudo se resume no final a flutuacoes de tensao em um pedaco de silicio. Quanto mais avancada a otimizacao de desempenho, quanto mais de ponta o escalonamento de computacao, mais os engenheiros precisam da capacidade de ver atraves de todas as camadas de abstracao de software e perceber diretamente o estado operacional do hardware subjacente.
Nao pense que esse conhecimento de baixo nivel esta distante de voce. Quando voce encontrar um pedaco de codigo extremamente faminto por desempenho, e porque voce entende o mecanismo das linhas de cache no nivel mais baixo, voce ajusta a disposicao dos arrays na memoria para melhorar drasticamente as taxas de acerto de cache da CPU – fazendo o codigo rodar dez vezes mais rapido – naquele momento, voce sentira a imensa sensacao de controle que vem de dominar os principios subjacentes.