Ir para o conteúdo principal

Arquiteturas Avançadas: RISC, Flynn e o Paralelismo Moderno

Autor
Francisco Bustamante
Um químico trabalhando com Ciência de Dados e Programação em Python.
Tabela de conteúdos
Por Dentro do Computador - Este artigo faz parte de uma série de artigos.
Parte 12: Esse Artigo

Chegamos ao último artigo da série Por Dentro do Computador. Ao longo dos onze artigos anteriores, construímos uma compreensão completa de como um computador funciona por dentro: da hierarquia de memória à cache, dos componentes da CPU ao ciclo de instrução, do pipeline aos barramentos, da representação de dados à execução de programas, e da entrada e saída que conecta tudo ao mundo externo.

Este artigo fecha o ciclo com as grandes questões arquiteturais: por que os princípios RISC venceram no projeto interno de muitos processadores modernos, por que o CISC continua relevante na interface de arquiteturas como x86, como classificar arquiteturas paralelas com a taxonomia de Flynn, e quais são os caminhos modernos para multiplicar o desempenho além dos limites de um único núcleo.

RISC: a filosofia da simplicidade
#

Na década de 1970, os computadores eram dominados por arquiteturas CISC (Complex Instruction Set Computer) — processadores com centenas de instruções complexas, cada uma podendo realizar múltiplas operações em uma única chamada. A ideia era que instruções poderosas tornariam os programas mais curtos e os compiladores mais simples.

Três projetos independentes questionaram essa premissa:

Projeto Instituição Arquitetura resultante
John Cocke IBM (1975) IBM 801
John Hennessy Stanford (1981) MIPS
David Patterson UC Berkeley (1982) SPARC / RISC-I

A conclusão comum era empírica: análise de compiladores reais mostrou que apenas uma fração das instruções CISC era efetivamente utilizada. A maior parte do tempo de execução envolvia operações simples (movimentação de dados, aritmética inteira básica, desvios). Instruções complexas raramente valiam o custo de implementação em hardware. Seria mais eficiente ter poucas instruções simples, executadas em um ciclo, do que muitas instruções complexas, executadas em vários ciclos.

Nascia o RISC — Reduced Instruction Set Computer.

As sete características do RISC
#

  1. Conjunto reduzido de instruções — poucas dezenas a ~100 instruções; cada uma simples e regular.
  2. Formato fixo — todas as instruções têm o mesmo tamanho (32 bits no MIPS, 32 bits no ARM clássico). Isso simplifica enormemente o estágio de decodificação do pipeline.
  3. Arquitetura Load/Storeapenas LOAD e STORE acessam a memória principal; todas as demais instruções operam exclusivamente sobre registradores.
  4. Grande banco de registradores — 32 ou mais registradores de propósito geral (vs. 8–16 no x86).
  5. Baixo CPI nas instruções simples — a maioria das instruções é projetada para execução rápida, idealmente com CPI (ciclos por instrução) próximo de 1, favorecendo alto throughput no pipeline.
  6. Pipeline altamente eficiente — o formato fixo permite decodificação paralela e estágios uniformes.
  7. Compiladores mais complexos — a responsabilidade de otimizar código migra do hardware para o compilador; o hardware fica mais simples.
Sobre números e características do RISC

As características acima descrevem o perfil clássico das arquiteturas RISC. Em processadores reais, há variações importantes entre famílias e gerações. O ponto central não é um número exato de instruções ou um CPI rigidamente igual a 1, mas a busca por simplicidade, regularidade e eficiência de pipeline.

RISC × CISC: a comparação completa
#

Comparação clássica, não dogma absoluto

A tabela a seguir resume diferenças históricas e didáticas entre RISC e CISC. Em processadores modernos, várias dessas fronteiras ficaram menos rígidas: arquiteturas CISC usam execução interna altamente regular, e arquiteturas RISC modernas também incorporam extensões complexas quando necessário.

Característica RISC CISC
Número de instruções Pequeno (~50–150) Grande (200–500+)
Formato das instruções Fixo (ex.: 32 bits no MIPS) Variável (ex.: 1–15 bytes no x86)
Acesso à memória Só via LOAD / STORE Qualquer instrução pode acessar a MP
Banco de registradores Muitos (32+) Poucos (8–16)
Ciclos por instrução (CPI) ~1 1–10+
Pipeline Simples e eficiente Complexo
Unidade de Controle Cabeada (hardwired) Microprogramada (em geral)
Compiladores Mais complexos Mais simples
Consumo de energia Menor Maior
Exemplos reais MIPS, SPARC, ARM, RISC-V Intel x86, AMD64, Motorola 68000
O x86 é CISC por fora, RISC por dentro

Os processadores Intel e AMD modernos são CISC externamente — mantêm compatibilidade com décadas de código legado. Mas internamente, decompõem instruções CISC em micro-operações RISC (µops) antes de executá-las. Isso combina a compatibilidade do CISC com a eficiência do RISC — e é por isso que processadores x86 modernos são tão rápidos mesmo com um ISA que data dos anos 1970.

Arquiteturas RISC reais
#

  • ARM (Advanced RISC Machines): domina smartphones e sistemas embarcados, e também ganhou muito espaço em notebooks, desktops e cloud. A linha Apple Silicon é um exemplo marcante do uso de ARM em computadores pessoais.
  • MIPS: amplamente usado em roteadores, consoles (PlayStation 1/2) e como base para o ensino de arquitetura de computadores.
  • SPARC: usado em servidores Sun/Oracle. Implementa register windows — técnica que acelera chamadas de função sem salvar registradores na memória.
  • RISC-V: arquitetura RISC aberta e livre de royalties. Cresceu fortemente em pesquisa, ensino, sistemas embarcados e vem avançando de forma acelerada também em aplicações comerciais.
  • Intel x86 / AMD64: CISC clássico que domina desktops e servidores. Instruções de tamanho variável (1 a 15 bytes). Internamente usa µops RISC.
Exemplo — RISC × CISC: cinco aspectos comparados
Aspecto RISC CISC
Quantidade de instruções Pequena (~100), formato fixo Grande (200–300+), formatos variáveis
Circuitos da UCP Mais simples: decodificador menor, sem microprogramação Mais complexos: decodificador grande, microprograma em ROM
Uso de pipeline Muito eficiente: tamanho fixo facilita estágios uniformes; idealmente 1 instrução/ciclo Menos eficiente: tamanho variável complica o pipeline
Tamanho do programa Mais linhas de assembly (operações simples exigem mais instruções) Menos linhas de assembly (cada instrução faz mais)
Acessos à MP Apenas LOAD e STORE Qualquer instrução pode acessar a MP

O paradoxo do tamanho de código RISC/CISC merece atenção: CISC produz programas assembly mais curtos (menos instruções), mas cada instrução ocupa mais bits no código objeto (formato variável, campos extensos). RISC gera mais instruções, mas cada uma ocupa exatamente 32 bits. Dependendo da comparação (assembly vs. binário), cada lado pode parecer mais compacto — sem que haja contradição.

Métricas de desempenho
#

Comparar processadores exige cuidado — a métrica errada pode levar a conclusões enganosas.

MIPS — Millions of Instructions Per Second
#

$$ MIPS = \frac{f_{\text{clock}}}{CPI \times 10^6} $$

onde \(f_{\text{clock}}\) é a frequência em Hz e \(CPI\) (Cycles Per Instruction) é o número médio de ciclos por instrução.

Exemplo — Calculando MIPS sem comparar ISAs diferentes

Considere duas CPUs hipotéticas que implementam o mesmo ISA:

  • CPU A: \(f_{\text{clock}} = 2{,}0\,\text{GHz}\), \(CPI = 2\)
  • CPU B: \(f_{\text{clock}} = 1{,}5\,\text{GHz}\), \(CPI = 1\)

Para a CPU A:

$$ MIPS_A = \frac{2{,}0 \times 10^9}{2 \times 10^6} = 1000\,\text{MIPS} $$

Para a CPU B:

$$ MIPS_B = \frac{1{,}5 \times 10^9}{1 \times 10^6} = 1500\,\text{MIPS} $$

Mesmo com frequência menor, a CPU B entrega mais instruções por segundo porque seu CPI médio é menor.

Limitação do MIPS: ele pode ser útil dentro de um mesmo contexto de comparação, mas não é uma métrica confiável para comparar arquiteturas diferentes, porque instruções distintas podem realizar quantidades muito diferentes de trabalho.

MFLOPS e SPECmark
#

  • MFLOPS (Millions of Floating Point Operations Per Second): usado para cálculo científico, simulações, álgebra linear, deep learning. Conta operações de ponto flutuante, não instruções.
$$MFLOPS = \frac{\text{Nº de operações de ponto flutuante}}{T_{\text{execução}} \times 10^6}$$
  • SPECmark (Standard Performance Evaluation Corporation): benchmark padronizado e independente que executa um conjunto representativo de programas reais e compara com um sistema de referência. Supera as limitações do MIPS ao usar cargas de trabalho reais.

A taxonomia de Flynn
#

Durante décadas, a indústria entregou mais desempenho de duas formas: aumentando a frequência do relógio (megahertz para gigahertz) e otimizando o pipeline de um único núcleo. No entanto, essas abordagens bateram em um muro físico: o limite térmico. Como não é mais viável acelerar o clock de um único chip sem que ele derreta, a solução foi multiplicar o hardware.

Para entender e classificar as diversas formas de paralelismo, costuma-se usar a taxonomia de Flynn, proposta em 1966 por Michael Flynn. Ela continua sendo uma referência útil para classificar grande parte das arquiteturas paralelas, com base em dois eixos: o fluxo de instruções e o fluxo de dados.

%%{init: {'flowchart': {'useMaxWidth': false}}}%%
graph TD
    Flynn["Taxonomia de Flynn
(Classificação de Arquiteturas Paralelas)"] Flynn --> SISD["SISD
Single Instruction, Single Data
─────────────────
1 instrução, 1 dado por ciclo
Von Neumann clássico
Ex.: PC de 1 núcleo"] Flynn --> SIMD["SIMD
Single Instruction, Multiple Data
─────────────────
1 instrução → N dados simultâneos
Processamento vetorial / GPU
Ex.: Intel SSE/AVX, CUDA"] Flynn --> MISD["MISD
Multiple Instruction, Single Data
─────────────────
N instruções → 1 dado
Categoria rara e controversa
Ex.: poucos casos práticos convincentes"] Flynn --> MIMD["MIMD
Multiple Instruction, Multiple Data
─────────────────
N instruções + N dados
Paralelismo real e geral
Ex.: SMP, clusters, multicore"]
Tipo Instrução Dados Descrição Exemplos reais
SISD Único Único Von Neumann tradicional PC com 1 núcleo
SIMD Único Múltiplos Processamento vetorial Intel SSE/AVX, GPUs NVIDIA, ARM NEON
MISD Múltiplos Único Categoria rara e controversa Poucos exemplos práticos consensuais
MIMD Múltiplos Múltiplos Paralelismo completo SMP, clusters, processadores multicore
Exemplo — Classificando arquiteturas reais segundo Flynn
  • PC convencional com 1 núcleo: SISD — um fluxo de instruções opera sobre um fluxo de dados.
  • Instruções SSE/AVX do Intel: SIMD — uma instrução VADDPS soma 16 pares de floats simultaneamente.
  • GPU NVIDIA com CUDA: costuma ser descrita como SIMD/SIMT — muitos elementos executam a mesma ideia de operação sobre dados distintos, embora a organização prática use threads e grupos de execução próprios da GPU.
  • Processador Intel Core i7 (multicore): MIMD — cada núcleo executa instruções independentes com dados diferentes; os núcleos podem estar executando programas completamente distintos.
  • Cluster de servidores: MIMD — cada nó executa seu próprio programa com seus próprios dados, comunicando-se por passagem de mensagens (MPI).

SMP: múltiplos processadores, uma memória
#

O SMP (Symmetric Multi-Processing) conecta vários processadores idênticos à mesma memória principal e ao mesmo sistema de E/S, gerenciados por um único sistema operacional:

+----+   +----+   +----+   +----+
|CPU1|   |CPU2|   |CPU3|   |CPU4|   <- Processadores idênticos
+-+--+   +-+--+   +-+--+   +-+--+
  |        |        |        |
  +--------+--------+--------+
               |
         Barramento compartilhado
               |
      +--------+-----------+
      |                    |
   +--+--+              +--+--+
   | RAM |              | E/S |
   +-----+              +-----+

Vantagens: múltiplas CPUs trabalhando em paralelo; falha de uma CPU não paralisa o sistema; crescimento incremental (adicionar CPUs conforme a demanda).

Problema crítico — Coerência de cache: cada CPU tem seus próprios caches (L1, L2). Se CPU1 modifica o valor de uma variável no seu cache, CPU2 pode estar lendo um valor desatualizado do seu cache. Protocolos de coerência como o MESI (Modified, Exclusive, Shared, Invalid) resolvem isso em hardware.

Gargalo de escalabilidade do SMP

O barramento compartilhado — ou, de forma mais geral, a interconexão e a memória compartilhada — é o principal gargalo do SMP. À medida que o número de CPUs cresce, a contenção por acesso também cresce. Na prática, existe um limite de escalabilidade além do qual arquiteturas como NUMA ou clusters se tornam mais adequadas.

Clusters: memória distribuída, escala ilimitada
#

Um cluster é um grupo de computadores independentes (nós) conectados por uma rede de alta velocidade (Ethernet, InfiniBand), trabalhando de forma coordenada como um único sistema. Cada nó tem sua própria memória; a comunicação entre nós é feita por passagem de mensagens (MPI — Message Passing Interface).

Característica SMP Cluster
Modelo de memória Compartilhada Distribuída
Sistema Operacional Único para todos Um por nó
Comunicação Barramento / MP Rede (Ethernet, InfiniBand)
Escalabilidade Limitada (~32–64 CPUs) Alta (até milhares de nós)
Custo por processador Alto (hardware especial) Menor (hardware padrão)
Coerência de cache Problema real (protocolo MESI) Não se aplica
Latência de comunicação Nanosegundos Microssegundos a milissegundos
Exemplo — SMP ou cluster?

Dois cenários práticos:

Cenário A — serviço que precisa escalar ao longo dos anos: Cluster — permite adicionar novos nós conforme a demanda cresce (escalabilidade horizontal). Basta conectar mais máquinas à rede. SMP tem escalabilidade limitada pelo gargalo do barramento compartilhado.

Cenário B — espaço físico muito limitado com demanda estável: SMP — um único servidor ocupa menos espaço físico e é gerenciado por um único sistema operacional. Não há necessidade de infraestrutura de rede adicional. Ideal quando não há previsão de crescimento.

NUMA: o meio-termo
#

O NUMA (Non-Uniform Memory Access) é uma arquitetura intermediária entre SMP e clusters:

  • A memória é fisicamente distribuída entre os nós — cada processador tem RAM local.
  • Logicamente, todo o espaço de endereçamento é unificado — qualquer CPU pode endereçar qualquer posição de memória.
  • Acesso à RAM local: rápido.
  • Acesso à RAM remota (de outro nó): mais lento — atravessa a interconexão entre nós.

Usado em servidores modernos de alto desempenho, o CC-NUMA combina memória fisicamente distribuída com um espaço de endereçamento logicamente unificado, preservando a coerência de cache por hardware.

Computação vetorial: SIMD em ação
#

A computação vetorial aplica a mesma operação repetidamente sobre grandes conjuntos de dados — arrays científicos, simulações, álgebra linear, redes neurais.

Dois caminhos de implementação:

Método Descrição Exemplos
Pipeline de UAL UAL organizada em estágios de pipeline; elementos processados sequencialmente com sobreposição Cray-1 (1976)
UALs Paralelas Múltiplas UALs idênticas processam vários elementos simultaneamente (SIMD) Intel SSE/AVX, GPUs CUDA

A evolução histórica:

  • Cray-1 (1976): primeiro supercomputador vetorial comercial de sucesso; 160 MFLOPS — impressionante para a época.
  • Intel SSE / AVX: extensões SIMD do x86. AVX-512 processa 16 floats de 32 bits (ou 8 doubles de 64 bits) em uma única instrução.
  • NVIDIA GPU: dezenas de milhares de núcleos CUDA operando em SIMD massivo — arquitetura SIMT (Single Instruction Multiple Threads).

Tendências modernas: multicore e many-core
#

Multicore
#

Vários núcleos de processamento completos integrados em um mesmo processador. Cada núcleo costuma ter caches L1 e L2 privados, enquanto níveis mais altos de cache podem ser compartilhados, dependendo da microarquitetura.

CPU 0          CPU 1          CPU 2          CPU 3
+------------+ +------------+ +------------+ +------------+
| L1-I  L1-D | | L1-I  L1-D | | L1-I  L1-D | | L1-I  L1-D |  (privado)
|    L2      | |    L2      | |    L2      | |    L2      |  (privado)
+-----+------+ +-----+------+ +-----+------+ +-----+------+
      |              |              |              |
      +--------------+--------------+--------------+
                              |
                     +--------+--------+
                     |    L3 (LLC)     |  (compartilhado)
                     +--------+--------+
                              |
                       Memória Principal

Exemplos: processadores Intel Core e AMD Ryzen em desktops e notebooks, além da linha Apple Silicon em Macs. Classificação: MIMD.

Many-core
#

Arquiteturas many-core reúnem dezenas, centenas ou milhares de unidades de execução simples no mesmo chip, otimizadas para paralelismo massivo.

Exemplos típicos são as GPUs modernas da NVIDIA e AMD. Em vez de focar em poucas unidades muito complexas, essas arquiteturas priorizam alta vazão para cargas massivamente paralelas. Classificação aproximada: SIMD / SIMT.

Atualizando exemplos de hardware

Exemplos concretos de mercado mudam rapidamente. Para manter o artigo menos datado, prefira citar famílias de produtos (Ryzen, Core, Apple Silicon, GPUs GeForce/RTX, GPUs Radeon) em vez de um único modelo específico, salvo quando o objetivo for ilustrar um dado técnico muito particular.

Onde cada arquitetura se encaixa
#

Arquitetura Taxonomia de Flynn
PC com 1 núcleo SISD
Instruções SSE/AVX SIMD
GPU (CUDA/OpenCL) SIMD / SIMT
Processador multicore MIMD
SMP MIMD
Cluster / supercomputador MIMD

Conclusão
#

Chegamos ao fim da série. Partimos de uma célula de memória — um arranjo mínimo de armazenamento — e chegamos a processadores com múltiplos níveis de cache, pipelines, DMA, barramentos hierárquicos e arquiteturas paralelas em vários níveis. Cada artigo revelou uma camada diferente da mesma máquina que responde a um comando seu em frações de segundo.

O computador que você usa é uma obra de engenharia com sessenta anos de refinamento contínuo. Agora você sabe o que há por dentro.

Fique atento para as próximas séries de artigos do site. Até a próxima!

Por Dentro do Computador - Este artigo faz parte de uma série de artigos.
Parte 12: Esse Artigo

Relacionados