O Pentium

Como comentei, o Pentium possui duas unidades de execução. A primeira (pipe U) é uma unidade completa, capaz de processar qualquer instrução, enquanto a segunda (pipe V) é uma unidade simplificada, capaz de processar apenas instruções simples (basicamente as mesmas que no 486 podem ser executadas em um único ciclo de clock). Como as instruções complexas são mais raras e quase sempre usadas em combinação com várias instruções simples, esse design permitiu que o Pentium atingisse o objetivo de processar duas instruções por ciclo sem que fosse necessário aumentar tanto a complexidade do núcleo.

Diferente dos processadores atuais, que usam sistemas bem mais complexos de decodificação e reorganização de instruções, com o objetivo de manter as unidades de execução ocupadas na maior parte do tempo, o Pentium continua processando as instruções diretamente (como no 486) e na ordem original, mantendo a simplicidade.

Esta abordagem é chamada de processamento ordenado (in-order) e é atualmente usada em processadores de baixo consumo, como a Atom e os processadores ARM. Ela permitiu que o Pentium fosse construído com apenas 3.1 milhões de transístores (um processador atual utiliza 200 ou 300 milhões, sem contar os caches) e fosse relativamente econômico do ponto de vista do consumo elétrico.

Continuando, o uso da arquitetura superescalar trouxe um novo problema, que é a divisão do trabalho entre as unidades de execução, já que os aplicativos continuam sendo compostos por comandos sequenciais, com o uso de muitas operações de tomada de decisão, onde o processador precisa primeiro concluir a execução de uma instrução para saber qual caminho seguir e poder assim executar as seguintes.

Para solucionar o problema foi adotado o uso de um circuito de branch prediction, encarregado de dividir as instruções entre as duas unidades e antecipar o processamento de instruções, de forma a manter ambas ocupadas na maior parte do tempo.

Em uma operação de tomada de decisão (se, então, senão), por exemplo, uma das unidades de execução processaria a primeira instrução (o “se”), enquanto a outra adiantaria o processamento das instruções de um dos caminhos possíveis, escolhido pelo circuito de branch prediction com base na sua tabela interna de possibilidades.

Sempre que o caminho correto é escolhido, o processador ganha tempo (já que aproveita o trabalho executado). Por outro lado, quando o circuito de branch prediction erra a previsão, o processador precisa descartar o trabalho realizado, limpar o pipeline e começar novamente a partir do caminho correto.

O circuito de branch prediction do Pentium era relativamente simples, projetado para examinar o código em busca de algumas funções específicas e tomar decisões pré-programadas, o que resultava em um índice de acerto de 60 a 80%. Nos processadores atuais (que usam três ou mais unidades de execução e pipelines muito mais longos) o circuito de branch prediction é muito mais complexo e trabalha com índices de acerto muito mais altos, acima de 95%. Isso é necessário pois com pipelines mais longos, a penalidade pelos erros nos processadores atuais é muito maior que na época do Pentium, que usava um pipeline de apenas 5 estágios.

Outra mudança trazida pelo Pentium foi a adoção de caches separados para dados e instruções. Diferente do 486, que usava um único bloco de cache L1 para tudo, o Pentium adotou o uso de dois blocos separados de cache L1 (de 8 KB cada um, totalizando 16 KB) para dados e instruções. Isso melhorou a eficiência do cache (em relação ao cache unificado do 486), permitindo que o processador consiga acessar instruções e os dados necessários (para executá-las) simultaneamente, em vez de precisar fazer duas operações separadas.

Além do aumento no tamanho, o cache L1 passou a ser acessado através de um barramento interno de 512 bits (256 bits para o cache de dados e mais 256 para o de instruções), contra apenas 128 bits no 486. Assim como no 5×86 da AMD, passou também a ser utilizado cache write-back, que também cacheava as operações de escrita. O cache usado no 486 cacheia apenas as operações de leitura, o que permite ao processador ganhar tempo ao ler dados, mas não ajuda na hora de gravar, situação onde o processador tinha que esperar pela memória RAM.

Com a popularização dos games e aplicativos 3D de uma forma geral, o desempenho do processador em ponto flutuante passou a ser cada vez mais importante. Combinado com as melhorias no cache, foi desenvolvido um co-processador aritmético cerca de 5 vezes mais rápido que o usado no 486, que adotou o processamento de instruções em estágios, assim como nas unidades de execução de inteiros. O co-processador do Pentium era tão rápido (comparado com outros processadores da época), que mesmo um K6-2 perdia para um Pentium da mesma frequência em jogos e aplicativos muito dependentes de cálculos de ponto flutuante.

A arquitetura do Pentium continua via até os dias de hoje na forma do Atom, que é essencialmente um Pentium modernizado, com um pipeline mais longo, suporte às instruções SSE e capaz de operar a frequências de clock mais altas.

7dc4b03c 2e409307

Pentium 100 com o encapsulamento de cerâmica e uma foto do die do processador

Sobre o Autor

Redes Sociais:

Deixe seu comentário

X