segunda-feira, 15 de agosto de 2011

Como tudo funciona

Para entender o que faz o Athlon ser mais rápido do que os processadores anteriores da AMD, nada melhor que fazer uma viagem pela maneira como ele processa instruções. 

Vamos lá:
 
Até certo ponto, tanto o Pentium III quanto o Athlon e outros processadores x86 actuais trabalham da mesma maneira. Internamente, o processador é capaz de executar apenas instruções simples, para ser mais exacto apenas quatro instruções: adição, atribuição, leitura e gravação.

Se já estudou alguma linguagem de programação, aprendeu a importância das variáveis, que são pequenos espaços de memória reservados para guardar algum tipo de dado. Existem vários tipos de variáveis, de 8, 16, 32 bits, etc. que mudam de nome dependendo da linguagem de programação usada. A instrução de atribuição do processador é usada sempre que é necessário criar ou alterar o valor de uma variável.

Por exemplo, imagine que um programa qualquer criou uma variável de 8 bits com o número 5. A próxima instrução manda que o programa compare o valor da variável com o número 6 e, caso o número seja menor, altere o valor para 9. Como 5 é menor que 6, o programa decide fazer a alteração, utilizando a operação de atribuição do processador, que lê o valor 9 e grava-o no espaço de memória da variável, que passa a ter o valor 9 ao invés de 5.

A instrução de soma é a operação básica que permite fazer todo tipo de processamento, enquanto as instruções de leitura e gravação permitem mover os dados. Basicamente é só isso que o processador sabe fazer. Operações mais complexas, são executadas através da combinação de várias instruções simples.

Para calcular uma multiplicação, por exemplo, o processador utilizará sequencialmente várias operações de soma. Na verdade, dentro do processador todas as operações, mesmo as mais complexas, são calculadas com base em várias operações de soma, feitas entre os valores binários processados pelo processador. Uma operação de subtracção é conseguida através de uma operação de atribuição, que transforma um dos valores em negativo, seguida por uma operação de soma. Mais com menos dá menos, a regra que aprendemos na primária e que os projectistas aprenderam a utilizar nos processadores.

Uma operação de divisão é conseguida executando-se uma sequência de operações de subtracção e todas os demais cálculos, mesmo os cálculos mais complexos, executados pelo coprocessador aritmético, são resolvidos usando apenas as quatro operações, obtidas a partir da simples instrução de soma.
 
Não é à toa que todos cursos superiores ligados à programação incluem aulas de matemática no currículo. A programação, principalmente em linguagens de baixo nível é baseada em matemática.

Pois bem, o conjunto de instruções x86, utilizadas pelos programas e com as quais qualquer processador destinado a microcomputadores PC deve ser compatível, é composto tanto por instruções simples (soma, subtracção, leitura, gravação, comparação, etc.) quanto por instruções muito complexas, que devem ser quebradas em várias instruções simples para que possam ser executadas pelo processador.

Excluindo-se componentes de apoio, como o cache L1, deixando apenas a parte “funcional” do processador, podemos dividir o processador em três partes.
 
A primeira parte é o descodificador de instruções. Este componente tem a função de converter as instruções x86 usadas pelos programas nas instruções simples que podem ser executadas pelo processador. As instruções simples vão então para uma unidade de controle, que organiza as instruções da forma que possam ser executadas mais rapidamente. As instruções formam então uma fila, (scheduler) a fim de permitir que a unidade de controle tenha tempo de fazer ser trabalho. Lembre-se que os processadores actuais são superescalares, executam várias instruções por ciclo, simultâneamente, o que torna essencial a existência de algum circuito que as coloque numa ordem em que a execução de uma não dependa do resultado da execução de outra.

Finalmente, temos as unidades de execução, onde as instruções preparadas e organizadas são finalmente processadas. Veja que todos os circuitos trabalham simultâneamente, visando que as unidades de execução sempre tenham algo para processar.
É mais ou menos como numa fila de banco, onde aparecem várias pessoas com vários tipos de tarefas, como contas para pagar, depósitos, querendo sacar dinheiro, tirar extractos, etc. Algumas pessoas querem fazer apenas uma operação (pagar apenas uma conta por exemplo), enquanto outras querem fazer várias operações (sacar dinheiro, pagar uma conta, depois depositar um cheque, etc.). Para evitar tumulto, é formada uma fila, onde cada um aguarda a sua vez e ir ao caixa e fazer o que deseja. No processador temos um cenário parecido, as unidades de execução são os caixas, onde tudo é realmente feito, enquanto os demais componentes tem a função de organizar a fila e fazer com que cada um se dirija ao caixa apropriado.

Poderíamos então dividir o processador em duas partes:

A parte da frente, ou front-end, é composta por todos os circuitos que descodificam e ordenam as instruções dos programas. Isto inclui o descodificador de instruções, a unidade de controle, e também os registradores e o cache. A parte de trás, ou back-end, seria então composta pelas unidades de execução, onde realmente são processadas as instruções.

Cada uma das duas partes é igualmente importante. As unidades de execução devem ser capazes de processar o máximo de instruções possível, enquanto o front-end composto pelos demais componentes, tem a função de preparar as instruções o mais rápido possível, de modo que as unidades de execução permaneçam ocupadas todo o tempo.

A lógica é que quanto mais unidades de execução tivermos trabalhando ao mesmo tempo, mais instruções todas juntas serão capazes de processar e quanto mais circuitos de descodificação e controle tivermos, mais eficiente será a descodificação das instruções, resultando em um processador mais rápido.

in Manual de Hardware Completo
de Carlos E Marimoto

Sem comentários: