ORGANIZAÇÃO DE COMPUTADORES MÓDULO 8
Índice 1. A Organização do Computador - Continuação...3 1.1. Processadores - II... 3 1.1.1. Princípios de projeto para computadores modernos... 3 1.1.2. Paralelismo... 4 2
1. A ORGANIZAÇÃO DO COMPUTADOR - CONTINUAÇÃO 1.1. PROCESSADORES - II 1.1.1. 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 se trata 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 ao 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 a seguir não seja mais aplicado. Todas as instruções são executadas diretamente pelo hardware No passado houve uma tendência de design de computadores que adicionava uma camada de software entre o hardware e o conjunto de instruções, providenciando um novo nível de interpretação. Esse tipo de implementação é chamado de microcódigo e oferecia algumas vantagens como a possibilidade de incluir ou alterar instruções sem alterar o hardware. Apesar de prover mais flexibilidade, esse 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 compensa as novas instruções que possam 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 isso. 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 ser tomado para que não seja alterada a ordem de execução do programa. As 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. 3
Por esse 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, consequentemente, o tempo de processamento será otimizado. Somente load e store devem referenciar a memória 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 pode se tornar imprevisível. Por esse 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 esse 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. 1.1.2. Paralelismo Conforme vimos, um dos melhores recursos para otimizar a velocidade de processamento de um computador é a capacidade de executar várias atividades ao mesmo tempo. Existem várias formas de implementar paralelismo, no nível de instrução e no nível de processador. A seguir 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 uma instrução estiver em execução, os passos iniciais da próxima instrução poderão ser executados. Na figura a seguir temos o 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 estarão em execução. 4
Figura 19. 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 serem executadas. Ao executar certas instruções, como as que leem ou gravam na memória principal, o tempo de execução é maior que em 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 a seguir temos o 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. 5
Figura 20. Exemplo de arquitetura superescalar. Esses 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. Esse 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 é aquele com um grande número de processadores que executam o mesmo conjunto de instruções em conjuntos diferentes de dados. Esse tipo de arranjo encontra uso em aplicações científicas, em que um grande conjunto de dados deve ser submetido a um mesmo conjunto de fórmulas. Ele não é comum em computadores comerciais, mas muitos supercomputadores (especialmente os fabricados pela Cray Computing) usam um tipo especial de arranjo desse tipo, chamado processador vetorial. 6