unidade central de processamento

Ver também: arquitetura de computadores e Circuito digital.

intervalo enterosEditar

a forma como uma CPU representa os números é uma opção de design que afeta as formas mais básicas como o dispositivo funciona. Algumas das primeiras calculadoras digitais usaram, para representar números internamente, um modelo elétrico do sistema de numeração decimal comum (base dez). Alguns outros computadores usaram sistemas de numeração mais exóticos, como o ternário (base três). Quase todos os CPUs modernos representam números em forma binária, onde cada dígito é representado por uma certa quantidade física de dois valores, como uma tensão” alta “ou”baixa”.

microprocessador MOS 6502 em um dual in-line package (encapsulado em Linha Dupla), um design extremamente popular de 8 bits.

com a representação numérica estão relacionados O tamanho e a precisão dos números que um CPU pode representar. No caso de um CPU binário, um bit refere-se a uma posição significativa nos números com os quais um CPU trabalha. O número de bits (ou de posições numéricas, ou dígitos) que um CPU usa para representar os números, é frequentemente chamado de “tamanho da palavra”, “largura de bits”, “largura do caminho de dados”, ou “precisão do número inteiro” quando se lida estritamente com números inteiros (em oposição a números de ponto flutuante). Esse número difere entre as arquiteturas e, muitas vezes, dentro de diferentes unidades da mesma CPU. Por exemplo, uma CPU de 8 bits lida com um intervalo de números que podem ser representados por oito dígitos binários, cada dígito tendo dois valores possíveis, e em combinação os 8 bits tendo 28 ou 256 números discretos. Com efeito, o tamanho do número inteiro fixa um limite de hard onsare no intervalo de inteiros que o soft onsare corre e que o CPU pode usar diretamente.

o intervalo do número inteiro também pode afetar o número de posições na memória que a CPU pode endereçar (localizar). Por exemplo, se um CPU binário usa 32 bits para representar um endereço de memória, e cada endereço de memória representa um octeto (8 bits), a quantidade máxima de memória que o CPU pode endereçar é 232 octetos, ou 4 GB. Esta é uma visão muito simples do espaço de endereço da CPU, e muitos projetos modernos usam métodos de endereço muito mais complexos, como paginação, para localizar mais memória do que seu intervalo inteiro permitiria com um espaço de endereço plano.

níveis mais altos do intervalo inteiro requerem mais estruturas para lidar com os dígitos extras e, portanto, mais complexidade, tamanho, uso de energia e geralmente custo. Por isso, não é de todo incomum, ver microcontroladores de 4 e 8 bits usados em aplicações modernas, mesmo quando estão disponíveis CPUs com um alcance muito mais alto (de 16, 32, 64, e até 128 bits). Microcontroladores mais simples são geralmente mais baratos, usam menos energia e, portanto, dissipam menos calor. Tudo isso pode ser considerações de design importantes para dispositivos eletrônicos. No entanto, em aplicações de extremidade alta, os benefícios produzidos pelo intervalo adicional (mais frequentemente o espaço de endereço adicional) são mais significativos e frequentemente afetam as opções de design. Para obter algumas das vantagens fornecidas pelos comprimentos de bits mais baixos e mais altos, muitas CPUs são projetadas com larguras de bits diferentes para diferentes unidades do dispositivo. Por exemplo, o IBM System/370 usou um CPU que era principalmente de 32 bits, mas usou precisão de 128 bits dentro de suas unidades de ponto flutuante para facilitar maior precisão e intervalo de números de ponto flutuante. Muitos projetos posteriores de CPU usam uma mistura de largura de bits semelhante, especialmente quando o processador é projetado para usos de uso geral, onde é necessário um equilíbrio razoável entre a capacidade de números inteiros e de ponto flutuante.

Frequência do clock

artigo principal: Taxa de clock

a maioria das CPUs e, de fato, a maioria dos dispositivos lógicos sequenciais, são de natureza síncrona. Ou seja, eles são projetados e operam com base em um sinal de sincronização. Esse sinal, conhecido como sinal de relógio, geralmente assume a forma de uma onda quadrada periódica. Calculando o tempo máximo em que os sinais elétricos podem se mover nas várias bifurcações dos muitos circuitos de um processador central, os projetistas podem selecionar um período Apropriado para o sinal do relógio.

esse período deve ser maior do que a quantidade de tempo que leva para um sinal se mover ou se propagar no pior dos casos. Ao definir o período do relógio para um valor bastante maior sobre o atraso da propagação do pior caso, é possível projetar todo o CPU e a maneira que move os dados em torno das “bordas” da subida e descida do sinal do relógio. Isso tem a vantagem de simplificar significativamente o CPU, tanto em uma perspectiva de design quanto em uma perspectiva de quantidade de componentes. No entanto, isso também tem a desvantagem que toda a CPU deve esperar por seus elementos mais lentos, mesmo que algumas unidades sejam muito mais rápidas. Essa limitação foi amplamente compensada por vários métodos de aumento do paralelismo da CPU (veja abaixo).

no entanto, as melhorias arquitetônicas por si só não resolvem todas as desvantagens de CPUs globalmente síncronas. Por exemplo, um sinal de relógio está sujeito aos atrasos de qualquer outro sinal elétrico. Velocidades de clock mais altas em CPUs cada vez mais complexas tornam mais difícil manter o sinal do relógio em fase (sincronizado) em toda a unidade. Isso levou muitos CPUs modernos a exigir que vários sinais de clock idênticos sejam fornecidos a eles, para evitar atrasar um único sinal o suficiente para fazer com que a CPU funcione incorretamente. Outro grande problema quando a velocidade do relógio aumenta drasticamente, é a quantidade de calor que é dissipado pela CPU. O sinal do relógio muda constantemente, causando a comutação de muitos componentes (mudança de estado), independentemente de estarem sendo usados naquele momento. Em geral, um componente que está mudando de estado usa mais energia do que um elemento em um estado estático. Portanto, à medida que a velocidade do clock aumenta, a dissipação de calor também aumenta, fazendo com que a CPU exija soluções de resfriamento mais eficazes.

um método de lidar com a comutação de componentes desnecessários é chamado de clock gating, que envolve desligar o sinal do relógio para componentes desnecessários, efetivamente desativando-os. No entanto, isso é frequentemente considerado difícil de implementar e, portanto, não vê uso comum fora de projetos de muito baixa potência. Um notável design de CPU atrasado que usa uma ampla porta de clock para reduzir os requisitos de energia do console de videogame é o do Xbox 360 baseado no PowerPC da IBM. Outro método de lidar com alguns dos problemas de um sinal global de relógio é a remoção completa do mesmo. Embora a remoção do sinal global do relógio torne, em muitos aspectos, o processo de design consideravelmente mais complexo, em comparação com projetos síncronos semelhantes, os projetos assíncronos (ou sem Relógio) têm vantagens marcantes no consumo de energia e na dissipação de calor. Embora seja um pouco incomum, CPUs completas foram construídas sem usar um sinal de relógio global. Dois exemplos notáveis disso são o AMULET, que implementa a arquitetura do ARM, e o MiniMIPS, compatível com o MIPS R3000. Em vez de remover totalmente o sinal do relógio, alguns projetos de CPU permitem que certas unidades do dispositivo sejam assíncronas, como por exemplo, usando ALU em conjunto com pipelining superescalar para alcançar alguns ganhos No desempenho aritmético. Embora não esteja completamente claro se os projetos totalmente assíncronos podem ter um desempenho comparável ou melhor do que seus equivalentes síncronos, é evidente que eles se destacam pelo menos nas operações matemáticas mais simples. Isso, combinado com suas excelentes características de consumo de energia e dissipação de calor, os torna adequados para sistemas embarcados.

ParalelismoEditar

Ver artigo principal: computação paralela
Modelo de uma CPU subescalar. Observe que leva quinze ciclos para terminar três instruções.

a descrição da operação básica de uma CPU oferecida na seção anterior descreve a maneira mais simples que uma CPU pode assumir. Esse tipo de CPU, geralmente referido como subescalar, opera e executa uma única instrução com um ou dois dados de cada vez.

este processo resulta em uma ineficiência inerente em CPUs subescalares. Uma vez que apenas uma instrução é executada por vez, todo o CPU deve esperar que essa instrução seja concluída antes de prosseguir para a próxima instrução. Como resultado, a CPU subescalar fica “paralisado” em instruções que levam mais de um ciclo de clock para concluir sua execução. Mesmo a adição de uma segunda unidade de execução (veja abaixo) não melhora muito o desempenho. Em vez de um caminho ficar congelado, agora dois caminhos ficam paralisados e o número de transistores não usados aumenta. Esse projeto, em que os recursos de execução da CPU podem operar com apenas uma instrução por vez, só pode, possivelmente, atingir o desempenho escalar (uma instrução por ciclo de clock). No entanto, o desempenho é quase sempre subescalar (menos de uma instrução por ciclo).

as tentativas de alcançar um desempenho escalar e melhor resultaram em uma variedade de metodologias de projeto que fazem o CPU se comportar menos linearmente e mais em paralelo. Quando se refere ao paralelismo em CPUs, geralmente dois termos são usados para classificar essas técnicas de design.

  • o paralelismo em nível de instrução, em inglês instruction level parallelism (ILP), procura aumentar a taxa na qual as instruções são executadas dentro de uma CPU, ou seja, aumentar a utilização dos recursos de execução na pastilha.
  • o paralelismo em nível de thread de execução, em inglês thread level parallelism (TLP), que se propõe incrementar o número de threads (efetivamente programas individuais) que um CPU pode executar simultaneamente.

cada metodologia se diferencia tanto nas maneiras em que são implementadas, quanto na efetividade relativa que produzem no aumento do desempenho da CPU para uma aplicação.

ILP: segmentação e arquitetura superescalarEditar

artigos principais: segmentação (eletrônica) e Superescalar.
Tubulação básica de cinco estágios. Na melhor das hipóteses, esse pipeline pode sustentar uma relação de conclusão de uma instrução por ciclo.

um dos métodos mais simples para conseguir incrementar o paralelismo é iniciar os primeiros passos de leitura e decodificação da instrução antes que a instrução anterior termine de ser executada. Esta é a forma mais simples de uma técnica conhecida como segmentação (instruction pipelining em inglês), e é usada em quase todas as CPUs de uso geral modernas. Ao dividir o caminho de execução em estágios discretos, o pipeline permite que mais de uma instrução seja executada a qualquer momento. Esta separação pode ser comparada a uma linha de montagem, na qual uma instrução é feita mais completa em cada etapa até que sai do tubo de execução e é retirada do mesmo.

no entanto, o pipeline introduz a possibilidade de uma situação em que é necessário terminar o resultado da operação anterior para concluir a próxima operação; uma condição frequentemente chamada de conflito de dependência de dados. Para lidar com isso, cuidados adicionais devem ser tomados para verificar essas classes de condições e, se isso ocorrer, uma parte do pipeline de instrução deve ser adiada. Naturalmente, conseguir isso requer circuitos adicionais, os processadores encaixotados são mais complexos que os subescalares, mas não muito. Um processador canalizado pode tornar-se quase completamente escalar, apenas inibido pelas paradas abruptas do pipeline (uma instrução durando mais de um ciclo de clock em um estágio).

segmentação superescalar simples. Ao ler e despachar duas instruções ao mesmo tempo, um máximo de duas instruções por ciclo podem ser concluídas.

uma melhoria adicional em relação à ideia de pipelining levou ao desenvolvimento de um método que diminui ainda mais o tempo ocioso dos componentes da CPU. Projetos que são considerados superescalares incluem um longo pipeline de instrução e várias unidades de execução idênticas. Em um pipeline superescalar, várias instruções são lidas e passadas para um despachante, que decide se as instruções podem ou não ser executadas em paralelo (simultaneamente). Se assim for, elas são despachadas para as unidades de execução disponíveis, resultando na capacidade de várias instruções serem executadas simultaneamente. Em geral, quanto mais instruções uma CPU superescalar é capaz de despachar simultaneamente para unidades de execução em espera, mais instruções serão concluídas em um determinado ciclo.

a maior parte da dificuldade em projetar uma arquitetura superescalar de CPU reside na criação de um despachante eficaz. O despachante precisa ser capaz de determinar rápida e corretamente se as instruções podem ser executadas em paralelo, assim como despachá-las de uma maneira que mantenha o maior número possível de unidades de execução ocupadas. Isso requer que o pipeline de instrução seja preenchido o mais rápido possível e aumenta a necessidade, em arquiteturas superescalares, de quantidades significativas de cache da CPU. Isso também cria técnicas para evitar perigos como previsão de bifurcação, execução especulativa, e execução fora de ordem, cruciais para manter altos níveis de desempenho. Tentando prever qual ramificação (ou caminho) uma instrução condicional levará, a CPU pode minimizar o número de vezes que todo o canal deve esperar até que uma instrução condicional seja concluída. Frequentemente, a execução especulativa fornece aumentos modestos de desempenho ao executar partes do código que não podem ser necessárias após a conclusão de uma operação condicional. Fora da ordem de execução altera de alguma forma a ordem em que as instruções são executadas para reduzir atrasos devido a dependências de dados. Também no caso de instruções individuais de dados múltiplos-os processadores modernos, no caso de uma grande quantidade de dados do mesmo tipo terem sido processados, podem desativar partes do pipeline de modo que, quando uma única instrução é executada muitas vezes, a CPU Pula a captação e decodifica fases e, portanto, aumenta consideravelmente o desempenho em certas ocasiões, especialmente nos mecanismos de programas altamente monótonos, como o soft onsare de criação de vídeo e processamento de fotos.

no caso em que uma parte da CPU é superescalar e uma parte não é, a parte não superescalar sofre no desempenho devido a paradas de programação. O Intel Pentium original (P5) tinha dois ALUs superescalares que podiam aceitar, cada um, uma instrução por ciclo de clock, mas sua FPU não podia aceitar uma instrução por ciclo de clock. Assim, o P5 foi superescalar na parte de números inteiros, mas não foi superescalar de números de vírgula (ou ponto ) flutuante. O sucessor da arquitetura Pentium da Intel, o P6, adicionou recursos superescalares às suas funções de ponto flutuante e, portanto, produziu um aumento significativo no desempenho desse tipo de instrução.

tanto o design superescalar quanto o encapsulamento simples aumentam o ILP de uma CPU, permitindo que um único processador conclua a execução de instruções em taxas que excedem uma instrução por ciclo (IPC). A maioria dos designs de CPU modernos são pelo menos um pouco superescalares e, na última década, quase todos os designs de CPU de uso geral são superescalares. Nos últimos anos alguma da ênfase no projeto de computadores de ILP alto moveu-se do hard onsare do CPU para sua relação de soft onsare, ou ISA. A estratégia very long instruction word ou VLIW, faz com que algum ILP seja diretamente implícito pelo software, reduzindo a quantidade de trabalho que o CPU deve realizar para dar um impulso significativo ao ILP e, portanto, reduzir a complexidade do projeto.

Paralelismo em nível de fioseditar

outra estratégia para alcançar o desempenho é executar vários programas ou threads em paralelo. Essa área de pesquisa é conhecida como computação paralela. Na taxonomia de Flynn, essa estratégia é conhecida como múltiplas instruções de vários dados ou MIMD.

uma tecnologia usada para esse fim foi o multiprocessamento (MP). O pontapé inicial dessa tecnologia é conhecido como multiprocessamento simétrico (SMP), onde um pequeno número de CPUs compartilha uma visão coerente de seu sistema de memória. Neste esquema, cada CPU tem um hard onsare adicional para manter uma visão constantemente atualizada da memória. Para evitar visitas obsoletas à memória, as CPUs podem cooperar no mesmo programa e os programas podem migrar de uma CPU para outra. Para aumentar o número de CPUs que cooperam além de algumas, esquemas como o non-uniform memory Access (NUMA) e protocolos de consistência baseados em diretório foram introduzidos em 1990. Os sistemas SMP são limitados a um pequeno número de CPUs, enquanto os sistemas NUMA foram construídos com milhares de processadores. Inicialmente, o multiprocessamento foi construído usando várias CPUs e placas discretas para implementar a interconexão entre os processadores. Quando os processadores e sua interconexão foram implementados em um único chip de silício, a tecnologia é conhecida como um processador multicore.

posteriormente, reconheceu-se que existia um paralelo muito estreito com um ÚNICO programa. Um ÚNICO programa pode ter vários segmentos (ou funções) que podem ser executados separadamente ou em paralelo. Alguns dos primeiros exemplos desta tecnologia implementado processamento de entrada / saída, tais como acesso direto à memória como um segmento separado do segmento computado. Na década de 1970, uma abordagem mais geral a essa tecnologia foi introduzida, quando sistemas foram projetados para executar vários threads de computação em paralelo. Essa tecnologia é conhecida como multithreading (MT).

essa abordagem é considerada mais econômica do que a do multiprocessamento, pois apenas um pequeno número de componentes dentro de uma CPU é replicado para suportar MT em oposição a toda a CPU no caso de MP. Em MT, as unidades de execução e sistema de memória, incluindo caches são compartilhados entre vários segmentos. A desvantagem do MT é que o suporte do hard onsare para multithreading é mais visível para o soft onsare do que para o MP e, portanto, o soft onsare supervisor como o dos sistemas operacionais tem que passar por mudanças maiores para apoiar MT. Um tipo de MT que foi implementado é conhecido como bloco multithreading, onde um thread é executado até que ele fique paralisado esperando que os dados retornem da Memória externa. Neste esquema, a CPU teria então que mudar rapidamente para outro thread que está pronto para funcionar, o switch muitas vezes executa um ciclo de clock da CPU, como a tecnologia UltraSPARC. Outro tipo de MT é chamado de multithreading simultâneo, em que as instruções de vários threads são executadas em paralelo dentro de um ciclo de clock da CPU.

Paralelismo de dadoseditar

artigos principais: processador vetorial e SIMD.

um paradigma de CPU menos comum, mas cada vez mais importante (e, de fato, de computação em geral) lida com vetores. Os processadores mencionados acima são todos referidos como um certo tipo de dispositivo escalar. Como o nome implica, os processadores vetoriais lidam com vários dados no contexto de uma instrução, isso contrasta com os processadores escalares, que tratam um dado para cada instrução. Estes dois esquemas de lidar com os dados são geralmente referidos respectivamente como SISD (single instruction, single data) e SIMD (single instruction, multiple data). A grande utilidade na criação de CPUs que lidam com vetores de dados reside na otimização de tarefas que tendem a exigir a mesma operação, por exemplo, uma soma, ou um produto escalar, a ser executado em um grande conjunto de dados. Alguns exemplos clássicos de tais tarefas são aplicações multimídia (imagens, vídeo, e som), bem como muitos tipos de tarefas científicas e de engenharia. Enquanto uma CPU escalar deve completar todo o processo de leitura, decodificação e execução de cada instrução e valor em um conjunto de dados, uma CPU vetorial pode executar uma operação simples em um comparativamente grande conjunto de dados com uma única instrução. Claro, isso só é possível quando o aplicativo tende a exigir muitas etapas que aplicam uma operação a um grande conjunto de dados.

a maioria das primeiras CPUs vetoriais, como o Cray-1, foram quase exclusivamente associadas a aplicações de pesquisa científica e criptografia. No entanto, como a multimídia mudou em grande parte para a mídia digital, a necessidade de uma certa forma de SIMD em CPUs de uso geral tornou-se significativa. Logo depois que começou a se tornar comum incluir unidades de ponto flutuante em processadores de uso geral, especificações e implementações de unidades de execução SIMD para CPUs de uso geral também começaram a aparecer. Algumas dessas primeiras especificações SIMD, como o MMX da Intel, eram apenas para números inteiros. Isso provou ser um impedimento significativo para alguns desenvolvedores do soft onsare, já que muitos dos aplicativos que se beneficiavam do SIMD lidavam principalmente com números de ponto flutuante. Progressivamente, estes primeiros projetos foram refinados e refeitos em alguma das comuns, modernas ESPECIFICAÇÕES SIMD, que geralmente estão associadas a um ISA. Alguns exemplos modernos notáveis são o SSE da Intel e o AltiVec relacionado ao PowerPC (também conhecido como VMX).

Deixe uma resposta

O seu endereço de email não será publicado.