sexta-feira, 11 de fevereiro de 2011

Microprocessador

O CPU recebe continuamente instruções para serem executadas. Cada instrução é uma ordem de processamento de dados e o trabalho do CPU consiste principalmente em cálculos e transporte de dados.

O CPU recebe pelo menos dois tipos de dados:
  • Instruções acerca do que fazer com outros dados.
  • Dados que serão processados de acordo com as instruções.
Chamamos instruções ao código de programação, que inclui mensagens enviadas ao computador, ordens de impressão, entre outras.
Os dados são normalmente dados do utilizador, sejam eles informações numa base de dados, uma folha de cálculo, um desenho, etc.

A maior carga de trabalho do CPU consiste na descodificação de instruções e localização de dados, e os cálculos em si não são o tipo de trabalho muito pesado para um microprocessador.

A descodificação é, no fundo, a percepção de instruções que o utilizador envia para o CPU. Todos os CPU dos PC são compatíveis com o 8086. Isto quer dizer que os programas comunicam com o CPU através de uma família específica de instruções.

Dado que existe a necessidade dos CPU das gerações subsequentes poderem utilizar as mesmas instruções do 8088, foi necessário criar um conjunto de instruções compatíveis. Os CPU mais recentes têm de perceber as mesmas instruções. Esta compatibilidade é um standard da indústria desde então. Todos os processadores novos, independentemente dasua geração, têm de ser capazes de perceber e manipular o formato de instruções 8088.

Para nos ajudar a entender o funcionamento do microprocessador, vamos ver passo a passo o modo como ele executa uma operação simples, do tipo 2 + 2:
  1. Quando se prime a tecla 2, é enviado um sinal ao processador e pede-se à unidade de prefetch para pesquisar na memória principal do computador uma instrução específica sobre os dados novos, dado que não há nada acerca disso na cache de instruções.
  2. As instruções chegam ao microprocessador através da unidade de barramentos, vindas da memória principal, e são armazenadas na cache de instruções como “2=X”.
  3. A unidade de prefetch solicita então à cache de instruções uma cópia do código “2=X”e envia-o à unidade de descodificação para processamento.
  4. Seguidamente, na unidade de descodificação “2=X”, o código é descodificado numa string de código binário, que é enviada para a unidade de controlo e para a cache de dados.
  5. Agora a unidade de controlo executa a instrução para “2=X”. Isso faz com que o número 2 seja enviado para um endereço X na cache de dados, onde aguarda por outras instruções.
  6. Quando se prime a tecla 2, novamente a unidade de prefetch pergunta à memória principal do computador e à cache de instruções quais são as instruções específicas para esses dados novos. Como não encontra nenhuma informaçãona cache de instruções, as ordens vêm da memória principal.
  7. Similarmente ao que aconteceu com o “2=X”, os novos dados vêm da memória principal e são armazenados na cache de instruções como “2=Y”.
  8. A unidade de prefetch vai à cache de instruções buscar uma cópia do código “2=Y” e envia-a para a unidade de descodificação onde será processada.
  9. Na unidade de descodificação, a instrução “2=Y” é descodificada e transformada numa string de código binário, que será enviada para a unidade de controlo e para a cache de dados e que lhes dirá o que fazer com a instrução.
  10. Dado que a unidade de controlo sabe que o número 2 será armazenado para uso futuro na cache de dados, executa a instrução para “2=Y”. Isto faz com que o número 2 seja enviado para um endereço na cache de dados chamado Y, onde, tal como o outro 2, aguardará futuras ordens.
  11. Quando premimos a tecla “+”, a unidade de prefetch pergunta à memória principal do computador e À cache de instruções o que há-de fazer com os novos dados recebidos, que devem ser “pescados” da memória principal.
  12. Dado que é uma instrução nova, “+” vem para o microprocessador, da memória principal, e é armazenado num endereço da cache de instruções como “X+Y=Z”, indicando que os dois valores vão ser adicionados um ao outro.
  13. Então, a unidade de prefetch pede á cache de instruções uma cópia do código “X+Y=Z” e envia-a para a unidade de controlo para posterior processamento.
  14. Na unidade de descodificação, “X+Y=Z” é traduzido e descodificado, sendo em seguida enviado para a cache de dados, dando indicação do que hão-de fazer com a instrução. Além disso, também a unidade aritmética e lógica é informada que uma operação ADD vai ser executada.
  15. A unidade de controlo envia um comando ADD para a unidade aritmética e lógica, onde X e Y são adicionados, após serem chamados da cache de dados. Após realizar a operação, a unidade aritmética e lógica envia o resultado para ser armazenado num dos endereços dos registos.
  16. Quando se prime a tecla “=”, novamente a unidade de prefetch verifica a cache de instruções para solicitar informações sobre os novos dados, mas não vai encontrar lá nada.
  17. A instrução sobre “=” vem da memória principal para o microprocesador através da unidade de barramentos e fica armazenada num endereço da cache de instruções como código “PRINT Z”.
  18. A unidade de prefetch pede à cache de instruções uma cópia do código “PRINT Z” e envia-a para a unidade de descodificação para posterior processamento.
  19. Na unidade de descodificação, “PRINT Z” é traduzido e descodificado numa string de código binário, que é enviada para a unidade de controlo para lhe dizer o que fazer com a instrução.
  20. Agora que o valor de “Z” foi calculado e está armazenado nos registos, o comando print só tem de ir buscar o conteúdo do registo e apresentá-lo no ecrã no computador. E assim o microprocessador acaba o seu serviço, pelo menos de momento.

segunda-feira, 7 de fevereiro de 2011

Memórias e Outros

Memoria cache interna (level 1) – A cache L1 tem uma média de 90% a 95% de actos, isto é, a percentagem de vezes que o processador encontra lá as instruções que procura. Com a ajuda de uma cache externa, essa média pode ainda ser melhorada.

Ciclos de memória Burst-Mode- Uma memória standard de 32 bits demora dois ciclos de relógio para uma transferência. Após uma transferência standard de 32 bits podem ser transferidos mais dados, até aos próximos 12 bits, somente com um ciclo de relógio para cada transferência de 32 bits. Assim, em cinco ciclos de relógio, podem ser transferidos 16 bytes de dada de memória sequencial contígua, em vez de oito ou mais ciclos.

Coprocessador matemático incorporado – O coprocessador trabalha sincronizadamente com o processador e executa as instruções matemáticas em menos ciclos do que os necessários nos desenhos anteriores. Em média, isso permite uma performance duas ou três vezes superior à de um i387 externo.
O i486 ofereceu uma grande variedade de velocidades que variavam entre os 16 MHz e os 120 MHz. Para isso, a Intel lançou várias versões do 486, versões que com certeza são conhecidas de todos, nomeadamente o i486SX, o i486DX2 e o i486DX4, isto além do 486 Overdrive, como veremos à frente. Além disso, os i486 têm algumas diferenças na configuração dos pinos. As versões DX, DX2 e SX têm uma configuração de 168 pinos, enquanto a versão Overdrive já tem 169 pinos que eram introduzidos num suporte que ficou denominado socket1. Posteriormente, surgiram os socket 2 e 3 com socket ZIF (Zero Insertion Force), capazes já de aceitar inclusivamente um Overdrive para Pentium.

Um processador marcado para uma determinada velocidade funciona sempre a velocidades inferiores e um i486DX4 a 100 MHz trabalha perfeitamente a 75MHz numa placa principal de 25MHz. Nota-se que os processadores Overdrive e DX2 funcionam internamente a duas vezes a velocidade de relógio da placa principal, enquanto que o DX4 opera a duas , duas e meia ou três vezes a velocidade de relógio da placa principal. 
A velocidade do processador dependendo do factor multiplicativo que configuramos na placa, isto é, no caso do DX2 é extremamente simples, pois só necessitamos de multiplicar a velocidade do processador pelo facto multiplicativo e teremos a velocidade de processamento. Mas no caso do DX4 temos muitas mais possibilidades, já que ele, como já referimos, pode funcionar com factores multiplicativos superiores ao do DX2.

A velocidade interna do DX4 é controlada pelo sinal CLKMUL (Clock Multiplier) no pino R-17 no caso do socket 1 ou S-18 no socket 2 e 3. O sinal CLKMUL é lido durante o reset do processador e define a razão do relógio interno para a frequência externa do barramento, a que corresponde o sinal CLK no pino C-3 (socket 1) ou D-4 (socket 2 e 3). Se CLKMUL é um sinal de nível baixo, a velocidade será duas vezes a frequência do barramento externo. Se lido como nível alto ou sinal flutuante, isto é, sem qualquer tipo de sinal, é seleccionado o modo de três vezes a frequência do barramento. Caso o sinal CLKMUL seja ligado a BREQ (Bus Request), pino Q-15 (socket 1) ou R-16 ( socket 2 e 3), a velocidade interna do CPU será duas vezes e meia a frequência do barramento.

domingo, 6 de fevereiro de 2011

Execução dinâmica

A dynamic executioon , ou execução dinâmica das instruções, pelo que vamos ver como isso e feito no Pentium Pro. Este tipo de execução e possível porque o Pentium Pro possui três pipelines e desta forma consegue executar três instruções simultaneamente. As instruções são analisadas quanto a sua interligação, mas não são executadas ordenadamente, isto e, são enviadas para os pipelines as instruções que não dependem umas das outras e so depois e que são executadas as que necessitam dos dados das anteriores.
A unidade de execução executa as instruções baseada na não dependência de execução de outras instruções e não na sua ordem original dentro de um programa. Para isso, baseia-se nas seguintes três técnicas:

·         Multiple branch prediction (revisão de desvios múltiplos) – Prediz a execução do programa através de vários ramos. Através de um algoritmo especial, o processador pode antecipar saltos ou ramificações no fluxo de instruções. Isto e possível porque, enquanto o processador recebe as instruções, ele também esta a verificar as instruções do programa mais para a frente.
·         Data flow analysis (análise de fluxo de dados) – Cria, optimiza e reordena as instruções analisando a dependência entre elas, independentemente da sua ordem quando estão disponíveis para processamento ou, por outro lado, se são dependentes de outras instruções que necessitam de ser executadas primeiro. Assim, o processador determina qual e a sequência óptima para o processamento e executa as instruções de um modo mais eficiente. 

·         Speculative execution  (execução especulativa) – É o resultado do multiple Branch Prediction e do Data Flow Analysis. Executa as instruções de modo especulativo, isto é, as instruções que podem ser executadas sem dependências umas das outras. Utiliza a técnica de Data Flow Analysins para verificar as dependências entre instruções e o algoritmo

Velocidade do Processador - Overclocking

A velocidade do relógio de sistema de um computador é medida como frequência ou número de ciclos por segundo. Um oscilador de quartzo controla a velocidade de relógio. Quando uma tensão é aplicada ao quartzo, ele vibra a uma determinada frequência. A oscilação emana do cristal na forma de corrente alterna na proporção da harmónica do cristal - esta corrente alterna é o sinal do relógio.

Um computador trabalha a milhões destes ciclos por segundo, pelo que a sua velocidade é medida em megahertz (MHz), isto tenho em linha de conta que um hertz é igual a um ciclo por segundo.

A denominação Hertz foi dada em homenagem ao fisico alemão Heinrich Rudolph Hertz. Em 1885, ele provou, através da experimentação, a teoria electromagnética, que diz que a luz é uma forma de radiação electromagnética e propaga-se através de ondas.

Quando vemos um processador 600 MHz, sabemos que a frequência do relógio é de 600 MHz, pelo que temos na placa principal um pequeno oscilador de quartzo que oscila continuamente a um determinado
número de impulsos por segundo. A cada impulso algo acontece no processador. Assim, quantos mais impulsos por segundo, maior número de dados são processados por segundo.
Os primeiros processadores trabalhavam a 4,77 MHz e, subsequentemente, foram aumentando para 8 MHZ, 16MHz, 25 MHz, 50 MHz, 66 MHz, 90 MHz, 133 MHz e 200 MHz, até ás velocidades que hoje conhecemos e que se aproxima cada vez mais dos 2000 MHz.
Para atingir estes valores de velocidade de processamento, os fabricantes tiveram de utilizar uma técnica de multiplicação de frequência, a qual vamos ver seguidamente.

O grande problema das altas-frequências de relógio é conseguirmos assegurar que todos os outros componentes electrónicos trabalhem de acordo com o processador. É relativamente simples fazer com que os dados se movam a grandes velocidades dentro do integrado do CPU. Mas quando essa operação se passa cá fora, isto é, nos circuitos de apoio, aí não pode correr tão bem. Os outros componentes têm de ser capazes de dar resposta ás exigências de velocidade do processador. Quando a frequência atinge valores muito elevados, as pistas do circuito impresso começam a actuar como antenas de radiofrequência, dando-se o aparecimento de várias formas de ruído. Resumindo, torna-se extremamente caro e difícil construir todo o hardware de modo a trabalhar á mesma velocidade do processador.

A solução para o problema é dividir a frequência do relógio por dois:
  • Uma frequência interna, alta, que controla o funcionamento do CPU.
  • Uma frequência externa, baixa, que controla o barramento do sistema. É aqui que o CPU troca os dados com os dispositivos de I/O.
O primeiro processador a  utilizar esta técnica foi o 486DX2 25/50 MHz da Intel, o que proporcionou a possibilidade de se adquirir por um baixo preço um processador que nos dava 90% da performance do 486DX 50. O DX50 trabalhava a 50 MHz, tanto internamente como externamente. O DX2 trabalha a 25 MHz externamente, isto é, no barramento do sistema. Isto permitiu a construção de placas de baixo custo e a utilização de memória RAM também mais barata.


Esta duplicação da velocidade do relógio ocorre no interior do processador. Se o cristal da placa principal oscilar a 25 MHz, o processador receberá um impulso a cada 40 nanossegundos. No interior do processador esta frequência é dobrada para 50 MHz. Agora, no interior do processador, o relógio dá um impulso a cada 20 nanossegundos. Esta frequência controla todas as transacções internas, incluindo, entre outras, a unidade de vírgula flutuante, a unidade aritmética e lógica e os registos internos. A única área que continua a funcionar a 25 MHz é a das transferências externas de dados, ou seja, a comunicação com a RAM, a BIOS e os I/O.

O problema da velocidade também é crucial para a memória RAM. As SIMM FPM ou EDO trabalham a 66 MHz; quanto muito, poderão chegar aos 75 MHz, porque os processadores Pentium necessitam de factores multiplicativos internos que vão de 2 até 5.

Com a introdução, em 1998, da RAM PC100 a trabalhar a 100 MHz, juntamente com novos chipsets e placas principais, passou-se a usar factores de 3.5, 4 e 4.5, o que permitiu ter CPU a 350 MHz, 400MHz e 450MHz. Mas com Pentium II, Celeron e Pentium III passamos a operar com factores superiores a 12, o que, associado a RAM PC133, nos permitem atingir os 1700 MHz.

Registos Internos

No tamanho dos registos internos temos um bom indicador da quantidade de informação que o processador pode operar num determinado tempo.

Os processadores podem manipular números de qualquer tamanho, mas quanto maior for o número, mais tempo o processador demora a executar as operações necessárias.

Os registos são áreas de armazenamento internas do processador e são usadas para guardar dados que estão por ele a ser "trabalhados". Os registos são o mais rápido tipo de memória acessível ao processador, isto porque, além de fazerem parte integrante do processador, também estão ligados directamente á sua lógica.

A maior parte das operações é executada nos registos; o processador não pode executar operações aritméticas directamente na memória, por isso, se quisermos adicionar o valor 1 a uma localização de memóia, o que o processador faz é carregar o valor incial da memória para um registo, adicionar 1 ao registo e depois guardar o valor novamente na memória.

Alguns processadores têm um barramento de dados interno de tamanho diferente do barramento de dados externo. Um bom exxemplo disso é o 8088 e o 386SX, cada um deles com um barramento de dados interno que é o dobro do correspondente barramento externo. Estes desenhos híbridos são versões mais económicas do processador original. O 386SX, por exemplo, pode transportar dados internamente com um tamanho de registos de 32 bits, mas, para comunicar com o exterior, o chip está limitado a um barramento de dados de 16 bits.

Os registos internos, por vezes, são maiores do que o barramento de dados, o que quer dizer que o processador necessita de dois ciclos de relógio para encher um registo antes de ele poder ser usado. Podemos ver como exemplo disso o 386SX e o 386DX, ambos com registos internos de 32 bits, embora o 386SX necessite de dois ciclos para encher os registos, enquanto que o 386DX necessita somente de um. O mesmo acontece quando os dados são passados dos registos internos de volta ao barramento do sistema.

No entanto, o Pentium temos o caso inverso. O Pentium tem um barramento de dados de 64 bits, mas somente 32 bits nos registos internos. Isto pode parecer problemático para o funcionamento do processador, mas o Pentium tem duas pipelines internas de 32 bits para processamento de informação. É quase como se o Pentium tivesse dois processadores de 32 bits num só chip. Além disso, o barramento de dados de 64 bits assegura um funcionamento eficiente desses registos de 32 bits.