

CISC x RISC
Nota: Os textos a seguir são traduções livres de livros e revistas, portanto podem conter erros de tradução.

1. O Aparecimento do Circuito Integrado
Durante os anos 60, os circuitos integrados entraram em cena. Centenas de transistores, diodos, e resistores puderam ser colocados em um único chip, resultando em velocidades operacionais mais altas, capacidade aumentada, maior confiabilidade...e diminuição dos custos. Isto permitiu que os projetistas construissem sistemas de computação usando componentes comerciais e ajudou a padronizarusing os projetos dos modernos sistemas de computação.

2. Um Sistema Típico de Computação
Todo sistema de computação moderno consiste de tres seções básicas : Um processador, alguma memória, e dispositivos periféricos (entrada e saída).

O trabalho do processador é aceitar as instruções vindas da memória e executar estas instruções. A maioria das instruções dizem para o processador levar dados da memória ou de dispositivos periféricos e então muda estes dados ou o escreve na memória ou em um dispositivo periférico.
A Memória de um computados é dividida em 2 tipos básicos: Random Access Memory (RAM), que o processador pode ler e escrever e Read-Only Memory (ROM) que o processador nunca pode mudar. Read-Only Memory (ROMs) retêm a sua informação até mesmo quando a energia é desligada. Isto faz ROMs ser útil para a tarefa de iniciar o computador quando a energia é ligada.
A Random Access Memory do computador é usada para trocar informações ou para carregar programas do disco (ou de outro periférico) antes de rodá-los. Este tipo de memória não perserva seu conteúdo quando a eletricidade é desligada.
O conteúdo da RAM e da ROM são organizados da mesma maneira. Cada tipo de memória possui várias células (também conhecidas como localizações de armazenamentoalso), e cada célula possui um único endereço. O menor endereço é tipicamente o 0, e o maior endereço permitido é determinado pelo processador --- este range de endereços é conhecido como espaço de endereçamento da máquina.
Observe que o chip de memória de muitos sistemas são organizados em células de 8 bits (1 byte), que fornece para cada byte um único endereço.
Quando o computador quer ler ou escrever uma localização na memória, ele precisa de 2 coisas: especificar um endereço e ler ou escrever na localização especificada. O computador faz isto colocando primeiro o endereço no barramento de endereços, onde é levado para a memória. Circuitos especiais determinam qual chip deverá satisfazer o pedido, e que chip esta habilitado.
O processador também especifica se quer ler ou escrever na localização especificada. Se o processador sinalizar uma operação de leitura, então a memória copia o conteúdo da localização especificada para o barramento de dados. Se o processador sinalizar uma operação de escrita, então o processador é responsável por colocar a informaçào no barramento de dados, e a memória copia a informação do barramento de dados para o local especificado na memória.
Neste exemplo, os dados e as instruções podem ser armazenados na mesma memória --- fazendo desta uma máquina de arquitetura Von Neumann. As instruções e os dados são transferidos do mesmo barramento de dados e residem no mesmo espaço de endereçamento.
Note que o processador sabe que está pedindo algo como uma instrução ou requisitando um dado, e encaminhará a informação adequadamente.
A figura acima mostra unidades funcionais dentro de um hipotético precessador, que combina com as partes mais comuns dos microprocessadores modernos:
O examplo de um programa na linguagem assembly,abaixo, conta de 1 até 10, colocando o resultado na localização de memória 0. (Nós escolhemos escrever o resultado na localização zero porque imprimindo o resultado ou enviando para outro periférico poderia envolver uma série longo de instruções)
PUT 1 INTO Register 1
PUT 4 INTO Register 2
LOOP: COMPARE Register 1 WITH Register 2
IF EQUAL BRANCH TO "END"
ADD 1 TO Register 1
BRANCH TO "LOOP"
END: STOP
Um programa semelhante em
linguagem de alto nível leria:
FOR I = 1 TO 10 PRINT I ENDEste programa na verdade implementa um simples "loop for ", que está repetindo parte de um programa que conta para cima ou para baixo o valor entre dois números.
As primeiras 2 instruções inicializa, ou set up, registradores 1 e 2. Registrador 1 é o contador do loop , e caontado o valor entre 1 e 10. Registrador 2 possui o valor final do loop --- O contador do loop esta testando continuamente este valor para determinar o loop deve ser encerrado.
Instruções 3-7 (do label LOOP: para a instrução "BRANCH TO "LOOP"" ) compoem o corpo do loop:
Se o resultado da subtração é zero, então os dois valores são equivalentes e o "Equal" bit é colocado para TRUE na condição do code register. Se o resultado é maior que zero, o "MAIOR QUE" bit seria colocado. Semelhantemente, se o resultado fosse menor que zero, o "MENOR QUE" bit seria colocado.
6. Os Dispositivos Periféricos
A última parte do nosso sistema hipotético são os dispositivos periféricos (também conhecidos simplesmente por ""periféricos".) Os periféricos dos sistemas do computador comunica-se com o "mundo exterior" ou mantém as informações por um longo tempo. Periféricos se encaixam em várias classes básicas:

O projetista de computador têm várias opções quando projeta um periférico para um sistema, incluindo tçnicas como mapeamento de memória de I/O , uso de instruções especiais de I/O dentro do processador principal, ou uso de um processador de I/O separado.
7. Mapeamento de Memória de I/O
Mapeamento de Memória faz o periférico parecer um bloco de RAM (dentro de uma faixa de endereço separando da memória peincipal) para o processador principal. Se o processador escreve um valor em um destes endereços, a informação é enviada para o periférico. De modo similar, se o processador ler de um destes endereços, alguma informação é lida deste periférico e entregue ao processador.

Observe que o processador esta em controle diresto sobre o dispositivo periférico, i.e. informação somente é transferida quando o processador ler ou escreve de um destes endereços especiais. Esta técnica é usada inteiramente pelos computadores Macintosh e Apple II para coisas como portas seriais e monitores. Esta técnica é um modo barato e confiável de controlar periféricos, mas gasta bastante tempo do processador principal esperando por dispositivos periféricos.
Alguns processadores possuem instruções especiais de I/O para o suporte de dispositivos periféricos. Estes processadores transferem os dados dos periféricos usando o barramento de dados, mas possui um barramento de endereçamento separado só para os periféricos ou um sinal especial que indica o endereço atual que deveria ser usado por um periférico em lugar da memória.
O mais eficiente modo de conectar um dispositivo periférico a um sistema é através de um processador de I/O. Estes são dispositivos separados que lêem e escrevem para um periférico sem a intervenção do processador principal.
Por exemplo, em uma máquina como o Quadra 900 que usa um processador de I/O separado para a porta serial, o processador principal coloca o dado para ser enviado no bloco de RAM e então envia uma solicitação ao processador de I/O para que o dado saia. O processador de I/O então ler cada byte da area especificada na memória e envia a toda informação para a porta serial enquanto o processador principal continua execuntando nosso programa.

Uma das algumas constantes na indústria de computadores é o desejo de sistemas de computadores sempre mais rápidos. Há vários ítens que pode-se manipular para acelerar um sistema, incluindo a memória, o processador, a conexão para os dispositivos periféricos, ou nos periféricos atuais.
Memória é um dos melhores lugares para acelerar um sistema pelo uso de caches.
A memória cache é um bloco de RAM rápida localizada entre o processador e a memória mais lenta como a memória principal ou o disco rígido.Quando o processador precisa ler alguma informação da memória lenta, aquela informação também é copiada no cache onde, se a informação é novamente necessária, pode ser lida novamente da memória cache que é mais rápida.
Alguns caches mantém localizações individuais separadas, enquanto outros caches armazenam blocos de localizações (onde cada bloco é conhecido como um cache line.) Em um sistema que usa cache lines, o circuito de cache lerá uma sussução de localizações que começam com ou ao redor da localização especificada quando o processador executa uma instrução lida para um endereço que não é do cache.
Muitos caches são montados diretamente sobre o chip do processador ; estes são conhecidos como caches de pimeiro-nível (first-level) ou simplesmente de L1.
Acelerar o resto do sistema envolve várias outras diferentes estratégias. Nós ja discutimos que o uso de de processadores de I/O acelera os periféricos, e que cada periférico possui um pequeno buffer de memória que mantém os dados enviados do sistema principal. (Isto é similar ao conceito de cache.)
Porém, o lugar mais frutífero para acelerar o sistema está no projeto de processadores mais rápidos. Os próximos parágrafos mostram como os projetistas de computador tem tentado fazer isto.

Os Processadores AMD são exemplos de CISC
Descreveremos a arquitetura de computadores "CISC", que é a mais utilizada atualmente.
Conteúdo:
CISC, é uma sigla para Complex Instruction Set Computer, é uma filosofia de projeto de chips que são fáceis de programar e fazem uso mais eficiente da memória. Cada instrução dentro do conjunto de instruções CISC pode executar uma série de operações dentro do processador. Isto reduz o número de instruções requirido para implementar um determinado programa, e permite o programador aprender um pequeno mas flexível conjunto de instruções.
Considerando que as primeiras máquinas foram programadas em linguagem assembly e a memória era lenta e cara, a filosofia de CISC fez sentido, e foi comumente implementada em tais grandes computadores como os PDP-11 e o DECsystem 10 e 20 máquinas.
A maioria dos projetos de microprocessadores comum --- inclusive as séries Intel(R) 80x86 e Motorola 68K ---também segue a filosofia de CISC.
Como nós veremos, recentes mudanças nos software e na tecnologia do hardware forçaram um re-exame do CISC. Mas primeiro, daremos uma olhada nas decisões que conduziram ao CISC.
15. CISC filosofia 1: Uso de Microcódigo
Os projetos dos primeiros processadores usaram lógica (hardwire) dedicada para decodificar e executar cada instrução no conjunto de instruções do processador. Isto trabalhou bem para projetos simples com poucos registradores, mas fizeram arquiteturas mais complexas, difíceis de construir, como o controle do caminho lógico pode ser difícil de implementar. Assim, os projetistas trocaram as táticas--- eles construíram algumas lógicas simples para controlar os caminhos de dados entre os vários elementos do processador, e usaram uma simplificada instrução de microcódico para controlar a lógica do caminho de dados. Este tipo de implementação é conhecida como uma implementação de microprogramas.
Em um sistema de microprogramas, o processador principal tem alguma memória embutida (tipicamente ROM) que contém grupos de instruções de microcódigo que correspondem com cada instrução em linguagem de máquina. Quando uma instrução em linguagem de máquina chega ao processador central, o processador executa a série correspondente de instruções em microcódico.

Porque as instruções podem ser retornadas até 10 vezes mais rapidamente de um ROM local que da memória principal, projetistas começaram a pôr tantas instruções quanto possível em microcódico. De fato, alguns processadores poderiam ser ordenados com microcódico customizável que substituiria as freqüentemente usadas mas lentas rotinas em certa aplicação.
Existe algumas vantagens reais para uma implementação com microcódico:
Usando um conjunto de instruções microcodificadas, a serie IBM 360 foi capaz de de oferecer o mesmo modelo de programação através de um range de diferentes configurações de hardware.
Algumas máquinas foram aperfeiçoadas para computação científica, enquanto outras foram aperfeiçoadas para computação empresarial. Porém, Elas todas tudo compartilharam o mesmo conjunto de instruções, programas podem ser movidos de máquina para máquina sem re-compilação (mas com um possível aumento ou diminuição de desempenho que depende do hardware subjacente.)
Este tipo de flexibilidade e poder fazem da microcodificaçãong o caminho preferido para construir novos computadores por algum tempo.
16. CISC filosofia 2: Construindo um "rico" conjunto de instruções
Uma das consequências do uso de projetos microprogramados é que os projetistas puderam pôr mais funcionalidade em cada instrução. Isto não só consumido menos do número total de instruções que exige a implementação de um programa, e também fazendo uso mais eficiente da lenta memória principal, mas isto também fez a vida do programador de limguagem assembly mais simples.
Logo, projetistas estavam aumentando os conjuntos de instrução deles com instruções especificamente direcionadas ao programador de limguagem assembly. Tais realces incluíram operações de manipulação de strings, construção de loops especiais, e modos de endereçamento especiais para indexar por tabelas na memória.
Poe exemplo:
ABCD Add Decimal with Extend
ADDA Add Address
ADDX Add with Extend
ASL Arithmentic Shift Left
CAS Compare and Swap Operands
NBCD Negate Decimal with Extend
EORI Logical Exclusive OR Immediate
TAS Test Operand and Set
Uma vez que os projetistas começaram a construção de conjuntos de instruções amigáveis ao programador, o próximo passo lógico era construir conjuntos de instruções que traçam diretamente das linguagens de alto nível. Não que fazer só isto simplifique a tarefa do escritor de compilador, mas também permite para os compiladores emitir menos instruções por linha de código de fonte.
Microprocessadores CISC modernos, como os 68000, implementam várias dessas instruções, inclusive rotinas para criar e remover pilha com uma única chamada.
Por exemplo:
DBcc Test Condition, Decrement and Branch
ROXL Rotate with Extend Left
RTR Return and Restore Codes
SBCD Subtract Decimal with Extend
SWAP Swap register Words
CMP2 Compare Register against Upper and Lower Bounds
Decisões dos projetistas CISC:
Conduzidas juntas, estas três decisões conduziram à filosofia CISC a dirigir todos os desígnios dos computadores até os recentes 1980, e ainda está em uso hoje.
19. Características do projeto CISC
Enquanto os chips que emergiram dos anos setenta e oitenta seguiram os próprios caminhos de projetos, a maioria estava presa pelo que nós chamamos de " Decisões de Projeto CISC ". Estes chips têm um conjunto de instruções e arquiteturas de hardware semelhantes.
Em termos gerais, o conjunto de instruções são projetados de acordo com a necessidade do programador de linguagem assembly e do projetista de hardware designs e são bastante complexas.
Os constrangimentos do projeto que conduziram ao desenvolvimento do CISC (pequenas quantidades de memória lenta, e o fato que a maioria das primeiras máquinas foram programadas em linguagem assembly), forneceu ao conjunto de instruções CISC algumas características comuns:
A maioria das arquiteturas de hardware CISC tem várias características em comum:
Os processadores CISC foram projetados para executar cada instrução completamente antes de começar a próxima instrução. Mesmo assim, a maioria dos processadores quebra a execução de uma instrução em várias fases definidas; assim que uma fase seja acabada, o processador passa o resultado para a próxima fase:
Em uma máquina CISC ideal, cada instrução completa requereria só um ciclo de clock (no qual cada fase seria completada em uma fração de um ciclo.) de fato, esta é a velocidade máxima possível para uma máquina que executa 1 instrução de cada vez.
Na realidade, algumas instruções podem requerer mais de um clock por fase, como os shows de animação. Porém, o projeto CISC pode tolerar esta diminuição desde que a idéia atrás do CISC é manter o número total de pequenos ciclos tendo que coisas complicadas aconteçam dentro de cada ciclo.
24. CISC e a Equação de Performace Clássica
A equação usual para determinar a performace é a soma de todas as instruções de (o número de ciclos por instrução * tempo de ciclo de instruções) = tempo de execução.

Isto lhe permite acelerar um processador de 3 modos diferentes--- use menos instruções para uma determinada tarefa, reduza o número de ciclos para algumas instruções, ou acelere o clock (diminuição do tempo de ciclo.)
CISC tenta reduzir o número de instruções para um programa, e (como nós veremos) RISC tenta reduzir os ciclos por instrução.
As
vantagens do CISC
Na hora do desenvolvimento inicial delas, máquinas CISC usam tecnologias disponíveis para aperfeiçoar o desempenho do computador.
As desvantagens
do CISC
Rápido, os projetistas perceberam logo que a filosofia CISC tem seus próprios problemas, incluindo:
Durante
grande parte da história dos computadores pessoais, o modelo predominante
dos microprocessadores tem sido da Intel Corporation. O primeiro processador
no IBM PC foi o Intel 8088. As gerações seguintes de processadores Intel foram
da família 80X86 – 8086, 80286, 80386, 80486.A partir do 80586, a Intel entrou
na justiça para patentear seu processador, pois os concorrentes AMD. Cyrix
e Texas Instruments estavam ganhando terreno na disputa pelo processador de
ponta. Depois do Pentium, a Intel já lançou o Pentium MMX, Pentium Celeron,
Pentium Pró, Pentium III e Pentium IV, este último com clock de 1 GHz. Todos
eram versões elaboradas do 8088 original, mas com desempenho melhorado de
duas maneiras – operando mais rapidamente ou processando mais dados simultaneamente.
O 8088, por exemplo, operava a 4,7 Mhz – ou 4,7 milhões de oscilações por
segundo – e alguns chips como o Pentium IV de 1 GHz vão tão rápido quanto
133 MHz. O 8088 conseguia processar 8 bits de dados por vez, enquanto o Pentium
IV processa 64 bits internamente.
Apesar das mudanças, os processadores Intel até o 80486 eram baseados em uma
filosofia de projeto denominada CISC, do Inglês Complex Instruction Set Computing.
O padrão CISC usa comandos que incorporam muitas instruções mínimas para executar
uma simples operação. É como se ele fosse um facão que corta dados e códigos.
Ou ainda, por comparação, como um bisturi que corta pedaços cada vez menores
e mais delicados de dados e códigos. Esse bisturi é chamado RISC, do Inglês
Reduced Instruction Set Computing. Projetos RISC são encontrados em processadores
mais novos, entre eles o DEC Alpha, o RISC 6000 da IBM, o processador Power
PC e, embora a Intel não chame os processadores Pentium de chips RISC, eles
têm muito em comum com o padrão RISC de executar códigos.
O RISC é um projeto menos complicado que usa muitas instruções mais simples
para executar uma operação comparável e em menos tempo que um processador
CISC que executa um comando maior e mais complicado. Os chips RISC podem ser
fisicamente menores que os chips CISC. E pelo fato de usarem menos transistores,
geralmente sua fabricação é mais barata e produzem menos calor.
A primeira máquina RISC moderna foi o minicomputador 801 construído pela IBM,
começando em 1975, Entretanto, a IBM não publicou nada a seu respeito até
1982. Em 1980, um grupo em Berkeley, liderado por David Patterson e Carlo
Séquin, começou a projetar pastilhas RISC VLSI. Eles criaram o termo RISC
e batizaram sua pastilha de CPU de RISC I, seguida de perto pela RISC II.
Um pouco mais tarde, em 1981, do outro lado da baía de São Francisco, em Stanfor,
John Hennessy projetou e fabricou uma pastilha RISC um pouco diferente, que
ele chamou de MIPS.
Esta três máquinas RISC são comparadas a três máquinas CISC na Tab. 3.1. Cada
uma delas levou diretamente a importantes produtos comerciais. O 801 foi o
ancestral do IBM PC/RT, o RISC I foi a inspiração do projeto SPARC da Sun
Microsystems, e a pastilha MIPS de Stanford levou à formação da MIPS Computer
Systems.
|
CISC |
RISC |
|||||
|
Modelo |
IBM 370/168 |
VAX 11/780 |
Xerox Dorado |
IBM 801 |
Berkeley RISC I |
Stanford MIPS |
|
Ano em que ficou pronto |
1973 |
1978 |
1978 |
1980 |
1981 |
1983 |
|
Instruções |
208 |
303 |
270 |
120 |
3 |
55 |
|
Tamanho do Microcódigo |
54K |
61K |
17K |
0 |
0 |
0 |
|
Tamanho da Instrução |
2-6 |
2-57 |
1-3 |
4 |
4 |
4 |
|
Modelo de Execução |
Reg-reg Reg-mem Mem-mem |
Reg-reg Reg-mem Mem-mem |
Pilha |
Reg-reg |
Reg-reg |
Reg-reg |
Tabela 1. Comparação entre três máquinas CISC típicas com as três primeiras máquinas RISC. Os tamanhos de instrução e de microcódigo estão bytes.
Muitas previsões vêm afirmando
que o futuro dos processadores caminha para um projeto RISC, e provavelmente
eles estejam corretas. Mas não tem havido um movimento de venda em massa do
RISC, por duas razões. A mais importante delas é manter a compatibilidade
com o vasto número de software aplicativo, desenvolvido para trabalhar com
os processadores Intel CISC mais antigos. A Segunda razão é que você não recebe
todos os benefícios da arquitetura RISC, a não ser que esteja usando um sistema
operacional e programas que tenham sido criados e compilados especificamente
para tirar vantagens das operações RISC. É a clássica situação do ovo e da
galinha. Alguns fabricantes de computadores estão oferecendo processadores
RISC para se projetarem como líderes em tecnologia. Eles executam os antigos
programas CISC somente através da emulação de um processador CISC, o que acaba
negando as vantagens do RISC. Ao mesmo tempo, os criadores de software relutam
em converter seus programas para versões compiladas RISC quando ainda não
há muitas pessoas usando PCs baseados em RISC.
O Pentium mudou isso. Os técnicos podem argumentar se o Pentium pode ser um
verdadeiro chip RISC. É um cômodo comprometimento. O Pentium executa antigos
aplicativos e sistemas operacionais e ao mesmo tempo oferece vantagens na
velocidade de programas criados especialmente para usar a capacidade do padrão
Pentium. E com um sistema operacional avançado como o Windows NT, você pode
colocar mais de um microprocessador Pentium no computador para dobrar o poder
de processamento.
27. Princípios Técnicos de Máquinas RISC
Vamos primeiro apresentar uma breve descrição da filosofia básica de projeto RISC. Projetar uma máquina RISC tem cinco passos básicos:
O
coração de qualquer computador é a sua via de dados, que contém os registradores,
a ALU e os barramentos que os conectam. Este circuito deve ser otimizado para
a linguagem ou aplicações em questão. O tempo requerido para buscar os operandos
a partir de seus registradores, executá-los através da ALU e armazenar o resultado
de volta em um registrador, chamado de tempo de ciclo da via de dados, deve
ser o mais curto possível.
O próximo passo é projetar as instruções de máquina que façam bom uso da via
de dados. Apenas algumas instruções e modos de endereçamento são tipicamente
são tipicamente necessários. Instruções adicionais devem apenas ser adicionadas
se elas forem freqüentemente utilizadas e não reduzirem o desempenho das mais
importantes. A Regra de Ouro número 1 diz:
Sempre
que se resolver adicionar uma nova instrução ao processador, ela deve ser
examinada sob esta luz: como ela afeta o tempo de ciclo da via de dados? Se
ela aumentar o tempo de ciclo, provavelmente não vale a pena tê-la.
Finalmente, o mesmo processo deve ser repetido para todos os outros recursos
dentro da CPU, tais como memória cache, gerenciamento de memória, co-processadores
de ponto flutuante, e assim por diante.
Máquinas RISC podem diferir de suas concorrente CISC de oito formas críticas,
como listado na Tabela 2.
|
RISC |
CISC |
|
|
1 |
Instruções simples levando 1 ciclo |
Instruções complexas levando múltiplos ciclos |
|
2 |
Apenas LOADs/STOREs referenciam a memória |
Qualquer Instrução pode referenciar a memória |
|
3 |
Altamente pipelined |
Não tem pipeline, ou tem pouco |
|
4 |
Instruções executadas pelo hardware |
Instruções executadas pelo microprograma |
|
5 |
Instruções com formato fixo |
Instruções de vários formatos |
|
6 |
Poucas instruções e modos |
Muitas instruções e modos |
|
7 |
A complexidade está no compilador |
A complexidade está no microprograma |
|
8 |
Múltiplos conjuntos de registradores |
Conjunto único de registradores |
28.
Uma
Instrução por Ciclo da Via de Dados
Em
certo sentido, nome Reduced Instruction Set Computer, não é um bom nome. Enquanto
é verdade que a maioria das máquinas RISC têm relativamente poucas instruções,
a característica única mais importante que as distingue das máquinas CISC
é que as instruções RISC são completadas em um único ciclo da via de dados.
Uma conseqüência do princípio de que toda instrução RISC deve gastar um ciclo
é que qualquer operação que não possa ser completada em um ciclo não pode
ser incluída no conjunto de instruções Assim, muitas máquinas RISC não possuem
instruções para multiplicação ou divisão. Na prática, a maioria das multiplicações
são formadas por pequenas constantes conhecidas em tempo de compilação, de
modo que elas podem ser simuladas por seqüências de somas e deslocamentos.
Instruções de ponto flutuante são executadas por um co-processador.
Dado
o desejo de ter toda instrução gastando um ciclo de relógio, é claro que as
instruções que referenciam a memória vão ser um problema. Instruções que buscam
seus operandos de registradores e armazenam seus resultados em registradores
podem ser manipuladas em um ciclo, mas instruções que carregam a partir de
ou armazenam em memória levam muito tempo. Aumentar o ciclo de relógio por
um fator de dois ou três para acomodar cargas e armazenamentos a viola a Regra
de Ouro 1 do projeto RISC.
Como algumas instruções têm que referenciar memória, instruções especiais
LOAD e STORE são adicionadas à arquitetura. Apenas estas instruções podem
referenciar a memória.
É claro que proibir que as instruções
comuns acessem a memória não resolve o problema de como fazer com que LOADs
e STOREs operem em um ciclo. A solução está em um pouco de truque. Vamos agora
relaxar nosso objetivos ligeiramente. Em vez de requerer que toda instrução
deva ser executada em um ciclo, vamos meramente insistir que seremos capazes
de começar uma instrução a cada ciclo, sem levar em consideração quando é
que ela termina. Se, em n ciclos, conseguirmos iniciar n instruções, na média
teremos atingido uma instrução por ciclo, o que é suficientemente bom.
Para atingir este objetivo modificado, todas as máquinas RISC têm pipeline.
A CPU contém diversas unidades independentes que trabalham em paralelo. Uma
delas busca as instruções, e outras as decodificam e executam. A qualquer
instante, diversas instruções estão em vários estágios de processamento.
Uma instrução comum utiliza duas unidades pipeline, uma para busca e outra
para execução. Num instante de tempo uma instrução é iniciada. No outro instante,
a instrução iniciada muda de unidade e é executada. Na unidade que ficou livre
é iniciado uma nova instrução. Assim mantemos a média, que é iniciar uma instrução
a cada ciclo. Porém instruções LOADs e STOREs requer uma terceira unidade,
para referenciar a memória. Então, em vez de finalizar a execução em duas
unidades, finalizam em três unidades.
31. Características e Funcionamento da Arquitetura RISC
O que é
RISC?
Processadores de Conjunto Reduzido
de Instruções Computacionais ('Reduced Instruction Set Computing' ou, abreviadamente
RISC) são muito mais velozes do que os processadores comuns (CISC). O termo
'Conjunto Reduzido de Instruções' refere-se ao número de ciclos de clock que
o processador leva para selecionar uma instrução. Processadores comuns levam
vários ciclos de clock para selecionar uma única instrução. Um chip RISC,
por outro lado, pode selecionar e executar uma instrução a cada ciclo de clock.
RISC: Princípio
de Processamento
As funções de comando criadas em
um processador RISC consistem de muitas instruções pequenas e individuais,
que realizam apenas uma única tarefa. O software aplicativo, que precisa ser
recompilado especialmente para um processador RISC, realiza a tarefa de informar
ao processador qual a combinação de seus comandos menores deve ser executada
para completar uma operação maior.
Todos os comandos RISC são do mesmo tamanho, e há somente uma maneira de carregá-los
e armazená-los. Além disto, uma vez que cada comando já está na forma de microcódigo,
os processadores RISC não precisam de um passo extra para passar as instruções
que eles recebem através de uma unidade que transforme os comandos complexos
em microcódigos mais simples. Como resultado destas diferenças, os comandos
RISC são carregados muito mais rapidamente que os comandos CISC.
Durante a compilação de software especificamente para um chip RISC, o compilador
determina quais comandos não vão depender dos resultados de outros. Como estes
comandos não têm de esperar por outros comandos, o processador pode executar
simultaneamente até 10 comandos em paralelo.
Como o processador RISC está trabalhando com comandos mais simples, seu conjunto
de circuitos também pode ser mais simples, Os comandos RISC passam por um
número menor de transistores em circuitos mais curtos, desta forma os comandos
são executados mais rapidamente. O resultado é que os processadores RISC geralmente
necessitam apenas de um ciclo do relógio da CPU por instrução. O número de
ciclos necessários para completar uma operação inteira depende do número de
pequenos comandos que constituem essa operação. Em uma operação comparável,
o tempo necessário para interpretar e executar as instruções RISC é bem menor
que o tempo para se carregar e decifrar um comando CISC complexo e então executar
cada um de seus componentes.
Resumo
das Características
Conjunto de Instruções Simples:
a arquitetura RISC, é constituída por um conjunto de instruções simples, instruções
básicas, que compõem instruções mais complexas.
Instruções do Mesmo Tamanho: as instruções tem sempre um único tamanho, e
uma única maneira de executá-las.
Uma Instrução por Ciclo de Máquina: todas as instruções são executadas em
um único ciclo, fazendo com que o processador execute várias instruções ao
mesmo tempo, tornando o processamento muito mais rápido Isto é possível devido
a um tipo de tecnologia chamada de Pipelined.
32.
Pipelined: Uma Técnica Fundamental
Os projetista de RISC, se preocupam
principalmente, em criar técnicas e dispositivos que acelerem o processamento
da informação. Uma dessas técnicas, é o Pipelined. O Pipelined é uma técnica
em que o hardware processa mais de uma instrução de cada vez. Ele não espera
o término de uma instrução para executar outra.Em uma máquina CISC típica,
temos, basicamente, quatro fases para a execução: busca, decodificação, execução
e escrita. Em uma máquina RISC, temos as mesmas fases, só que executadas em
paralelo. Uma fase não precisa esperar a outra terminar, para que ela se inicie.
Este procedimento, não diminui o tempo de execução da tarefa, mas melhora
o processamento global.
33. Diferenças entre Arquiteturas RISC e CISC
A transição de CISC para RISC foi uma mudança radical na arquitetura. Os conjuntos de instruções foram mudados, sacrificando a compatibilidade binária para o desempenho. Reduzindo o conjunto de instruções, o processador cabia em um chip menor que permitia que os desenvolvedores aumentassem a velocidade do clock. Além disso, o processador poderia ser pipelineado e uma unidade de controle microcodificada tornou-se desnecessária. RISC, "resolve os casos comuns mais rápidos", era o princípio que conduziu a um aumento impressionante da performance comparado com os processadores CISC. Os processadores mais adiantados tais como IBM RT, SPARCv7 e MIPS R2000 aderiram completamente ao princípio fundamental RISC. Entretanto, enquanto a tecnologia avançava para aumentar os tamanhos dos dados e aumentar a densidade do transistor, os desenvolvedores do processador RISC começaram a considerar maneiras de usar esse espaço novo do chip. Alguns dos usos desse espaço incluíram:
Assim, a geração atual de processadores de desempenho elevado carrega poucas características dos processadores que iniciaram a revolução RISC.
Arquiteturas
RISC
Nas arquiteturas RISC, a grande
maioria dos processadores possuem 32 registros genéricos de 32 bits – para
representar valores inteiros e/ou endereços de memória – para além de 32 registros
de 32 bits para representação de valores em vírgula flutuante. Estes registros
são considerados de uso genérico e podem ser usados explicitamente por qualquer
instrução que aceita operandos de registros, com exceção de um registro que
contenha o valor ZERO, que não pode ser alterado (só de leitura). Ainda visível
ao programador está sempre também o apontador para a próxima instrução, o
instruction pointer ou program counter.
Arquiteturas
CISC
A existência de um grande número
de registros nas arquiteturas RISC, aliado à evolução da tecnologia dos compiladores
dos últimos anos (em especial, na geração de código), vem permitindo representar
a maioria das variáveis escalares diretamente em registro, não havendo necessidade
de recorrer com tanta freqüência à memória. Esta organização não foi contudo
economicamente viável nas gerações anteriores de microprocessadores, com destaque
para a família da Motorola (M680x0) e, ainda mais antiga, a família da Intel
(ix86). Estes processadores dispunham de um menor nº de registros e , consequentemente,
uma diferente organização que suportasse eficientemente diversos mecanismos
de acesso à memória.
No caso da família M680x0, o programador tinha disponível dois bancos de 8
registros genéricos de 32 bits: um para dados (D) e outro para apontadores
para a memória (A), suportando este último banco um variado leque de modos
de endereçamento à memória. Apenas um dos registros (A7) é usado implicitamente
em certas operações de manuseamento da stack.
A família Intel é mais complicada, por não ter variadamente registros de uso
genérico. A arquitetura de base dispõe efetivamente de 4 registros para conter
operandos aritméticos (A, B, C e D), mais 4 para trabalhar com apontadores
para a memória (BP, SP, DI e SI) e outros 4 para lidar com uma memória segmentada
(CS, DS, SS e ES; a única maneira de uma arquitetura de 16 bits poder acessar
a mais de 64K células de memória). Cada um destes registros não pode ser considerado
de uso genérico, pois quase todos eles são usados implicitamente (isto é,
sem o programador explicitar o seu uso) em várias instruções (por exemplo,
os registros A e D funcionam de acumuladores em operações de multiplicação
e divisão, enquanto o registro C é usado implicitamente como variável de contagem
em instruções de controle de ciclos). A situação complica-se ainda mais com
a variação da dimensão dos registros na mesma família (de registros de 16
bits no i286 para registros de 32 bits no i386), pois o formato de instrução
foi concebido para distinguir apenas operandos de 8 e de 16 bits, e um bit
bastava; para garantir compatibilidade ao longo de toda a arquitetura, os
novos processadores têm de distinguir operandos de 8, 16 e 32 bits, usando
o mesmo formato de instrução.
Diferenças entre
RISC e CISC
Todos os processadores dispõem de
instruções de salto "de ida e volta", normalmente designados de instruções
de chamadas em sub-rotinas: nestas, para além de se alterar o conteúdo do
registro PC como qualquer instrução de salto, primeiro guarda-se o endereço
de instrução que segue a instrução de salto (que se encontra no PC); nas arquiteturas
CISC este valor é normalmente guardado na stack. Nas arquiteturas RISC esse
valor é normalmente guardado num registro.
34.
Conjunto de instruções de um processador RISC
O conjunto de instruções que cada
processador suporta é bastante variado. Contudo é possível identificar e caracterizar
grupos de instruções que se encontram presentes em qualquer arquitetura.
Para transferência de informação: integram este grupo as instruções que transferem
informação entre registros e a memória (load/store), entre registros (simulado
no Assembler do MIPS, e implementando com uma soma com o registro 0), diretamente
entre posições de memória (suportado por exemplo, no M680x0, mas não disponível
em qualquer arquitetura RISC), ou entre registros e a stack, com incremento/decremento
automático do sp (disponível em qualquer arquitetura CISC, mas incomum em
arquiteturas RISC);
Operações aritméticas, lógicas, ...: soma, subtração e multiplicação com inteiros
e fp, e operações lógicas AND, OR, NOT, Shift/Left/Right são as mais comuns;
alguns processadores suportam ainda a divisão, quer diretamente por hardware,
quer por microprogramação.
35.
Acesso a operandos em memória em CISC e RISC
Uma das conseqüências do fato das
arquiteturas CISC disporem de um menor número de registros é a alocação das
variáveis escalares, em regra, a posições de memória, enquanto que nas arquiteturas
RISC, a regra era a alocação a registros. Atendendo ao modelo de programação
estruturada nos anos 70, o fato da maioria das variáveis escalares serem locais
a um dado procedimento, e à necessidade do modelo de programação ter de suportar
o aninhamento e recursividade de procedimentos, as arquiteturas CISC necessitavam
de um leque rico de modos de endereçamento à memória, para reduzir o gap semântico
entre uma HLL e a linguagem máquina.
Resume-se aqui, as principais diferenças entre as arquiteturas CISC e RISC,
nas facilidades de acesso a operandos que se encontram em memória:
CISC: grande riqueza na especificação de modos de endereçamento; exemplo do
i86: modo absoluto; por registro indireto –(R), - (SP), (SP)+; por registro
base –(Rb)+desloc8,16,32, (Rb)+(R), (Rb)+desloc8,16,32; com acessos indiretos
à memória, isto é, com apontadores para as variáveis sem memória armazenados
em células de memória.
RISC: apenas em operações load/store e apenas 1 ou 2 modos; exemplo do MIPS:
apenas (R)+desloc16.
Operações lógicas e aritméticas em CISC e RISC Duas grandes diferenças se
fazem notar entre estes 2 modelos: na localização dos operandos neste tipo
de operações, e o nº de operandos que é possível especificar em cada instrução.
CISC: 1 ou mais operandos em memória (máx 1 no i86 e M68K); nem sempre se
especificam 3 operandos (máx 2 no i86 eM68K).
RISC: operandos sempre em registros; 3 operandos especificados (1 dest, 2
fontes). O que é RISC?
36. Vantagens e Desvantagens do RISC
Vantagens
Velocidade:
Devido a tecnologia pipelined os
processadores RISC alcançam duas a quatro vezes a performance dos processadores
CISC usando tecnologia de semicondutor equivalente e os mesmos valores de
clock.
Simplicidade
do Hardware:
Pelo fato de um processador RISC
trabalhar com instruções simples, o processador utiliza de menos espaço no
chip, funções extras como circuito de gerenciamento de memória e unidade aritmética
armazenada num mesmo chip. Chips menores permitem que o fabricante armazenem
mais dispositivos em uma única pastilha, o que pode baixar consideravelmente
o custo.
Instrução de
máquina simples:
As instruções construídas para um
processador RISC são simples e pequenas o que aumenta a sua performance.
Desvantagens:
A transição da arquitetura CISC
para arquitetura RISC pode apresentar alguns problemas devido ao fato que
os engenheiros de software podem ter problemas para fazer a transição do código
de memória de maneira correta.
Qualidade
do Código:
A performance de um processador
RISC depende diretamente do código gerado pelo programador. No caso de um
código mal desenvolvido o processador pode gastar um tempo demasiado na execução
das instruções, isto faz com que a performance de uma máquina RISC dependa
em grande parte da qualidade do código, gerado pelo programador.
Expansão do Código
:
O fato da arquitetura CISC trabalhar
com instrução única com ações complexas e as máquinas RISC trabalharem com
instrução simples a transição do código pode acarretar problemas. O termo
"expansão do código" refere-se ao aumento de tamanho que se obtém de um programa
originalmente compilado para uma máquina CISC, ter sido recompilado para uma
máquina RISC. A expansão vai depender da capacidade do programador e a natureza
do conjunto de instruções de máquina.
Outra desvantagem que a
arquitetura RISC apresenta é o fato de requerer sistema de memória rápida
para alimentar suas instruções. Tipicamente sistemas baseados nesta arquitetura
costumam apresentar grande quantidade de memória cache interna, conhecida
como "first-level cache", o que encarece o projeto.
A
arquitetura RISC caracteriza-se por sua estrutura dinâmica, simples, objetiva
e de grande velocidade. Trabalhando com um conjunto de instruções curtas e
simples, consegue alcançar grande performance, que faz com que suas aplicações
tenham grande potencial em Sistemas de Rede, Internet e Bancos de Dados.
Toda arquitetura tem suas vantagens e desvantagens. Se de um lado, esta arquitetura
apresenta tantas qualidades, ela pode também se transformar num sistema de
baixa performance se não for projetado de forma correta. Seus códigos tem
de ser bem construídos e bem codificados para que se tenha alto desempenho.
No geral, as máquinas baseadas nessa arquitetura, conquistam cada vez mais
o mercado de alto nível, sendo responsável por grande parte dos sistemas de
grande porte mundiais.
Atualizado em 13-Dez-2000.
Este site é melhor visualizado em 800 x 600, 16 milhões de cores e Microsoft Internet Explorer.
Dúvidas, critícas ou qualquer problema no site, favor entrar em contato com o WebMaster.