INTRODUÇÃO
RISC é a abreviatura de “Reduced Instruction Set Computer”, computador com conjunto reduzido de instruções, e é a identificação de um tipo de arquitetura de UCP (e, conseqüentemente, de todo um sistema de computação) que se contrapõe à arquitetura até então predominante, denominada CISC – Complex Instruction Set Computer, ou computador com conjunto complexo de instruções.
Praticamente todos os microprocessadores lançados no mercado, desde os primeiros até os atuais processadores, têm sua arquitetura especificada do modo característico CISC, isto é, uma grande quantidade de instruções com variedade de modos de endereçamento, poucos registradores de dados na UCP e processamento controlado por microprograma.
No entanto, o conceito de arquitetura RISC vem se tornando de interesse crítico para todo grande fabricante de computadores. O desenvolvimento de sistemas com arquitetura RISC começou no fim da década de 70, na Universidade de Stanford, e no princípio dos anos 80 na IBM. A motivação básica para as pesquisas sobre o assunto era baseada na idéia que alguns cientistas tinham de que os programas não estavam fazendo o uso mais eficiente possível do hardware à sua disposição.
Características das arquiteturas RISC
§ Menor Quantidade de Instruções
Talvez a característica mais marcante de um sistema RISC seja a sua tendência a possuir um conjunto de instruções menor que o das máquinas CISC de mesma capacidade. Daí o nome da arquitetura (RISC – computadores em conjunto reduzido de instruções).
Com menor quantidade de instruções e com cada uma delas tendo sua execução otimizada, o sistema deve produzir seus resultados com melhor desempenho, mesmo considerando-se que uma menor quantidade de instruções vá conduzir a programas um pouco mais longos.
§ Execução Otimizada de Chamada de Funções
Outra característica importante da arquitetura RISC, que a distingue da arquitetura CISC, refere-se ao modo de realizar chamadas de rotinas e passagem de parâmetros. Os estudos sobre comportamento dos programas revelaram que chamadas de funções (que consomem razoável tempo do processador) requerem usualmente poucos dados, mas consomem, na transferência, demorados acessos à memória em leituras e escritas. Enquanto em máquinas CISC a chamada de funções conduz a operações de leitura / escrita com a memória para passagem de parâmetros e recuperação de dados, nas máquinas com arquitetura RISC isto ocorre basicamente no processador, utilizando-se para isso mais registradores que as máquinas CISC; os parâmetros e variáveis são manuseados na própria UCP. A possibilidade de colocação de mais registradores na UCP é possível devido à redução dos circuitos necessários à decodificação e execução de instruções (porque há menor quantidade delas).
Com isso, o desempenho total do processador melhora, já que executa mais otimizadamente as chamadas de funções e estas ocorrem em quantidade apreciável na média dos programas.
§ Menor Quantidade de Modos de Endereçamento
Para facilitar o trabalho dos compiladores, o conjunto de instruções de máquinas CISC tende a possuir muitos modos de endereçamento. Uma simples instrução de soma pode ser realizada com os operandos localizados de diversos modos: podem-se somar valores que estão armazenados em registradores; outra instrução pode realizar a mesma soma, porém com um operando na memória e outro em um registrador, ou ainda uma outra instrução pode realizar a operação de soma com os dois operandos armazenados na memória.
No caso das máquinas RISC, a busca por soluções mais simples conduziu à criação, de um modo geral, de apenas dois tipos de instruções: LOAD / STORE, para acesso à memória, utilizando somente o modo direto e demais operações no processador (as operações matemáticas). Esta técnica simplifica consideravelmente o projeto e a implementação das instruções, reduzindo ainda mais os ciclos de relógio necessários à sua realização.
§ Modo de Execução com “Pipelining”
Projetar processadores que executam várias instruções quase que totalmente em paralelo é uma técnica bastante eficaz para acelerar o desempenho dos processadores, reduzindo o tempo de execução das instruções para poucos ciclos.
“Pipelining” é utilizado em larga escala em arquiteturas RISC (e, já algum tempo, máquinas CISC também estão empregando esse método). O objetivo do projeto dos processadores RISC tem sido, no que se refere a esta área, completar a execução de uma instrução a cada ciclo de relógio.
A tabela da figura 1 apresenta um resumo das características básicas das arquiteturas RISC, que as distinguem da CISC e contribuem para melhor desempenho do hardware em termos gerais.
Característica |
Considerações |
Menor quantidade de instruções que as máquinas CISC |
§ Simplifica o processamento de cada instrução e torna este item mais eficaz.
§ A maioria das instruções é realizada em 1 ciclo de relógio, o que é considerado o objetivo maior dessa arquitetura.
|
Execução otimizada de chamada de funções |
§ As máquinas RISC utilizam os registradores da UCP (em maior quantidade que os processadores CISC) para armazenar parâmetros e variáveis em chamadas de rotinas e funções. Os processadores CISC usam mais a memória para a tarefa. |
Menor quantidade de modos de endereçamento |
§ As instruções de processadores RISC são basicamente do tipo Load/Store, de desvio e de operações aritméticas e lógicas, reduzindo com isso seu tamanho.
§ A grande quantidade de modos de endereçamento das instruções de processadores CISC aumenta o tempo de execução das mesmas. |
Utilização em larga escala de “pipelining” |
§ Um dos fatores principais que permite aos processadores RISC atingir seu objetivo de completar a execução de uma instrução pelo menos a cada ciclo de relógio é o emprego de “pipelining” em larga escala. |
Observações a respeito de CISC x RISC
Embora haja atualmente um número razoável de adeptos das máquinas que possuem arquitetura RISC, também há, e em grande quantidade, aqueles que relacionam diversas desvantagens desses processadores, advogando em favor da arquitetura CISC.
Vários podem ser os temas para discussão sobre RISC x CISC, um dos quais se refere ao desempenho do processador na execução de um programa. Em princípio, os defensores da arquitetura CISC propugnam que instruções mais complexas redundarão em código objeto menor (as instruções de máquina, sendo mais complexas, se aproximam em definição dos comandos da linguagem de alto nível que está sendo compilada), o que reduz o consumo de memória (menos instruções) com reflexos no custo do sistema.
Isso não é necessariamente correto se considerarmos que uma menor quantidade de instruções nem sempre acarreta menor quantidade de bits (e é a quantidade efetiva de bits que consome menos memória e a menor custo). Se cada instrução CISC possuir mais operandos que as instruções RISC e se cada um de seus operandos ocupar uma boa quantidade de bits na instrução, então poderemos ter um programa CISC maior em bits do que um programa em máquina RISC, apesar de o programa para o processador RISC possuir maior quantidade de instruções. Por exemplo, um programa escrito para rodar em um processador CISC pode gastar 150 instruções de máquina; cada uma das instruções possui código de operações de 8 bits, podendo ser de um, de dois e três operandos. Cada campo operando ocupa 18 bits e ainda há um campo para outras ações, com 4 bits de tamanho. Em média, as instruções têm um total de 50 bits. Um programa para realizar o mesmo problema, escrito para rodar em um processador RISC, pode ter 220 instruções, que em média ocupam 32 bits. As instruções são, em sua esmagadora maioria, de dois operandos, porém os operandos são valores em registradores e, por isso, as instruções não consomem muitos bits para endereçar os dois registradores. Como há relativamente poucas instruções, elas têm um campo código de operação de 6 bits. O programa para a máquina CISC gastaria 7.500 bits, enquanto o programa para a máquina RISC, mesmo possuindo mais 70 instruções que o do processador CISC, consumiria 7.040 bits. Trata-se, evidentemente, de um exemplo simples porém elucidativo, porque os valores apresentados estão próximos da realidade das máquinas atuais.
Outro ponto de debate se refere à rapidez da execução de um programa. Os defensores da arquitetura CISC alegam que estas máquinas executam mais rapidamente os programas escritos em linguagem de alto nível devido à pouca quantidade de códigos binários executáveis. No entanto, o tempo que cada instrução leva para ser executada nem sempre conduz à confirmação dessa assertiva.
Máquinas RISC tendem a executar instruções bem mais rápido porque:
a) as instruções possuem campo operando com menor quantidade de bits (pois o conjunto de instruções é menor) e, portanto, o tempo de decodificação é menor que o das máquinas CISC;
b) as instruções são executadas diretamente pelo hardware e não por um microprograma. Conquanto um processador microprogramado traga mais flexibilidade ao projeto das máquinas, ele também acarreta uma sobrecarga adicional de interpretação de cada instrução. Máquinas RISC não são microprogramadas e, assim, tendem a executar as instruções de modo mais rápido.
Processadores RISC são também otimizados para operações de uma única tarefa devido ao grande número de registradores que possuem e à grande quantidade de estágios de “pipelining”. Nesses casos, a melhor maneira de obter um bom desempenho dos processadores RISC é executar um programa de teste (um “benchmark”), o qual possui exatamente esta característica: um grande número de operações similares, em uma única tarefa. Interessados em processamento científico podem se apoiar mais nesses programas de teste porque o processamento que fazem é similar ao dos programas usuais de teste. Mas o mesmo não se pode dizer de programas comerciais, que utilizam muita Entrada / Saída (tarefa que, por exemplo, os programas de teste não realizam).