Entendendo a arquitetura

Enquanto o K6 era capaz de processar duas instruções de inteiros e uma instrução de ponto flutuante por ciclo (assim como no Pentium Pro e Pentium II) o Athlon adotou o uso de três unidades de inteiros e três unidades de ponto flutuante, combinadas com um enorme cache L1 de 128 KB e um circuito de branch prediction consideravelmente aprimorado, com um histórico de 2048 entradas. Tecnicamente, o Athlon original era bastante superior ao Pentium III, mas demorou um pouco até que a plataforma (chipsets e placas-mãe) amadurecesse, permitindo que o processador demonstrasse todo o seu potencial.

Temos aqui duas ilustrações da AMD, mostrando um diagrama de blocos do Athlon e a distribuição física dos componentes dentro do processador:

m17930482

m1d4680a8

Veja que a foto está dividida em pequenos retângulos, cada um mostrando a área ocupada por cada componente do processador. Infelizmente tudo está em inglês, mas aqui vai uma breve legenda dos componentes mais importantes (na ordem em que cada componente aparece na ilustração, começando de cima)

Floating Point Execution Units: São as unidades de execução de ponto flutuante, a parte fundamental do coprocessador aritmético, onde são processadas as instruções de ponto flutuante usadas em jogos e diversos outros tipos de aplicativos. O Athlon incluía suporte também a uma versão aprimorada do 3D-Now (com 19 novas instruções), mas ele acabou não sendo muito usado devido à introdução do SSE.

Floating Point Control e Floating Point Scheduler: Estes são os dois componentes encarregados de examinar e reorganizar as instruções destinadas ao coprocessador, adiantando o processamento de instruções sem dependências e assim por diante, permitindo que as unidades de execução possam processar três instruções por ciclo mesmo que o código do aplicativo seja serializado.

LS2 e LS1: Estes dois blocos correspondem às unidades de leitura e gravação (Load Store), que são responsáveis pelo acesso ao cache, incluindo as operações de leitura e gravação e o processamento dos algoritmos que decidem quais dados serão mantidos e quais serão descartados. Pode parecer estranho que os circuitos de apoio consumam quase tanto espaço no processador quanto o próprio cache, mas sem eles o cache seria inútil.

64 Kbyte Data Cache: Assim como em outros processadores atuais, os 128 KB de cache L1 do Athlon são divididos em dois blocos, para dados e instruções, cada um com 64 KB. Esta divisão meio a meio melhora a velocidade de acesso, pois permite que os dois blocos sejam acessados simultaneamente. O Data Cache é a metade que armazena dados.

Instruction Control Unit: Circuito que controla o envio de instruções para as unidades de execução de inteiros. Também ordena as instruções, de forma que possam ser processadas mais rápido.

Integer Execution Unit: Posicionado bem no centro do processador, este é o bloco que inclui as unidades de execução de inteiros, que é são o componente mais fundamental de qualquer processador. A versão original do Athlon utilizava um pipeline bastante curto, com apenas 10 estágios. Isso ajudava no desempenho por ciclo, já que reduzia a penalidade por previsões incorretas do circuito de branch prediction, mas em compensação limitava a frequência de operação do processador, o que levou a AMD a aumentar o número de estágios nos processadores seguintes.

MENG/EDEC e Scan/Align: Estes dois componentes correspondem a parte do pipeline de processamento das instruções, executando os passos que antecedem o processamento propriamente dito. O blogo MENG/EDEC corresponde à engine com o microcódigo do processador, que se encarrega de decodificar as instruções, enquanto o Scan/Align tem a função de verificar e ordenar as instruções da fila. Eles trabalham em conjunto com o LS1/LS2, que carregam os dados que serão necessários para o processamento a partir do cache.

Bus Interface Units: É por aqui que os dados entram e saem do processador. Controla a comunicação do processador com o chipset e com os demais componentes do micro.

64 Kbyte Instruction Cache: É o segundo bloco do cache L1, que armazena instruções.

Branch Prediction: Apesar de ser composto por um volume relativamente pequeno de transistores se comparado a outros componentes, o circuito de branch prediction é um dos componentes mais importantes de qualquer processador atual, permitindo que o processador adiante o processamento das instruções seguintes sempre que encontra uma operação de tomada de decisão. Devido ao ritmo frenético de processamento, o circuito de branch predicition é também o responsável por uma grande parte do consumo elétrico do processador.

Predecode Array: Esta é a porta de entrada do processador. O predecore array é composto pelos circuitos que convertem as instruções x86 enviadas pelos programas nas instruções simples que o processador executa internamente.

Embora os dois processadores tenham sido desenvolvidos de forma independente (o Athlon descende do K6, que por sua vez descente do trabalho dos engenheiros da NexGen), existem muitas similares entre a forma como o Athlon e o Pentium II/III processa as instruções, já que ambos surgiram como resposta ao mesmo problema: como processar de forma paralela (várias unidades de execução trabalhando simultaneamente) o código serializado dos aplicativos x86.

Em ambos os casos, a solução foi passar a utilizar um design post-RISC, combinando o uso de unidades de execução capazes de processar apenas instruções simples (filosofia RISC) com outros circuitos de apoio, encarregados de converter e reorganizar as instruções x86.

Internamente, o processador é capaz de executar apenas instruções simples, para ser mais exato apenas quatro instruções: adição, atribuição, leitura e gravação. Todas as outras operações são derivadas de combinações destas quatro operações, de forma similar à Curta (leia mais sobre ela no https://www.hardware.com.br/dicas/historia-secreta.html), onde você girava a manivela várias vezes (repetição da operação de soma) para obter uma multiplicação.

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. Assim como na Curta, o processador usa várias operações de soma para obter uma multiplicação.

Uma operação de subtração é obtida através de uma operação de atribuição, que transforma um dos valores em negativo, seguida por uma operação de soma, enquanto uma operação de divisão é obtida executando-se uma sequencia de operações de subtração. Todas as demais funções oferecidas pelo processador (mesmo os cálculos mais complexos, executados pelo coprocessador aritmético), são resolvidos usando apenas as quatro operações, obtidas a partir das simples instruções de soma e atribuição que o processador aplica aos valores binários que são processados.

Dentro do processador, as instruções x86 são primeiro decodificadas, ou seja, convertidas em sequências de instruções simples (trabalho que no Athlon é feito pelo MENG/EDEC do diagrama) e em seguida ordenadas (Scan/Align no diagrama), em uma ordem em que (sempre que possível) uma instrução não dependa da outra e o processador possa manter todas as unidades de execução ocupadas.

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 decodificação e controle tivermos, mais eficiente será a decodificação das instruções, resultando em um processador mais rápido.

O maior limitante é que a maioria dos aplicativos são desenvolvidos esperando que o processador processe uma instrução de cada vez. Temos também um grande número de operações de tomada de decisão, onde o processador precisa resolver uma determinada operação para então poder decidir o que vai fazer depois. Graças aos circuitos de branch prediction, os processadores são capazes de ir “adiantando o serviço”, processando outras instruções mais adiante, enquanto a operação de tomada de decisão é solucionada. De qualquer forma, existe um limite para quanto trabalho o processador é capaz de executar por ciclo.

Com mais do que três ou quatro unidades de execução, o processador acaba ficando ocioso grande parte do tempo, de forma que processadores muito mais complexos do que isso acabariam sendo um desperdício de recursos.

Em vez de adicionar mais e mais unidades de execução aos processadores, os fabricantes passaram, a partir de um certo ponto, a desenvolver processadores dual-core e quad-core, onde temos dois ou quatro processadores no mesmo encapsulamento, trabalhando como se fossem um único processador. Isto resulta num melhor desempenho ao rodar vários aplicativos simultaneamente (você pode jogar e ripar um DVD ao mesmo tempo, por exemplo) e é muito mais simples e barato para os fabricantes do que desenvolver um único super-processador com dezenas de unidades de execução. Como atualmente é comum manter um grande número de aplicativos abertos simultaneamente, somados com o antivírus, antispyware, firewall e outros integrantes do “kit Windows”, um processador dual-core acaba oferecendo um bom ganho na prática.

Sobre o Autor

Redes Sociais:

Deixe seu comentário

X