O que é a arquitetura CISC? Veja sua importância para os PCs
Por Daniel Trefilio • Editado por Jones Oliveira |
A sigla CISC, ou Complex Instruction Set Computer, se refere a um padrão de arquitetura de processadores nos quais as instruções são mais complexas, geralmente combinando múltiplas operações menores em um mesmo comando. Seu maior benefício é permitir que, graças a componentes extras e especializados associados ao processador, a programação de softwares de alto nível seja bem mais simples.
- O que é a arquitetura RISC? Veja sua importância para as CPUs
- Quais as diferenças entre processadores x86 e ARM?
Nos primeiros computadores, a programação era realizada em Assembly, uma linguagem com alta correspondência com o nível de máquina, na qual cada instrução corresponde diretamente a uma operação isolada de hardware. Na prática, o processo simples de realizar uma soma de 1 + 1, por exemplo, seria composto de diversas instruções:
- carregar o dado A no registrador 0
- carregar o dado B no registrador 1
- somar o dado do registrador 0 com o do registrador 1
- carregar o resultado da operação no registrador 2
- postar o dado do registrador 2
Pietro Colloca, Engenheiro da Intel, conversou com o Canaltech para ajudar a esclarecer detalhes importantes da arquitetura CISC, em comparação com as linguagens de máquina e também com a RISC.
“Tanto RISC quanto CISC são chamados de ISA, ou Instruction Set Architecture, é basicamente um padrão desenhado para definir como o computador vai funcionar. O CISC, quebrando o nome, significa Complex Instrucion Set Computer, e a intenção dele, por mais que tenha ‘complexo’ no nome, é simplificar a vida do programador”, explica Pietro Colloca, Engenheiro Especialista em IA e IoT da Intel.
O que é a arquitetura CISC?
O processo complexo e compartimentado implica em uma programação de softwares extremamente lenta e difícil. Para otimizar a tarefa, os arquitetos de hardware do início dos anos de 1960 investiram em criar processadores capazes de operar com conjuntos de instruções (ISA), que nada mais são que associações de vários comandos em assembly em uma mesma instrução.
Em 1964, a IBM lançou o System/360, um dos primeiros designs de processadores com arquitetura CISC, justamente para facilitar a programação e permitir que os próprios computadores também pudessem executar tarefas mais complexas. Para isso, foi necessário tornar o próprio hardware mais complexo, adicionando componentes especializados e evoluindo o projeto dos compiladores, permitindo que eles convertam as instruções avançadas em linguagem de máquina.
Princípios da arquitetura CISC
Com isso, múltiplas etapas do código são agrupadas em instruções maiores executadas em níveis mais elevados de hardware, como controladores, aceleradores ou outros componentes integrados no chip do CPU. Mesmo em RISC, os passos são mais simples e relativamente próximos do assembly, consistindo em, pelo menos, 5 etapas independentes (Busca, Decodificação, Execução, Acesso, Escrita).
Vale reforçar que as instruções vão além de operações aritméticas básicas, também incluindo movimentação de dados, operações lógicas, como condições e negações, e controle de fluxo de informações, como endereçamento e chamadas de dados.
Conjunto complexo de instruções
Já em CISC todos os passos da operação matemática de soma podem se limitar simplesmente a “somar 1 e 1”, com as etapas subsequentes da soma já pré-programadas em cada acelerador. Ao executar um comando, uma unidade de controle decodifica a instrução “soma” em linguagem de máquina — ou microcódigos —, interpreta todas as etapas pré-programadas para aquela função, bem como a ordem de execução, recodifica e envia as instruções para o caminho de dados.
Em um exemplo bem simplório, a arquitetura CISC seria o equivalente a programar um macro complexo de teclado para um MMO. Em vez de clicar individualmente em consumir uma poção, acionar uma habilidade de aumento de força, outra de aumento de velocidade e realizar o ataque para abrir o combate, basta criar uma linha de comando que executa todas essas tarefas em uma ordem específica e definir uma tecla.
Instruções de tamanhos variáveis
Por permitir maior complexidade de operações em um mesmo comando, as instruções em CISC também podem ter tamanhos variáveis. Retomando a operação de soma, por ser extremamente simples, ela acaba sendo semelhante em CISC e RISC, mas poderíamos, por exemplo, criar uma instrução com condições:
- Registrador 0 = A, Registrador 1 = B
- Se R0 for igual a R1, somar A e B
- Se R0 for menor que R1, somar 1
- Se R0 for maior que R1, encerrar
Neste exemplo — que não representa funções reais de programação —, temos várias operações complexas descritas, como comparar os dados de dois registradores, e realizar diferentes operações dependendo do dado retornado da comparação. Dependendo do projeto de uma CPU RISC e quão reduzidas precisarem ser as instruções para seu hardware, as etapas de comparação, primeira operação condicional e segunda operação condicional precisarão ser descritas em comandos distintos.
Em CISC, as operações hipotéticas de comparação, por exemplo, podem ser associadas a uma mesma função de soma, desde que existam aceleradores pré-programados no conjunto para executar essa instrução complexa. Com isso, é possível escrever um código final mais simples, mas com instruções internas mais longas que vão executar toda a função, sem que o programador precise descrever cada etapa.
Naturalmente, por contarem com tantas etapas interdependentes realizadas por uma mesma instrução complexa, os tempos de execução irão variar, dependendo do tipo, tamanho e complexidade da instrução.
Manipulação direta de operandos
Um dos elementos da arquitetura CISC que possibilita as instruções mais complexas é também uma de suas limitações. Segundo Pietro, tanto RISC quanto CISC têm a capacidade de manipular diretamente operandos, com algumas diferenças de como isso é realizado em cada arquitetura.
"As operações que são feitas diretamente no CISC demoram mais ciclos de clock porque serão escritas de maneira mais simplificada, mas executadas de maneira mais complexa."
Para conseguir operar todos os elementos de uma cadeia complexa de instruções, é necessário que todos os dados sejam armazenados na memória do sistema. Dessa forma, é possível manipular diretamente todos os operandos (elementos) da instrução sem a necessidade de ir e voltar aos registradores.
Uma vez que a busca ou carregamento das informações em registradores foi realizada, ela é armazenada na memória, a função é executada na própria memória, e apenas o resultado é retornado e escrito no registrador designado.
Baixa dependência de registros (endereçamento direto)
Outro ponto importante é que, como as operações serão realizadas todas no nível de memória, o endereço na memória precisa ser o mesmo endereço efetivo dos registradores. Isso possibilita dimensionar a quantidade máxima de registradores que precisam compor o design da CPU, uma vez que não serão necessários registradores para dados transitórios de tarefas em execução, apenas os efetivos para o limite de operandos.
Em contrapartida, essa abordagem exige um volume bem maior de memória para ser efetiva. Além disso, a velocidade de operação de dados em memória é bem inferior que as operações executadas diretamente nos registradores, impactando o desempenho do sistema.
Grande conjunto de instruções
Uma vantagem bastante significativa da arquitetura CISC é que, como mencionado, os conjuntos de instruções são programados em aceleradores dedicados, como o MMX ou AVX2, e não diretamente no microcódigo da CPU. Sendo assim, cada acelerador implementado garante que os processadores x86 atuais, por exemplo, serão capazes de executar as mesmas instruções do primeiro Pentium MMX.
Tanto por isso a arquitetura x86 tende a ser mais amigável para trabalhar em retrocompatibilidade com aplicações e hardwares legado. Como todas as instruções necessárias já estão embarcadas, bastam algumas adequações de código a nível de software, como uma eventual emulação de sistemas operacionais mais antigos.
"[A Intel] trouxe a arquitetura x86 em 1978, com o 8086, e conforme a gente foi avançando, a gente foi colocando coisa, como os nossos aceleradores: o MMX, o SSE, o AVX2 e por aí vai. Isso é justamente para simplificar as operações matemáticas [no nível do hardware]. A gente utiliza dos aceleradores para facilitar a escrita e execução dos códigos."
Por serem projetados para acomodar naturalmente menos instruções, conjuntos antigos ou que não fazem sentido para um CPU RISC, simplesmente não são implementadas. Por essa razão, processadores RISC não costumam ser compatíveis com programas de modelos diferentes ou anteriores.
"[Nos CPUs Intel] são duas arquiteturas x86 diferentes, a Golden Cove e a Gracemont são focadas em propósitos diferentes, enquanto o P-Core vai ter habilidades como hyperthreading, o E-Core é voltado para ter uma eficiência maior. [Comparando os big.LITTLE ARM e x86] o conceito pode ser parecido, mas na hora de montar não é a mesma coisa. "
Produtos que usam processadores CISC
Após o System/360 da IBM, uma série de fabricantes de semicondutores passaram deixar de lado CPUs programáveis exclusivamente em assembly e projetar chips baseados em CISC. Criar hardwares tecnicamente mais complexos, mas mais simples de programar, foi uma troca que acelerou o avanço da computação muito rapidamente, pois viabilizou criar mais softwares em menos tempo e para aplicações mais variadas.
Intel (x86)
Naturalmente, os produtos em CISC mais conhecidos são os processadores Intel, desde os primeiros 8080, passando para os 8086, servindo de base para a arquitetura x86 que praticamente domina o mercado doméstico de PCs até hoje.
Atualmente, com a arquitetura de núcleos híbridos, a Intel passou a adotar abordagens similares das utilizadas em RISC, trazendo núcleos de eficiência para instruções mais simples, e os núcleos de desempenho para instruções complexas. Essencialmente, ainda se trata de uma CPU x86, mas muito mais versátil do que o que era possível até os Intel Core de 11ª geração.
AMD (x64)
Os processadores AMD também utilizam arquitetura CISC, e a companhia é a única entre as fabricantes de CPUs que ainda faz frente à Intel no setor de processadores domésticos. A nomenclatura x64 em vez de x86 vem do fato de a AMD ter adotado conjuntos de instruções de 64-bit antes da Intel em seus processadores.
Por muito tempo a arquitetura x86 foi sinônimo de ISA em 32-bit, e com a chegada dos processadores AMD de 64-bit em 2003, a empresa adotou o novo código para se diferenciar da concorrência. Apenas em 2004 a Intel introduziu conjuntos de 64-bit a suas CPUs, se valendo da versatilidade inerente da arquitetura CISC, algo que em RISC exigiria uma reformulação completa de design.
Motorola 68000
Por muitos anos a Motorola atuou também como fabricante de processadores, em sua maioria utilizando arquitetura RISC. Em 1979, a empresa desenvolveu o Motorola 68000, ou m68k, em CISC, mas herdando muitas das características de eficiência e ISA dos designs anteriores.
Atualmente, evoluções do m68k continuam a ser desenvolvidas, contudo apenas para alguns sistemas embarcados, principalmente no segmento de automação e telecomunicação.
VAX
As CPUS da Digital Equipment Corporation introduziram os conjuntos de instruções VAX (Virtual Address eXtension), combinando elementos da arquitetura CISC, como o acesso ao endereçamento virtual de memória, a designs para códigos em assembly. Na prática, os VAX são considerados projetos em CISC pelo padrão de operação e caminho de dados de seu chip, mas seus conjuntos de instruções são bem mais próximos da linguagem de máquina.
Vantagens e Desvantagens da arquitetura CISC
Originalmente, os processadores CISC foram desenvolvidos para facilitar a programação de aplicações de alto nível, transformando instruções básicas, como carregar registradores, em etapas incorporadas a comandos simplificados. No entanto, simplificar processos em uma ponta implica em criar hardwares mais complexos, entre outras questões.
Vantagens
- Facilidade de implementação de novos comandos: com a maioria das etapas básicas de acesso e controle de dados está pré-programada nos microcontroladores, criar novos tipos de comandos não exige a reformulação da estrutura profunda dos conjuntos de instruções.
- Compiladores mais simples: considerando que a maior parte do código de baixo nível é processada nos microcontroladores e aceleradores, os compiladores em CISC acabam sendo mais simples, pois sua carga de trabalho é reduzida em comparação com máquinas RISC ou em Assembly.
- Versatilidade de tarefas: simplificar a programação em alto nível e facilitar a criação de códigos sem modificar a estrutura das instruções também possibilitam que CPUs CISC executem tarefas muito mais diversificadas e complexas.
- Retrocompatibilidade: Conforme novos aceleradores são embarcados a cada geração, mais instruções são adicionadas sem perder a compatibilidade com conjuntos anteriores. Com isso, PCs modernos conseguem rodar aplicações antigas e de máquinas legado com certa facilidade.
Desvantagens
- Mais transistores: reduzir o volume de códigos de alto nível em favor de microcontroladores e aceleradores dedicados para gerenciar comandos complexos implica em sempre aumentar o número de transistores nos CPUs.
- Maior consumo: naturalmente, com o volume sempre crescente de transistores e de componentes embarcados, o consumo energético também aumenta a cada geração. Além disso, as instruções mais complexas quase sempre exigem mais ciclos computacionais para serem executadas, reduzindo a eficiência energética.
- Menor eficiência térmica: o maior consumo de energia também resulta em maior produção de calor, exigindo soluções de arrefecimento extremamente robustas para evitar danos por superaquecimento.
- Mais caros: o hardware muito mais complexo e com milhares de aceleradores dedicados encarece consideravelmente o processo de fabricação dos chips, influenciando inclusive no índice de aproveitamento dos wafers de silício.
Em condições reais de uso, optar por designs em CISC ou RISC sempre irá implicar em trocas, priorizando um ou outro elemento de cada arquitetura conforme a aplicação do produto. Tanto por isso, praticamente todos os processadores modernos são, de alguma forma, híbridos, utilizando conceitos dos dois padrões.
Enquanto a Apple trabalha com seus processadores M1, M2 e os novos M3 utilizando essencialmente arquitetura RISC, seus projetos também incluem instruções complexas e outros elementos CISC. Já a Intel, desde os Alder Lake optou por uma abordagem híbrida, adotando núcleos de desempenho com hyperthread e execuções complexas, associados a núcleos de eficiência voltados justamente para as instruções de baixo nível.
Fonte: Cloud Computing: Theory and Practice 3ª Edição, Dan Cristian Marinescu; Educative.io; Engineersgarage.com; Spiceworks; Universidade de Stanford; Medium; Universidade do Tennessee; AHIRLABS; IBM