Computador de conjunto de instruções complexo

format_list_bulleted Contenido keyboard_arrow_down
ImprimirCitar
Processador com instruções capazes de operações multi-passo

Um computador de conjunto de instruções complexo (CISC) é uma arquitetura de computador na qual instruções únicas podem executar várias operações de baixo nível (como uma carga da memória, uma operação aritmética operação e um armazenamento de memória) ou são capazes de operações de várias etapas ou modos de endereçamento em instruções únicas. O termo foi cunhado retroativamente em contraste com o computador com conjunto reduzido de instruções (RISC) e, portanto, tornou-se uma espécie de termo genérico para tudo o que não é RISC, onde a característica típica de diferenciação é que a maioria dos projetos RISC usa comprimento de instrução uniforme para quase todas as instruções, e empregar instruções de carga e armazenamento estritamente separadas.

Exemplos de arquiteturas CISC incluem computadores mainframe complexos para microcontroladores simplistas onde a carga de memória e as operações de armazenamento não são separadas das instruções aritméticas. As arquiteturas de conjunto de instruções específicas que foram rotuladas retroativamente como CISC são System/360 até z/Architecture, as arquiteturas PDP-11 e VAX e muitas outras. Microprocessadores e microcontroladores bem conhecidos que também foram rotulados como CISC em muitas publicações acadêmicas incluem as famílias Motorola 6800, 6809 e 68000; a família Intel 8080, iAPX432 e x86; as famílias Zilog Z80, Z8 e Z8000; a linha National Semiconductor 32016 e NS320xx; a família MOS Technology 6502; a família Intel 8051; e outros.

Alguns designs foram considerados casos limítrofes por alguns escritores. Por exemplo, o Microchip Technology PIC foi rotulado como RISC em alguns círculos e CISC em outros. O 6502 e o 6809 foram descritos como semelhantes ao RISC, embora tenham modos de endereçamento complexos, bem como instruções aritméticas que operam na memória, ao contrário dos princípios do RISC.

Incentivos e benefícios

Antes da filosofia RISC se tornar proeminente, muitos arquitetos de computador tentaram preencher a chamada lacuna semântica, ou seja, projetar conjuntos de instruções que suportam diretamente construções de programação de alto nível, como chamadas de procedimento, controle de loop e modos de endereçamento complexos, permitindo que a estrutura de dados e os acessos ao array sejam combinados em instruções únicas. As instruções também são normalmente altamente codificadas para aumentar ainda mais a densidade do código. A natureza compacta de tais conjuntos de instruções resulta em tamanhos de programa menores e menos acessos à memória principal (que geralmente eram lentos), o que na época (início da década de 1960 em diante) resultou em uma enorme economia no custo da memória do computador e armazenamento em disco, como bem como uma execução mais rápida. Também significou boa produtividade de programação mesmo em linguagem assembly, pois linguagens de alto nível como Fortran ou Algol nem sempre estavam disponíveis ou apropriadas. De fato, os microprocessadores dessa categoria às vezes ainda são programados em linguagem assembly para certos tipos de aplicativos críticos.

Novas instruções

Na década de 1970, a análise de linguagens de alto nível indicava que os compiladores produziam alguma linguagem de máquina correspondente complexa. Foi determinado que novas instruções poderiam melhorar o desempenho. Algumas instruções foram adicionadas que nunca foram planejadas para serem usadas em linguagem assembly, mas se encaixam bem com linguagens de alto nível compiladas. Os compiladores foram atualizados para aproveitar essas instruções. Os benefícios de instruções semanticamente ricas com codificações compactas também podem ser vistos em processadores modernos, particularmente no segmento de alto desempenho, onde os caches são um componente central (ao contrário da maioria dos sistemas embarcados). Isso ocorre porque essas memórias rápidas, mas complexas e caras, são inerentemente limitadas em tamanho, tornando o código compacto benéfico. Claro, a razão fundamental pela qual eles são necessários é que as memórias principais (ou seja, RAM dinâmica hoje) permanecem lentas em comparação com um núcleo de CPU (de alto desempenho).

Problemas de design

Embora muitos projetos tenham alcançado o objetivo de maior rendimento a um custo menor e também permitido que construções de linguagem de alto nível sejam expressas por menos instruções, observou-se que esse nem sempre era o caso. Por exemplo, versões low-end de arquiteturas complexas (ou seja, usando menos hardware) podem levar a situações em que é possível melhorar o desempenho não usando uma instrução complexa (como uma chamada de procedimento ou instrução enter) mas, em vez disso, usando uma sequência de instruções mais simples.

Uma razão para isso é que os arquitetos (escritores de microcódigo) às vezes "projetam demais" instruções em linguagem assembly, incluindo recursos que não podem ser implementados de forma eficiente no hardware básico disponível. Pode haver, por exemplo, "efeitos colaterais" (acima dos sinalizadores convencionais), como a configuração de um registro ou local de memória que talvez tenha sido raramente usado; se isso fosse feito por meio de barramentos internos comuns (não duplicados), ou mesmo do barramento externo, exigiria ciclos extras todas as vezes e, portanto, seria bastante ineficiente.

Mesmo em projetos balanceados de alto desempenho, instruções altamente codificadas e (relativamente) de alto nível podem ser complicadas de decodificar e executar com eficiência dentro de um orçamento de transistor limitado. Tais arquiteturas, portanto, exigiam muito trabalho por parte do projetista do processador nos casos em que uma solução mais simples, mas (normalmente) mais lenta, baseada em tabelas de decodificação e/ou sequenciamento de microcódigo não é apropriada. Em uma época em que os transistores e outros componentes eram um recurso limitado, isso também deixou menos componentes e menos oportunidades para outros tipos de otimizações de desempenho.

A ideia do RISC

O circuito que executa as ações definidas pelo microcódigo em muitos (mas não todos) processadores CISC é, em si, um processador que, em muitos aspectos, é uma reminiscência em estrutura dos primeiros designs de CPU. No início dos anos 1970, isso deu origem a ideias para retornar a projetos de processadores mais simples, a fim de torná-lo mais viável para lidar sem tabelas ROM (então relativamente grandes e caras) e/ou estruturas PLA para sequenciamento e /ou decodificação.

Um dos primeiros (retroativamente) processadores RISC marcados (IBM 801 – IBM's Watson Research Center, meados da década de 1970) era uma máquina simples de pipeline estreitamente planejada originalmente para ser usada como um processador interno kernel do microcódigo, ou mecanismo, em projetos CISC, mas também se tornou o processador que introduziu a ideia RISC para um público um pouco maior. Simplicidade e regularidade também no conjunto de instruções visíveis facilitariam a implementação de estágios de processador sobrepostos (pipelining) no nível do código de máquina (ou seja, o nível visto pelos compiladores). No entanto, o pipelining nesse nível já era usado em alguns "supercomputadores" a fim de reduzir o tempo do ciclo de instrução (apesar das complicações de implementação dentro da contagem limitada de componentes e complexidade de fiação viável na época). A execução interna do microcódigo em processadores CISC, por outro lado, pode ser mais ou menos canalizada dependendo do projeto específico e, portanto, mais ou menos semelhante à estrutura básica dos processadores RISC.

O supercomputador CDC 6600, lançado pela primeira vez em 1965, também foi retroativamente descrito como RISC. Ele tinha uma arquitetura load-store que permitia que até cinco cargas e duas lojas estivessem em andamento simultaneamente sob o controle do programador. Ele também tinha várias unidades de função que podiam operar ao mesmo tempo.

Superescalar

Em um contexto mais moderno, a codificação complexa de comprimento variável usada por algumas das arquiteturas CISC típicas torna complicado, mas ainda viável, construir uma implementação superescalar de um modelo de programação CISC diretamente; o superescalar em ordem Pentium original e o superescalar fora de ordem Cyrix 6x86 são exemplos bem conhecidos disso. Os acessos frequentes à memória para operandos de uma máquina CISC típica podem limitar o paralelismo em nível de instrução que pode ser extraído do código, embora isso seja fortemente mediado pelas estruturas de cache rápidas usadas em projetos modernos, bem como por outras medidas. Devido às instruções inerentemente compactas e semanticamente ricas, a quantidade média de trabalho realizado por unidade de código de máquina (ou seja, por byte ou bit) é maior para um CISC do que para um processador RISC, o que pode dar uma vantagem significativa em uma implementação moderna baseada em cache.

Transistores para lógica, PLAs e microcódigo não são mais recursos escassos; apenas grandes memórias cache de alta velocidade são limitadas pelo número máximo de transistores hoje. Apesar de complexa, a contagem de transistores dos decodificadores CISC não cresce exponencialmente como o número total de transistores por processador (a maioria normalmente usada para caches). Juntamente com melhores ferramentas e tecnologias aprimoradas, isso levou a novas implementações de projetos altamente codificados e de comprimento variável sem limitações de armazenamento de carga (ou seja, não RISC). Isso rege as reimplementações de arquiteturas mais antigas, como o onipresente x86 (veja abaixo), bem como novos projetos de microcontroladores para sistemas embarcados e usos semelhantes. A complexidade superescalar no caso do x86 moderno foi resolvida convertendo instruções em uma ou mais microoperações e emitindo dinamicamente essas microoperações, ou seja, execução superescalar indireta e dinâmica; o Pentium Pro e o AMD K5 são os primeiros exemplos disso. Ele permite que um design superescalar bastante simples seja localizado após os decodificadores (e buffers) (bastante complexos), oferecendo, por assim dizer, o melhor dos dois mundos em muitos aspectos. Essa técnica também é usada em microprocessadores IBM z196 e z/Architecture posteriores.

Termos CISC e RISC

Os termos CISC e RISC tornaram-se menos significativos com a evolução contínua dos designs e implementações do CISC e do RISC. As primeiras implementações x86 altamente (ou fortemente) pipelined, os projetos 486 da Intel, AMD, Cyrix e IBM, suportavam todas as instruções que seus predecessores faziam, mas alcançavam eficiência máxima apenas em um subconjunto x86 bastante simples isso era apenas um pouco mais do que um conjunto de instruções RISC típico (ou seja, sem os limites load–store típicos do RISC). A geração Intel P5 Pentium foi uma versão superescalar desses princípios. No entanto, os processadores x86 modernos também (normalmente) decodificam e dividem as instruções em sequências dinâmicas de microoperações com buffer interno, o que ajuda a executar um subconjunto maior de instruções de maneira pipeline (sobreposta) e facilita a extração mais avançada de paralelismo do código stream, para um desempenho ainda maior.

Ao contrário das simplificações populares (presentes também em alguns textos acadêmicos), nem todos os CISCs são microcodificados ou possuem códigos "complexos" instruções. Como CISC se tornou um termo abrangente que significa qualquer coisa que não seja uma arquitetura load-store (RISC), não é o número de instruções nem a complexidade da implementação ou das instruções que definem o CISC., mas que as instruções aritméticas também realizam acessos à memória. Comparada a um pequeno processador CISC de 8 bits, uma instrução de ponto flutuante RISC é complexa. O CISC nem precisa ter modos de endereçamento complexos; Os processadores RISC de 32 ou 64 bits podem ter modos de endereçamento mais complexos do que os pequenos processadores CISC de 8 bits.

Um PDP-10, um PDP-8, um Intel 80386, um Intel 4004, um Motorola 68000, um mainframe System z, um Burroughs B5000, um VAX, um Zilog Z80000 e um MOS Technology 6502, todos variam muito em o número, tamanhos e formatos de instruções, o número, tipos e tamanhos de registradores e os tipos de dados disponíveis. Alguns têm suporte de hardware para operações como a varredura de uma substring, aritmética BCD de precisão arbitrária ou funções transcendentais, enquanto outros têm apenas adição e subtração de 8 bits. Mas todos eles estão na categoria CISC. porque eles têm "load-operate" instruções que carregam e/ou armazenam o conteúdo da memória dentro das mesmas instruções que executam os cálculos reais. Por exemplo, o PDP-8, tendo apenas 8 instruções de tamanho fixo e nenhum microcódigo, é um CISC por causa de como as instruções funcionam, o PowerPC, que tem mais de 230 instruções (mais do que alguns VAXes) e internos complexos, como renomeação de registradores e um buffer de reordenação, é um RISC, enquanto o Minimal CISC tem 8 instruções, mas é claramente um CISC porque combina acesso à memória e computação nas mesmas instruções.

Contenido relacionado

Páginas de Servidor Ativas

Active Server Pages é a primeira linguagem de script do lado do servidor e mecanismo da Microsoft para páginas da Web...

Serviço de Informação Knowbot

O Knowbot Information Service também conhecido como netaddress, é um mecanismo de busca de usuários da Internet lançado em dezembro de 1989. Embora ele...

Linha de montagem

Uma linha de montagem é um processo de fabricação no qual as peças são adicionadas à medida que a montagem semi-acabada sai da estação de trabalho...
Más resultados...
Tamaño del texto:
Copiar