Buscar

Organização de Computadores

Prévia do material em texto

MÓDULO 3 :
Princípios de projeto para computadores modernos
Os computadores modernos compartilham uma série de características de design que visam maximizar o seu desempenho. Não importa se trata-se de um computador de mão ou um computador para fins científicos, sempre se deseja a maior velocidade de processamento possível.
É claro que estas linhas se aplicam no estado atual da tecnologia.
Atualmente estamos sujeitos a certas limitações como velocidade de clock, quantidade de transistores que podem ser embutidos em uma pastilha de silício e outras.
Se o cenário tecnológico atual se alterar, talvez algum dos pontos abaixo não seja mais aplicado.
Todas as instruções são executadas diretamente por hardware
Já houve tendências que adicionavam uma camada adicional entre o hardware, providenciando um novo nível de interpretação. Este tipo de implementação é chamado de microcódigo e apesar de prover mais flexibilidade, fornecendo uma quantidade maior de instruções sem que seja necessário acrescentar novos elementos de hardware este tipo de design não é considerado uma boa prática. O nível adicional de tradução acarreta uma perda de desempenho, que não compensava as novas instruções que pudessem ser adicionadas.
Em resumo, a recomendação é que as instruções correspondam diretamente a elementos de hardware, sem que haja níveis adicionais de tradução.
Maximize a taxa de execução de instruções
Um dos caminhos para se maximizar a performance do computador é maximizar a taxa de execuções de instruções por segundo.
Existem vários meios para se conseguir isto: um é simplesmente aumentar a velocidade de clock do computador.
Outra forma é fazer com que o processador realize atividades em paralelo. Se um computador puder realizar duas instruções em paralelo, ele terá teoricamente um desempenho duas vezes superior a um computador sem paralelismo.
Neste design, um cuidado especial deve tomado para que não seja alterada a ordem de execução do programa.
Instruções devem ser fáceis de decodificar
Conforme visto anteriormente, o ciclo de execução de instruções tem impacto direto na velocidade de processamento do computador como um todo.
Se o tempo de tradução de uma instrução for demorado, o tempo de execução como um todo será degradado.
Por este motivo, uma instrução não deve ter muitas opções de execução ou formatos alternativos. Se a instrução tiver poucos formatos, o tempo de identificação da instrução será reduzido e conseqüentemente o tempo de processamento será otimizado.
O acesso à memória principal é uma operação demorada, sob a ótica da velocidade do processador, é claro.
Se muitas instruções tiverem acesso direto à memória principal, o tempo de execução das instruções podem se tornar imprevisível.
Por este motivo, é recomendado que apenas as instruções LOAD (leitura) e STORE (gravação) tenham acesso à memória.
Providencie bastantes registradores
Se o processador não tiver um registrador para armazenar um valor resultante, ele terá que transferir este valor para a memória principal.
Conforme já vimos, a transferência de dados entre o processador e a memória principal é um processo mais lento que a movimentação de dados dentro do processador.
Se o processador não tiver registradores suficientes, o tempo de processamento será degradado.
O registrador mais importantes é o Contador de Instruções (ou PC - Program Counter) que aponta sempre para a próxima instrução a ser executada.
Em função de estarem dentro do processador, podem ser lidos e escritos a uma velocidade bastante alta.
Exemplos: Program Counter  (PC): armazena o endereço da próxima instrução; Registrador de Instruções (IR): armazena instrução que está sendo executada; Pentium II: registradores de uso geral de 32 bits (EAX, EBX, ECX, EDX, ...), registradores de segmentos de 16 bits (CS, DS, ...), registrador FLAGS (PSW - Program Status Word), e EIP (PC, 32 bits).
Paralelismo
Conforme vimos, uma dos melhores recursos para otimizar a velocidade de processamento de um computador é a capacidade de executar vários atividades ao mesmo tempo.
Existem várias formas de implementar paralelismo, no nível de instrução e no nível de processador.
Em seguida descreveremos cinco formas de paralelismo. Pipelining e arquiteturas superescalares são exemplos de paralelismo no nível de instrução. Computadores matriciais, multiprocessadores e multicomputadores são exemplos de paralelismo no nível de processador.
 
Pipelining
O processo de decodificação e execução de instruções, como foi visto anteriormente, é um elemento crítico no desempenho do computador.
Se o processo de identificação e execução de uma instrução puder ser modularizado, haverá um ganho de performance, pois enquanto um instrução estiver em execução, os passo iniciais da próxima instrução poderão ser executados.
Na figura abaixo temos um exemplo de um pipeline de cinco estágios. Cada instrução passará por cinco módulos antes de ser concluída.
Observe que quando a instrução 1 for concluída, as instruções 2, 3, 4 e 5 estão em execução.
 
Exemplo de um pipeline de cinco estágios
 
Arquiteturas Superescalares
O princípio da arquitetura superescalar é que nem todas as instruções demoram o mesmo tempo para ser executadas.
Ao executar certas instruções, como que lêem ou gravam na memória principal, o tempo de execução é maior que instruções que acessem apenas dados dentro do processador (armazenados em registradores).
Se o módulo de execução pudesse executar várias tarefas em paralelo, o tempo de execução das instruções mais lentas seria compensado pela execução de outras instruções.
Na figura abaixo temos um exemplo de uma arquitetura superescalar com duas ALU, uma unidade para tratar operações de ponto flutuante e um módulo para ler e outra para gravar na memória principal.
Novamente deve ser tomado cuidado neste tipo de design, para que as instruções sejam executadas na ordem correta.
 
 
Exemplo de arquitetura superescalar
Estes dois tipos de paralelismo são implementados dentro do processador, ou seja, não dependem de mais de um processador. Os designs seguintes dependem de vários processadores.
Sempre existe demanda por processadores mais rápidos, mas em muitos casos é mais simples e barato dispor de vários processadores que trabalhem harmonicamente do que tentar conseguir um único processador mais rápido.
Este tipo de conclusão já chegou até os computadores de uso comercial e doméstico, com as configurações com processadores de dois, três, quatro ou mais núcleos.
Computadores Matriciais
Um computador matricial é um computador com um grande número de processadores que executam o mesmo conjunto de instruções em conjunto diferentes de dados.
Este tipo de arranjo encontra uso em aplicações científicas, onde um grande conjunto de dados deve ser submetido a um mesmo conjunto de fórmulas.
Este tipo de arranjo não é comum em computadores comerciais, mas muitos supercomputadores (especialmente os fabricados pela Cray Computing) usam um tipo especial de arranjo deste tipo, chamado processador vetorial.
Multiprocessadores
Uma forma simples de aumentar a capacidade de processamento de um computador é adicionar outro processador.
Esta é a idéia do multiprocessador, mas isso não é tão simples.
Sempre que fazemos algum tipo de paralelismo, deve haver alguma figura fazendo a arbitragem das tarefas que serão executadas por cada processador.
Além disso, no multiprocessador, todas CPUs compartilham uma mesma quantidade de memória.
O acesso a esta memória deve ser controlado também, para que um processador não tente utilizar um espaço que esteja sendo usado por outro.
Normalmente esta função é desempenhada pelo Sistema Operacional.
Multiprocessador com barramento único
A maioria dos Sistemas Operacionais de mercado atualmente tem alguma capacidade de multiprocessamento.
Atualmentem, a velocidade de processamento dos microprocessadores não é mais limitada pela velocidadedos pulsos eletrônicos, ou pela velocidade de chaveamento dos microcomponentes. Mas sim pela capacidade de dissipar o calor. Quanto maior a frequência do clock, mais instruções são executadas por segundo. Entretanto cada instrução executada é uma sequência de sinais de controle, ativados pela unidade de controle do processador, selecionando circuitos específicos na ULA, por exemplo. Então, a execução de uma instrução requer diversos chaveamentos de microcircuitos. Um chaveamento significa uma transição de nível alto para baixo ( 0 para 1 ou o oposto ). Com a atual tecnologia microeletrônica, a corrente elétrica aumenta nessa transição de estado. Portanto, quanto maior a frequência de clock, maior a taxa de chaveamento dos microcircuitos, e maior a corrente média que o processador consome. Quanto mais corrente alimenta o processador, mais potência ele dissipa na forma de calor.
Quando a temperatura em um processador atinge um certo limite, ele deixa de responder de forma confiável, podendo chegar inclusive a queimar.
É por causa disso que, microprocessadores que funcionam a altas frequências de clock requerem equipamentos para dissipar o calor, como ventoinhas, por exemplo, para irradiar o calor. Quando alguém aumenta a frequência de clock de um microprocessador além do limite tolerável, precisa melhorar a dissipação para que o microprocessador trabalhe de forma confiável. Podendo realizar uma refrigeração a água ou até mesmo com nitrogênio líquido.
Quando menor o chip do microprocessador ou quanto menor é o dispositivo no qual ele é montado, pior é a situação no que se refere a realizar um bom arrefecimento ( dissipação do calor ). Porque não há muito espaço para ventilação. Esse é o caso dos notebooks, por exemplo, em que é preferível usar um suporte com ventoinha.
A tecnologia de microeletrônica atual atingiu um nível em que não é viável melhorar a taxa de execução de instruções sem aumentar o aquecimento. A solução encontrada pelos projetistas foi distribuir os processadores em vários núcleos ( Cores ). Desse modo, é possível duplicar ou quadruplicar o processamento sem precisar aumentar a frequência do clock em um nível proibitivo.
Isso é possível porque a potência dissipada é uma função que aumenta mais com a taxa de execução de instruções do que simplesmente elevar o número de núcleos de processamento operando em paralelo. Duplicar a frequência do clock faria o processador trabalhar duas vezes mais rápido, mas a potência dissipada é cerca de quatro vezes maior. Além do consumo de energia, há o problema de dissipar o calor. Duplicar o número de processadores em um computador quase duplica a taxa de processamento, sendo que apenas duplica a dissipação de potência.
Portanto a tendência atual para aumentar a computabilidade por meio do paralelismo. Compensa mais ter muitos núcleos de processamento em um único computador, ou até muitos computadores conectados em rede e trabalhando em conjunto do que ter um único supercomputador. É possível ter o mesmo benefício em termos de poder de processamento a um custo mais baixo, e com uma viabilidade tecnológica maior.
Multicomputadores
A diferença entre o multicomputador e o multiprocessador é que no multicomputador cada CPU tem uma memória local só é acessada por aquele processador.
Multicomputador com memórias locais
No multicomputador, pode ou não haver uma quantidade de memória compartilhada entre os processadores.
Um dos problemas destes tipos de arranjos é conectar todos os processadores à memória. Por este motivo, muito projetistas abandonam a idéia da memória compartilhada e criam computador apenas com processadores com memórias privadas.
Este tipo de arranjo normalmente é chamado de fracamente acoplado, em contraste com o arranjo fortemente acoplado que é o multiprocessador.

Continue navegando