Microarquitetura

Origem: Wikipédia, a enciclopédia livre.

Microarquitetura ou μarch é a forma como um determinado conjunto de instruções (ISA) é implementado em um processador, podendo ser implementado com microarquiteturas diferentes. As implementações podem variar devido a diferentes objetivos de um dado projeto ou a mudanças na tecnologia. A microarquitetura inclui os elementos constitutivos do processador e como estes interligam e interoperam para implementar o ISA. A ISA é aproximadamente o mesmo que o modelo de programação de um processador como visto por um programador de linguagem Assembly ou escritor de compilador. O ISA inclui o modelo de execução, registradores do processador, endereço e formatos de dados, entre outras coisas.

Existem diferenças entre arquitetura e microarquitetura de processadores. A arquitetura é um conjunto de registros, instruções e estruturas de dados, que são públicos para que possam ser utilizados pelos programadores. É através da arquitetura de um processador, que é possível definir se um conjunto de instruções é ou não compatível com a arquitetura. Por exemplo, se um conjunto processadores, utilizam a mesma arquitetura, isso significa que se em um desses processadores um certo conjunto de instruções pode ser executado, nos outros processadores com mesma arquitetura esse conjunto de instruções também poderá ser executado. A microarquitetura de um processador é o modo com que se usa a arquitetura para melhorar a velocidade e desempenho de processamento. É por isso que dentro de uma família de processadores, a microarquitetura pode ser atualizada frequentemente, pra melhorar o processamento, mas mesmo assim pode manter a arquitetura do processador.

Uma Microarquitetura é dividida em uma Parte Operativa e uma Parte de Controle. Parte Operativa (ou Caminho de Dados) - Constituída de todos os componentes responsáveis pela execução das operações elementares sobre os dados(transformações nos dados). Parte de Controle - Constituída de circuitos sequenciais e/ou memória de programa que gera o controle ciclo-a-ciclo da parte operativa.

A microarquitetura de uma máquina é geralmente representada com diagramas que descrevem as interligações dos vários elementos microarquiteturais da máquina, que pode ser tudo, desde portões individuais e registros, para completar a unidades de lógica e aritmética (ULA) e ainda maiores elementos. Estes diagramas geralmente separam o caminho de dados (onde os dados são colocados) e o caminho de controlo (que pode ser dito para dirigir os dados). Cada elemento da microarquitetura por sua vez é representado por um esquema que descreve as interconexões de portas lógicas usadas para implementá-lo. Cada porta lógica por sua vez é representado por um diagrama de circuito que descreve as conexões dos transistores usados para implementá-lo em alguma família lógica particular.

Aspectos da microarquitetura[editar | editar código-fonte]

O caminho de dados em pipeline é o projeto central de dados mais comumente utilizados na microarquitetura hoje. Esta técnica é usada na maioria dos microprocessadores modernos, microcontroladores e DSPs. A arquitetura pipeline atua como uma linha de montagem onde se produz mais em menos tempo. O pipeline inclui diversas fases, que são fundamentais em projetos microarquitetura, algumas dessas etapas incluem instrução busca, decodificação de instruções, execução e gravação. Algumas arquiteturas incluem outras etapas, tais como acesso à memória. O projeto de pipeline é uma das tarefas centrais microarquiteturais.

Unidades de execução também são essenciais para a microarquitetura. Estas unidades executam as operações ou cálculos do processador. A escolha do número de unidades de execução, a sua latência e taxa de transferência é uma tarefa de projeto da microarquitetura central. O tamanho, a latência, o throughput ou periféricos como controladores de memoria e conectividade de memórias dentro do sistema também são decisões concepção microarquiteturais. Isso inclui decisões sobre o nível de desempenho e conectividade desses periféricos.

Como as decisões de design microarquitetura afetam diretamente o que se passa em um sistema o projeto da microarquitetura presta atenção em questões como:

  • Área Chip / custo
  • O consumo de energia
  • Complexidade lógica
  • Facilidade de conectividade
  • Manufaturabilidade
  • Facilidade de depuração
  • Testabilidade

Conceitos microarquiteturais[editar | editar código-fonte]

Ciclo de instrução - Em geral, todos os processadores, microprocessadores de chip único ou implementações multi-chip programas executando as seguintes etapas executar:

Lê uma instrução e decodifica

Encontra qualquer dado associado que é necessário para processar a instrução

Processar a instrução

Escreva os resultados fora

O ciclo de instrução é repetido continuamente até que a energia é desligada.

O aumento da velocidade de execução - Para complicar esta série de aparência simples de passos é o facto de a hierarquia de memória, que inclui o armazenamento em cache, a memória principal e de armazenamento não-volátil (como discos rígidos, onde as instruções e dados de programas residem), tem sido sempre mais lento do que o próprio processador. Uma quantidade considerável de pesquisa tem sido posta em projetos que evitam esses atrasos, tanto quanto possível. Ao longo dos anos, um objectivo central era de executar mais instruções em paralelo, aumentando assim a velocidade de execução de um programa eficaz. Estes esforços introduziram lógica e estruturas de circuitos complicadas.

Escolha de Conjunto de instruções[editar | editar código-fonte]

Os conjuntos de instruções mudaram ao longo dos anos, desde inicialmente muito simples, por vezes muito complexos (em vários aspectos). No entanto, a escolha do conjunto de instruções da arquitetura pode afetar significativamente a complexidade da implementação de dispositivos de alto desempenho. A estratégia de destaque, usado para desenvolver os primeiros processadores RISC, foi o de simplificar instruções para um mínimo de individual complexidade semântica combinada com elevada regularidade de codificação e simplicidade. Tais instruções uniformes foram facilmente obtida, descodificadas e executadas de uma forma em conduta, e uma estratégia simples para reduzir o número de níveis lógicos, a fim de atingir frequências de operação elevadas; instrução cache-memórias compensaram a freqüência de operação superior e inerentemente baixa densidade de código, enquanto os grandes conjuntos de registros foram utilizados para fatorar o máximo de memória (lenta) acessada possível.

Instrução pipelining[editar | editar código-fonte]

Uma das primeiras e mais poderosas técnicas para melhorar o desempenho, é a utilização de pipeline de Instrução. Primeiro os designs de processadores realizaram todos os passos acima para uma instrução antes de passar para a próxima. Grandes porções do circuito ficavam ociosa em qualquer etapa; por exemplo, o circuito de descodificação de instruções seria inativo durante a execução e assim por diante.

Pipelines melhoraram o desempenho, permitindo uma série de tarefas ao mesmo tempo. No mesmo exemplo básico, o processador iria começar a decodificar (passo 1) uma nova instrução enquanto o último estava à espera de resultados. Isso permitiria que até quatro tarefas para estar "trabalhando" de uma só vez, fazendo com que o processador trabalhe quatro vezes mais rápido. Embora qualquer uma instrução leva o mesmo tempo para concluir (há ainda quatro etapas) a CPU como um executa mais em menos tempo.

A maioria dos processadores modernos são agora pipeline, e CPUs microcodificadas sem pipeline são visto apenas na maioria dos processadores embarcados com restrições de área. Máquinas CISC, como VAX 8800, Pentium 4 e Athlon, são implementadas com tanto microcódigo e pipeline. Melhorias no pipeline e cache são os dois grandes avanços microarquiteturais que permitiram o desempenho do processador para manter o ritmo com a tecnologia de circuito em que se baseiam.

Cache[editar | editar código-fonte]

Não demorou muito para que melhorias na fabricação de chips permitiram ainda mais circuitos para ser colocada no die, e os designers começaram a procurar maneiras de usá-lo. Um dos mais comum foi o de acrescentar uma quantidade cada vez maior de memória cache on-die. A Cache serve simplesmente de intermediário entre um operador de um processo e o dispositivo de armazenamento ao qual esse operador acede. A CPU inclui um controlador de cache que automatiza a leitura e a escrita a partir do cache.

Caches e pipeline foram uma combinação perfeita. Anteriormente, isso não faz muito sentido para construir um pipeline que pode correr mais rápido do que a latência de acesso de memória off-chip. Usando a memória de cache on-chip, significou um comprimento de tempo muito menor. Isso permitiu que as freqüências de operação dos processadores passassem a aumentar a um ritmo muito mais rápido do que a memória off-chip.

Previsão de desvio[editar | editar código-fonte]

A partir do momento que decodifica a instruções do processador se descoberto que ele encontrou uma instrução de desvio dentro do pipeline e a sua execução for consolidada, todas as instruções posteriores a mesma a que se encontram na fila devem ser abortadas.

Técnicas como a previsão de desvios e execução especulativa são usados para diminuir essas penalidades. Previsão de desvios é onde o hardware faz palpites sobre se um determinado será ou não tomado. Projetos modernos têm sistemas de previsão estatísticos e complexos, que assistem os resultados anteriores para prever o futuro com maior precisão. A suposição permite que a pré-busca no hardware de instruções sem esperar que a leitura de registro. Isso pode produzir um melhor desempenho quando o palpite é bom, com o risco de uma enorme pena quando a suposição é ruim porque as instruções têm de ser desfeita.

Superscalar[editar | editar código-fonte]

As melhorias na fabricação de semicondutores logo permitidos ainda mais portas lógicas para ser utilizado. No esquema acima o processador processa partes de uma única instrução de cada vez. Os programas de computador poderiam ser executados mais rapidamente se várias instruções fossem processados simultaneamente. Isto é o que os processadores superescalares alcançam, por meio da replicação de unidades especializadas, como exemplo unidade de inteiro, unidade de ponto flutuante. A replicação das unidades só foi possível quando a área do die de um processador de um só tema não estendeu os limites do que pode ser fabricado de forma confiável. Ao final de 1980, os projetos superescalares começaram a entrar no mercado.

Uma parte específica do pipeline lê uma enorme lista de instruções da memória e entregandos para as diferentes unidades de execução que estão ociosos naquele momento. Os resultados são, então, recolhido e re-ordenados no final.

Execução fora de ordem[editar | editar código-fonte]

A Execução Fora-de-ordem permite que uma instrução pronta para ser processada seja executada antes mas não tem os operandos prontos, em seguida, re-ordens os resultados para fazer parecer que tudo aconteceu na ordem programada. Esta técnica também é usada para evitar outras “bolhas”, como uma instrução aguardando um resultado de uma operação de ponto flutuante de longa latência ou outras operações multi-ciclo.

Renomeação de registrador[editar | editar código-fonte]

Renomeação de registrador refere-se a uma técnica utilizada para evitar a execução serializada desnecessária de instruções do programa por causa da reutilização dos mesmos registros por essas instruções. Suponha que temos dois grupos de instruções que irão utilizar o mesmo registro. Um conjunto de instruções é executado primeiro de deixar o registo para o outro conjunto, mas se o outro conjunto é atribuído a um registo semelhante diferente, ambos os conjuntos de instruções podem ser executadas em paralelo (ou) em série é isso que a renomeação faz.

Multiprocessamento e multithreading[editar | editar código-fonte]

Arquitetos de computadores tornaram-se frustrados pela crescente incompatibilidade em freqüências de operação da CPU e tempos de acesso a Memória. Nenhuma das técnicas que exploradas em nível de instrução (ILP paralelismo) dentro de um programa poderia compensar as longas “bolhas” que ocorreram quando os dados tiveram que ser obtido a partir da memória principal. Por estas razões, as gerações mais novas de computadores começaram a explorar os níveis mais elevados de paralelismo que existem fora de um único programa ou segmento de programa.

Esta tendência é conhecida como computação throughput. Esta ideia se originou no mercado de mainframe onde o processamento de transações on-line enfatizou não apenas a velocidade de execução de uma transação, mas a capacidade de lidar com grandes números de transações. Com os aplicativos baseados em transações, tais como roteamento de rede e web-site que serve aumentando muito na última década, a indústria de computadores tem capacidade e problemas de taxa throughput.

Uma técnica de como esse paralelismo é conseguido é através de sistemas de multiprocessamento, sistemas de computadores com múltiplas CPUs. Uma vez reservada para mainframes high-end e supercomputadores, em pequena escala (2-8) servidores multiprocessados tornaram-se comuns para o mercado de pequenas empresas. Para grandes corporações, multiprocessadores de grande escala são comuns. Mesmo os computadores pessoais com múltiplas CPUs têm aparecido desde a década de 1990.

Com novas reduções de tamanho no transistor disponibilizado com o avanço da tecnologia de semicondutores, processadores multicore são implementados no mesmo chip de silício. Inicialmente usado em chips de segmentação dos mercados integrados, onde CPUs mais simples e menores permitiriam várias instâncias para caber em uma única peça de silício. Em 2005, a tecnologia de semicondutores permitiu high-end chips de processadores de desktop CMP dupla a ser fabricado em volume.

Outra técnica que se tornou mais popular recentemente é multithreading. Em multithreading, quando o processador tem de buscar dados da memória do sistema lento, em vez de protelar para os dados chegarem, os interruptores de processador para outro programa ou linha programa que está pronto para executar. Embora isto não acelerar um determinado programa / thread, ela aumenta o rendimento geral do sistema, reduzindo o tempo da CPU está ocioso.

Conceitualmente, multithreading é equivalente a uma mudança de contexto no nível do sistema operacional. A diferença é que uma CPU multithreaded pode fazer um interruptor de fio em um ciclo de CPU em vez das centenas ou milhares de ciclos de CPU uma mudança de contexto requer normalmente. Isto é conseguido por meio da replicação do estado hardware (como o contador de registo e arquivo de programa) para cada segmento ativo.

Uma outra melhoria é multithreading simultâneo. Esta técnica permite que CPUs superescalares para executar instruções de diferentes programas / threads simultaneamente no mesmo ciclo.