Unidade central de processamento

ImprimirCitar
Componente de computador central que executa instruções
Uma CPU Intel 80486DX2, como visto de cima
Parte inferior de um Intel 80486DX2, mostrando seus pinos

Uma unidade de processamento central (CPU), também chamada de processador central ou processador principal, é o processador mais importante em um determinado computador. Seu circuito eletrônico executa instruções de um programa de computador, como operações aritméticas, lógicas, de controle e de entrada/saída (E/S). Essa função contrasta com a de componentes externos, como memória principal e circuitos de E/S, e coprocessadores especializados, como unidades de processamento gráfico (GPUs).

A forma, o design e a implementação das CPUs mudaram ao longo do tempo, mas sua operação fundamental permanece quase inalterada. Os principais componentes de uma CPU incluem a unidade aritmética-lógica (ALU) que executa operações aritméticas e lógicas, registradores do processador que fornecem operandos para a ALU e armazenam os resultados das operações da ALU e uma unidade de controle que orquestra a busca (da memória), decodificação e execução (de instruções) dirigindo as operações coordenadas da ALU, registradores e outros componentes.

A maioria das CPUs modernas são implementadas em microprocessadores de circuito integrado (IC), com uma ou mais CPUs em um único chip IC. Chips de microprocessador com múltiplas CPUs são processadores multi-core. As CPUs físicas individuais, núcleos de processador, também podem ser multiencadeadas para criar CPUs virtuais ou lógicas adicionais.

Um IC que contém uma CPU também pode conter memória, interfaces periféricas e outros componentes de um computador; tais dispositivos integrados são chamados de microcontroladores ou sistemas em um chip (SoC).

Processadores array ou processadores vetoriais possuem múltiplos processadores que operam em paralelo, sem nenhuma unidade considerada central. CPUs virtuais são uma abstração de recursos computacionais agregados dinâmicos.

História

EDVAC, um dos primeiros computadores do programa armazenado

Os primeiros computadores, como o ENIAC, precisavam ser reconectados fisicamente para executar diferentes tarefas, o que fez com que essas máquinas fossem chamadas de "computadores de programa fixo". A "unidade central de processamento" termo está em uso desde 1955. Desde que o termo "CPU" é geralmente definido como um dispositivo para execução de software (programa de computador), os primeiros dispositivos que poderiam ser chamados de CPUs vieram com o advento do computador de programa armazenado.

A ideia de um computador com programa armazenado já estava presente no projeto do ENIAC de J. Presper Eckert e John William Mauchly, mas foi inicialmente omitida para que pudesse ser finalizada antes. Em 30 de junho de 1945, antes da criação do ENIAC, o matemático John von Neumann distribuiu o artigo intitulado Primeiro rascunho de um relatório sobre o EDVAC. Era o esboço de um computador com programa armazenado que seria concluído em agosto de 1949. O EDVAC foi projetado para executar um certo número de instruções (ou operações) de vários tipos. Significativamente, os programas escritos para o EDVAC deveriam ser armazenados na memória do computador de alta velocidade, em vez de serem especificados pela fiação física do computador. Isso superou uma limitação severa do ENIAC, que era o tempo e o esforço consideráveis necessários para reconfigurar o computador para executar uma nova tarefa. Com o projeto de von Neumann, o programa executado pelo EDVAC poderia ser alterado simplesmente alterando o conteúdo da memória. O EDVAC não foi o primeiro computador com programa armazenado; o Manchester Baby, que era um computador experimental de programa armazenado em pequena escala, executou seu primeiro programa em 21 de junho de 1948 e o Manchester Mark 1 executou seu primeiro programa durante a noite de 16 para 17 de junho de 1949.

As primeiras CPUs eram designs personalizados usados como parte de um computador maior e às vezes distinto. No entanto, esse método de projetar CPUs personalizadas para um aplicativo específico deu lugar ao desenvolvimento de processadores multifuncionais produzidos em grandes quantidades. Essa padronização começou na era dos mainframes e minicomputadores de transistores discretos e acelerou rapidamente com a popularização do circuito integrado (IC). O IC permitiu que CPUs cada vez mais complexas fossem projetadas e fabricadas com tolerâncias da ordem de nanômetros. Tanto a miniaturização quanto a padronização das CPUs aumentaram a presença de dispositivos digitais na vida moderna muito além da aplicação limitada de máquinas de computação dedicadas. Os microprocessadores modernos aparecem em dispositivos eletrônicos que variam de automóveis a telefones celulares e, às vezes, até em brinquedos.

Embora von Neumann seja mais frequentemente creditado com o projeto do computador de programa armazenado por causa de seu projeto de EDVAC, e o projeto tornou-se conhecido como a arquitetura de von Neumann, outros antes dele, como Konrad Zuse, sugeriram e implementaram ideias semelhantes. A chamada arquitetura Harvard do Harvard Mark I, que foi concluída antes do EDVAC, também usava um projeto de programa armazenado usando fita de papel perfurada em vez de memória eletrônica. A principal diferença entre as arquiteturas von Neumann e Harvard é que a última separa o armazenamento e o tratamento das instruções e dados da CPU, enquanto a primeira usa o mesmo espaço de memória para ambos. A maioria das CPUs modernas são principalmente von Neumann em design, mas CPUs com a arquitetura Harvard também são vistas, especialmente em aplicativos embarcados; por exemplo, os microcontroladores Atmel AVR são processadores de arquitetura Harvard.

Relés e tubos de vácuo (tubos termiônicos) eram comumente usados como elementos de comutação; um computador útil requer milhares ou dezenas de milhares de dispositivos de comutação. A velocidade geral de um sistema depende da velocidade das chaves. Os computadores de tubo de vácuo, como o EDVAC, tendiam a ter uma média de oito horas entre falhas, enquanto os computadores de retransmissão, como o Harvard Mark I (mais lento, mas anterior) falhavam muito raramente. No final, as CPUs baseadas em tubos tornaram-se dominantes porque as vantagens significativas de velocidade oferecidas geralmente superavam os problemas de confiabilidade. A maioria dessas primeiras CPUs síncronas funcionava com baixas taxas de clock em comparação com os designs microeletrônicos modernos. Frequências de sinal de clock variando de 100 kHz a 4 MHz eram muito comuns nessa época, limitadas em grande parte pela velocidade dos dispositivos de comutação com os quais foram construídas.

CPUs a transistor

Processador IBM PowerPC 604e

A complexidade do design das CPUs aumentou à medida que várias tecnologias facilitaram a construção de dispositivos eletrônicos menores e mais confiáveis. A primeira dessas melhorias veio com o advento do transistor. As CPUs transistorizadas durante as décadas de 1950 e 1960 não precisavam mais ser construídas com elementos de comutação volumosos, não confiáveis e frágeis, como tubos de vácuo e relés. Com essa melhoria, CPUs mais complexas e confiáveis foram construídas em uma ou várias placas de circuito impresso contendo componentes discretos (individuais).

Em 1964, a IBM introduziu sua arquitetura de computador IBM System/360 que foi usada em uma série de computadores capazes de executar os mesmos programas com velocidade e desempenho diferentes. Isso foi significativo em uma época em que a maioria dos computadores eletrônicos era incompatível entre si, mesmo aqueles fabricados pelo mesmo fabricante. Para facilitar essa melhoria, a IBM usou o conceito de microprograma (geralmente chamado de "microcódigo"), que ainda é amplamente utilizado nas CPUs modernas. A arquitetura System/360 era tão popular que dominou o mercado de computadores mainframe por décadas e deixou um legado que ainda é continuado por computadores modernos semelhantes, como o IBM zSeries. Em 1965, a Digital Equipment Corporation (DEC) introduziu outro computador influente voltado para os mercados científicos e de pesquisa, o PDP-8.

Placa Fujitsu com processadores SPARC64 VIIIfx

Os computadores baseados em transistores tinham várias vantagens distintas sobre seus predecessores. Além de facilitar maior confiabilidade e menor consumo de energia, os transistores também permitiram que as CPUs operassem em velocidades muito mais altas devido ao curto tempo de comutação de um transistor em comparação com um tubo ou relé. O aumento da confiabilidade e a velocidade dramaticamente aumentada dos elementos de comutação (que eram quase exclusivamente transistores nessa época); As taxas de clock da CPU em dezenas de megahertz foram facilmente obtidas durante este período. Além disso, enquanto transistores discretos e CPUs IC estavam em uso pesado, novos projetos de alto desempenho, como instruções únicas, processadores vetoriais de dados múltiplos (SIMD) começaram a aparecer. Esses primeiros projetos experimentais deram origem à era dos supercomputadores especializados, como os fabricados pela Cray Inc e Fujitsu Ltd.

CPUs de integração de pequena escala

CPU, memória central e interface de ônibus externo de um DEC PDP-8/I, feito de circuitos integrados de média escala

Durante este período, foi desenvolvido um método de fabricação de muitos transistores interconectados em um espaço compacto. O circuito integrado (IC) permitiu que um grande número de transistores fosse fabricado em uma única matriz baseada em semicondutores, ou "chip". No início, apenas circuitos digitais não especializados muito básicos, como portas NOR, foram miniaturizados em ICs. CPUs baseadas nesses "blocos de construção" ICs são geralmente referidos como "integração em pequena escala" (SSI). ICs SSI, como os usados no Apollo Guidance Computer, geralmente continham até algumas dezenas de transistores. Construir uma CPU inteira com ICs SSI exigia milhares de chips individuais, mas ainda consumia muito menos espaço e energia do que os designs anteriores de transistores discretos.

O System/370 da IBM, sucessor do System/360, usava ICs SSI em vez de módulos de transistores discretos da Solid Logic Technology. DEC's PDP-8/I e KI10 PDP-10 também mudaram dos transistores individuais usados pelo PDP-8 e PDP-10 para ICs SSI, e sua linha extremamente popular PDP-11 foi originalmente construída com ICs SSI, mas foi eventualmente implementado com componentes LSI, uma vez que estes se tornaram práticos.

CPUs de integração de grande escala

Lee Boysel publicou artigos influentes, incluindo um "manifesto" de 1967, que descrevia como construir o equivalente a um computador mainframe de 32 bits a partir de um número relativamente pequeno de circuitos de integração em larga escala (LSI). A única maneira de construir chips LSI, que são chips com cem ou mais portas, era construí-los usando um processo de fabricação de semicondutores de óxido de metal (MOS) (lógica PMOS, lógica NMOS ou lógica CMOS). No entanto, algumas empresas continuaram a construir processadores a partir de chips bipolares transistor-transistor logic (TTL) porque os transistores de junção bipolar eram mais rápidos do que os chips MOS até a década de 1970 (algumas empresas, como a Datapoint, continuaram a construir processadores a partir de chips TTL até o início década de 1980). Na década de 1960, os CIs MOS eram mais lentos e inicialmente considerados úteis apenas em aplicações que exigiam baixo consumo de energia. Após o desenvolvimento da tecnologia MOS de porta de silício por Federico Faggin na Fairchild Semiconductor em 1968, os ICs MOS substituíram amplamente o TTL bipolar como a tecnologia de chip padrão no início dos anos 1970.

À medida que a tecnologia microeletrônica avançava, um número crescente de transistores era colocado nos CIs, diminuindo o número de CIs individuais necessários para uma CPU completa. Os ICs MSI e LSI aumentaram a contagem de transistores para centenas e depois para milhares. Em 1968, o número de ICs necessários para construir uma CPU completa foi reduzido para 24 ICs de oito tipos diferentes, com cada IC contendo aproximadamente 1000 MOSFETs. Em total contraste com seus predecessores SSI e MSI, a primeira implementação LSI do PDP-11 continha uma CPU composta por apenas quatro circuitos integrados LSI.

Microprocessadores

Morrer de um microprocessador Intel 80486DX2 (tamanho atual: 12 × 6.75 mm) em sua embalagem
Intel Core i5 CPU em um Vaio E série laptop motherboard (à direita, abaixo do tubo de calor)
Dentro de um laptop, com a CPU removida do soquete

Desde que os microprocessadores foram introduzidos pela primeira vez, eles ultrapassaram quase completamente todos os outros métodos de implementação da unidade central de processamento. O primeiro microprocessador disponível comercialmente, fabricado em 1971, foi o Intel 4004, e o primeiro microprocessador amplamente utilizado, fabricado em 1974, foi o Intel 8080. Os fabricantes de mainframes e minicomputadores da época lançaram programas proprietários de desenvolvimento de IC para atualizar suas arquiteturas de computador mais antigas, e eventualmente produziu microprocessadores compatíveis com conjuntos de instruções que eram compatíveis com versões anteriores de seu hardware e software mais antigos. Combinado com o advento e eventual sucesso do onipresente computador pessoal, o termo CPU agora é aplicado quase exclusivamente a microprocessadores. Várias CPUs (denotadas como núcleos) podem ser combinadas em um único chip de processamento.

As gerações anteriores de CPUs foram implementadas como componentes discretos e vários pequenos circuitos integrados (ICs) em uma ou mais placas de circuito. Os microprocessadores, por outro lado, são CPUs fabricadas em um número muito pequeno de CIs; geralmente apenas um. O tamanho geral menor da CPU, como resultado de ser implementado em uma única matriz, significa um tempo de comutação mais rápido devido a fatores físicos, como diminuição da capacitância parasita do portão. Isso permitiu que os microprocessadores síncronos tivessem taxas de clock variando de dezenas de megahertz a vários gigahertz. Além disso, a capacidade de construir transistores extremamente pequenos em um CI aumentou muito a complexidade e o número de transistores em uma única CPU. Essa tendência amplamente observada é descrita pela lei de Moore, que provou ser um preditor bastante preciso do crescimento da complexidade da CPU (e de outros ICs) até 2016.

Embora a complexidade, tamanho, construção e forma geral das CPUs tenham mudado enormemente desde 1950, o design básico e a função não mudaram muito. Quase todas as CPUs comuns hoje podem ser descritas com muita precisão como máquinas de programa armazenado von Neumann. Como a lei de Moore não é mais válida, surgiram preocupações sobre os limites da tecnologia do transistor de circuito integrado. A miniaturização extrema de portões eletrônicos está fazendo com que os efeitos de fenômenos como eletromigração e vazamento de sublimiar se tornem muito mais significativos. Essas novas preocupações estão entre os muitos fatores que levam os pesquisadores a investigar novos métodos de computação, como o computador quântico, bem como a expandir o uso do paralelismo e outros métodos que ampliam a utilidade do modelo clássico de von Neumann.

Operação

A operação fundamental da maioria das CPUs, independentemente da forma física que assumam, é executar uma sequência de instruções armazenadas que é chamada de programa. As instruções a serem executadas são mantidas em algum tipo de memória do computador. Quase todas as CPUs seguem as etapas de busca, decodificação e execução em sua operação, conhecidas coletivamente como ciclo de instrução.

Após a execução de uma instrução, todo o processo se repete, com o próximo ciclo de instrução normalmente buscando a próxima instrução na sequência por causa do valor incrementado no contador do programa. Se uma instrução de salto foi executada, o contador do programa será modificado para conter o endereço da instrução que foi saltada e a execução do programa continua normalmente. Em CPUs mais complexas, várias instruções podem ser buscadas, decodificadas e executadas simultaneamente. Esta seção descreve o que geralmente é chamado de "pipeline RISC clássico", que é bastante comum entre as CPUs simples usadas em muitos dispositivos eletrônicos (geralmente chamados de microcontroladores). Ele ignora amplamente a importante função do cache da CPU e, portanto, o estágio de acesso do pipeline.

Algumas instruções manipulam o contador do programa em vez de produzir dados de resultado diretamente; tais instruções são geralmente chamadas de "saltos" e facilitar o comportamento do programa como loops, execução condicional do programa (através do uso de um salto condicional) e existência de funções. Em alguns processadores, algumas outras instruções alteram o estado dos bits em um "flags" registro. Esses sinalizadores podem ser usados para influenciar o comportamento de um programa, pois geralmente indicam o resultado de várias operações. Por exemplo, em tais processadores, um "compare" a instrução avalia dois valores e define ou limpa bits no registrador de sinalizadores para indicar qual deles é maior ou se são iguais; um desses sinalizadores poderia então ser usado por uma instrução de salto posterior para determinar o fluxo do programa.

Buscar

A busca envolve a recuperação de uma instrução (que é representada por um número ou sequência de números) da memória do programa. A localização (endereço) da instrução na memória do programa é determinada pelo contador do programa (PC; chamado de "ponteiro de instrução" nos microprocessadores Intel x86), que armazena um número que identifica o endereço do próximo instrução a ser buscada. Depois que uma instrução é buscada, o PC é incrementado pelo comprimento da instrução para que contenha o endereço da próxima instrução na sequência. Freqüentemente, a instrução a ser buscada deve ser recuperada de uma memória relativamente lenta, fazendo com que a CPU trave enquanto aguarda o retorno da instrução. Esse problema é amplamente abordado em processadores modernos por caches e arquiteturas de pipeline (veja abaixo).

Decodificar

A instrução que a CPU busca na memória determina o que a CPU fará. Na etapa de decodificação, realizada pelo circuito decodificador binário conhecido como decodificador de instrução, a instrução é convertida em sinais que controlam outras partes da CPU.

A maneira como a instrução é interpretada é definida pela arquitetura do conjunto de instruções (ISA) da CPU. Freqüentemente, um grupo de bits (ou seja, um "campo") dentro da instrução, chamado opcode, indica qual operação deve ser executada, enquanto os campos restantes geralmente fornecem informações suplementares necessárias para a operação, como como os operandos. Esses operandos podem ser especificados como um valor constante (chamado de valor imediato) ou como a localização de um valor que pode ser um registrador do processador ou um endereço de memória, conforme determinado por algum modo de endereçamento.

Em alguns projetos de CPU, o decodificador de instrução é implementado como um circuito decodificador binário imutável e conectado. Em outros, um microprograma é usado para traduzir instruções em conjuntos de sinais de configuração da CPU que são aplicados sequencialmente em vários pulsos de clock. Em alguns casos, a memória que armazena o microprograma é regravável, possibilitando alterar a forma como a CPU decodifica as instruções.

Executar

Após as etapas de busca e decodificação, a etapa de execução é realizada. Dependendo da arquitetura da CPU, isso pode consistir em uma única ação ou em uma sequência de ações. Durante cada ação, os sinais de controle ativam ou desativam eletricamente várias partes da CPU para que possam executar toda ou parte da operação desejada. A ação é então concluída, normalmente em resposta a um pulso de clock. Muitas vezes, os resultados são gravados em um registrador interno da CPU para acesso rápido por instruções subsequentes. Em outros casos, os resultados podem ser gravados em uma memória principal mais lenta, mas menos dispendiosa e de maior capacidade.

Por exemplo, se uma instrução de adição for executada, os registradores contendo operandos (números a serem somados) são ativados, assim como as partes da unidade lógica aritmética (ULA) que realizam a adição. Quando ocorre o pulso de clock, os operandos fluem dos registradores de origem para a ALU e a soma aparece em sua saída. Nos pulsos de clock subsequentes, outros componentes são habilitados (e desabilitados) para mover a saída (a soma da operação) para armazenamento (por exemplo, um registrador ou memória). Se a soma resultante for muito grande (ou seja, maior que o tamanho da palavra de saída da ALU), um sinalizador de estouro aritmético será definido, influenciando a próxima operação.

Estrutura e implementação

Diagrama de bloco de um computador básico uniprocessador-CPU. As linhas pretas indicam fluxo de dados, enquanto as linhas vermelhas indicam fluxo de controle; as setas indicam direções de fluxo.

Conectado ao circuito de uma CPU está um conjunto de operações básicas que ela pode executar, chamado de conjunto de instruções. Tais operações podem envolver, por exemplo, adicionar ou subtrair dois números, comparar dois números ou pular para uma parte diferente de um programa. Cada instrução é representada por uma combinação única de bits, conhecida como opcode da linguagem de máquina. Ao processar uma instrução, a CPU decodifica o opcode (através de um decodificador binário) em sinais de controle, que orquestram o comportamento da CPU. Uma instrução completa em linguagem de máquina consiste em um opcode e, em muitos casos, bits adicionais que especificam argumentos para a operação (por exemplo, os números a serem somados no caso de uma operação de adição). Subindo na escala de complexidade, um programa em linguagem de máquina é uma coleção de instruções em linguagem de máquina que a CPU executa.

A operação matemática real para cada instrução é realizada por um circuito lógico combinacional dentro do processador da CPU, conhecido como unidade aritmética-lógica ou ALU. Em geral, uma CPU executa uma instrução buscando-a na memória, usando sua ALU para executar uma operação e armazenando o resultado na memória. Além das instruções para matemática inteira e operações lógicas, existem várias outras instruções de máquina, como aquelas para carregar dados da memória e armazená-los de volta, operações de ramificação e operações matemáticas em números de ponto flutuante executadas pelo processador flutuante da CPU. unidade de ponto (FPU).

Unidade de controle

A unidade de controle (UC) é um componente da CPU que direciona a operação do processador. Ele informa à memória do computador, à unidade lógica e aritmética e aos dispositivos de entrada e saída como responder às instruções que foram enviadas ao processador.

Direciona a operação das outras unidades, fornecendo sinais de controle e temporização. A maioria dos recursos do computador são gerenciados pela UC. Ele direciona o fluxo de dados entre a CPU e os outros dispositivos. John von Neumann incluiu a unidade de controle como parte da arquitetura von Neumann. Em projetos de computadores modernos, a unidade de controle é normalmente uma parte interna da CPU com sua função geral e operação inalterada desde sua introdução.

Unidade lógica aritmética

Representação simbólica de um ALU e seus sinais de entrada e saída

A unidade lógica aritmética (ALU) é um circuito digital dentro do processador que executa operações aritméticas inteiras e lógicas bit a bit. As entradas da ALU são as palavras de dados a serem operadas (chamadas de operandos), informações de status de operações anteriores e um código da unidade de controle indicando qual operação realizar. Dependendo da instrução que está sendo executada, os operandos podem vir de registradores internos da UCP, memória externa ou constantes geradas pela própria ALU.

Quando todos os sinais de entrada forem estabilizados e propagados através do circuito da ALU, o resultado da operação executada aparecerá nas saídas da ALU. O resultado consiste em uma palavra de dados, que pode ser armazenada em um registrador ou memória, e em informações de status que são normalmente armazenadas em um registrador especial interno da CPU reservado para essa finalidade.

Unidade de geração de endereços

A unidade de geração de endereço (AGU), às vezes também chamada de unidade de computação de endereço (ACU), é uma unidade de execução dentro da CPU que calcula os endereços usados pela CPU para acessar a memória principal. Ao ter os cálculos de endereço manipulados por circuitos separados que operam em paralelo com o restante da CPU, o número de ciclos da CPU necessários para executar várias instruções de máquina pode ser reduzido, trazendo melhorias de desempenho.

Ao executar várias operações, as CPUs precisam calcular os endereços de memória necessários para buscar dados na memória; por exemplo, as posições na memória dos elementos da matriz devem ser calculadas antes que a CPU possa buscar os dados dos locais reais da memória. Esses cálculos de geração de endereço envolvem diferentes operações aritméticas inteiras, como adição, subtração, operações de módulo ou deslocamentos de bits. Freqüentemente, calcular um endereço de memória envolve mais de uma instrução de máquina de uso geral, que não necessariamente decodifica e executa rapidamente. Ao incorporar um AGU em um projeto de CPU, juntamente com a introdução de instruções especializadas que usam o AGU, vários cálculos de geração de endereço podem ser descarregados do resto da CPU e, muitas vezes, podem ser executados rapidamente em um único ciclo de CPU.

Os recursos de uma AGU dependem de uma CPU específica e de sua arquitetura. Assim, algumas AGUs implementam e expõem mais operações de cálculo de endereços, enquanto outras também incluem instruções especializadas mais avançadas que podem operar em vários operandos ao mesmo tempo. Algumas arquiteturas de CPU incluem várias AGUs para que mais de uma operação de cálculo de endereço possa ser executada simultaneamente, o que traz mais melhorias de desempenho devido à natureza superescalar de designs avançados de CPU. Por exemplo, a Intel incorpora várias AGUs em suas microarquiteturas Sandy Bridge e Haswell, que aumentam a largura de banda do subsistema de memória da CPU, permitindo que várias instruções de acesso à memória sejam executadas em paralelo.

Unidade de gerenciamento de memória (MMU)

Muitos microprocessadores (em smartphones e desktops, laptops, computadores servidores) possuem uma unidade de gerenciamento de memória, traduzindo endereços lógicos em endereços de RAM físicos, fornecendo proteção de memória e habilidades de paginação, úteis para memória virtual. Processadores mais simples, especialmente microcontroladores, geralmente não incluem um MMU.

Cache

Um cache de CPU é um cache de hardware usado pela unidade central de processamento (CPU) de um computador para reduzir o custo médio (tempo ou energia) para acessar dados da memória principal. Um cache é uma memória menor e mais rápida, mais próxima do núcleo do processador, que armazena cópias dos dados dos locais da memória principal usados com frequência. A maioria das CPUs tem diferentes caches independentes, incluindo caches de instrução e dados, onde o cache de dados é geralmente organizado como uma hierarquia de mais níveis de cache (L1, L2, L3, L4, etc.).

Todas as CPUs modernas (rápidas) (com poucas exceções especializadas) têm vários níveis de caches de CPU. As primeiras CPUs que usavam um cache tinham apenas um nível de cache; ao contrário dos caches de nível 1 posteriores, ele não foi dividido em L1d (para dados) e L1i (para instruções). Quase todas as CPUs atuais com caches têm um cache L1 dividido. Eles também têm caches L2 e, para processadores maiores, caches L3 também. O cache L2 geralmente não é dividido e atua como um repositório comum para o cache L1 já dividido. Cada núcleo de um processador multi-core tem um cache L2 dedicado e geralmente não é compartilhado entre os núcleos. O cache L3 e os caches de nível superior são compartilhados entre os núcleos e não são divididos. Atualmente, um cache L4 é incomum e geralmente está na memória dinâmica de acesso aleatório (DRAM), e não na memória estática de acesso aleatório (SRAM), em uma matriz ou chip separado. Esse também foi o caso historicamente com o L1, enquanto chips maiores permitiram a integração dele e geralmente de todos os níveis de cache, com a possível exceção do último nível. Cada nível extra de cache tende a ser maior e otimizado de forma diferente.

Existem outros tipos de caches (que não são contabilizados no "tamanho do cache" dos caches mais importantes mencionados acima), como o Translation Lookaside Buffer (TLB) que faz parte da unidade de gerenciamento de memória (MMU) que a maioria das CPUs possui.

Os caches geralmente são dimensionados em potências de dois: 2, 8, 16 etc. KiB ou MiB (para tamanhos maiores não L1), embora o IBM z13 tenha um cache de instrução L1 de 96 KiB.

Taxa de clock

A maioria das CPUs são circuitos síncronos, o que significa que eles empregam um sinal de clock para controlar suas operações sequenciais. O sinal de clock é produzido por um circuito oscilador externo que gera um número consistente de pulsos a cada segundo na forma de uma onda quadrada periódica. A frequência dos pulsos de clock determina a taxa na qual uma CPU executa instruções e, consequentemente, quanto mais rápido o clock, mais instruções a CPU executará a cada segundo.

Para garantir a operação adequada da CPU, o período do clock é maior que o tempo máximo necessário para que todos os sinais se propaguem (movam) pela CPU. Ao definir o período do relógio para um valor bem acima do atraso de propagação do pior caso, é possível projetar toda a CPU e a maneira como ela move os dados pelas "bordas" do sinal de relógio subindo e descendo. Isso tem a vantagem de simplificar significativamente a CPU, tanto da perspectiva do design quanto da contagem de componentes. No entanto, também traz a desvantagem de que toda a CPU deve aguardar seus elementos mais lentos, embora algumas partes dela sejam muito mais rápidas. Essa limitação foi amplamente compensada por vários métodos de aumentar o paralelismo da CPU (veja abaixo).

No entanto, as melhorias arquitetônicas sozinhas não resolvem todas as desvantagens das CPUs síncronas globalmente. Por exemplo, um sinal de relógio está sujeito aos atrasos de qualquer outro sinal elétrico. Taxas de clock mais altas em CPUs cada vez mais complexas tornam mais difícil manter o sinal de clock em fase (sincronizado) em toda a unidade. Isso levou muitas CPUs modernas a exigir que vários sinais de relógio idênticos fossem fornecidos para evitar o atraso de um único sinal de forma significativa o suficiente para causar mau funcionamento da CPU. Outro grande problema, à medida que as taxas de clock aumentam drasticamente, é a quantidade de calor que é dissipada pela CPU. O relógio em constante mudança faz com que muitos componentes mudem, independentemente de estarem sendo usados naquele momento. Em geral, um componente que está comutando usa mais energia do que um elemento em estado estático. Portanto, à medida que a taxa de clock aumenta, também aumenta o consumo de energia, fazendo com que a CPU exija mais dissipação de calor na forma de soluções de resfriamento da CPU.

Um método de lidar com a troca de componentes desnecessários é chamado de clock gating, que envolve desligar o sinal de clock para componentes desnecessários (desativando-os efetivamente). No entanto, isso geralmente é considerado difícil de implementar e, portanto, não é usado comumente fora de projetos de baixo consumo de energia. Um notável design de CPU recente que usa extensa variação de clock é o Xenon baseado em IBM PowerPC usado no Xbox 360; dessa forma, os requisitos de energia do Xbox 360 são bastante reduzidos.

CPUs sem clock

Outro método de abordar alguns dos problemas com um sinal de relógio global é a remoção do sinal de relógio completamente. Embora a remoção do sinal de relógio global torne o processo de projeto consideravelmente mais complexo de várias maneiras, os projetos assíncronos (ou sem relógio) apresentam vantagens marcantes no consumo de energia e na dissipação de calor em comparação com projetos síncronos semelhantes. Embora um tanto incomum, CPUs assíncronas inteiras foram construídas sem usar um sinal de relógio global. Dois exemplos notáveis disso são o AMULET compatível com ARM e o MiniMIPS compatível com MIPS R3000.

Em vez de remover totalmente o sinal de clock, alguns projetos de CPU permitem que certas partes do dispositivo sejam assíncronas, como o uso de ALUs assíncronas em conjunto com pipelining superescalar para obter alguns ganhos de desempenho aritmético. Embora não esteja totalmente claro se os projetos totalmente assíncronos podem ter um desempenho comparável ou melhor do que suas contrapartes síncronas, é evidente que eles pelo menos se destacam em operações matemáticas mais simples. Isso, combinado com seu excelente consumo de energia e propriedades de dissipação de calor, os torna muito adequados para computadores embarcados.

Módulo regulador de tensão

Muitas CPUs modernas têm um módulo de gerenciamento de energia integrado à matriz que regula o fornecimento de tensão sob demanda para os circuitos da CPU, permitindo manter o equilíbrio entre desempenho e consumo de energia.

Intervalo inteiro

Cada CPU representa valores numéricos de uma maneira específica. Por exemplo, alguns dos primeiros computadores digitais representavam números como valores familiares do sistema numérico decimal (base 10), e outros empregaram representações mais incomuns, como ternário (base três). Quase todas as CPUs modernas representam números em forma binária, com cada dígito sendo representado por alguma quantidade física de dois valores, como um "alto" ou "baixo" tensão.

Uma palavra de seis bits contendo a representação codificada binária do valor decimal 40. A maioria das CPUs modernas empregam tamanhos de palavras que são um poder de dois, por exemplo 8, 16, 32 ou 64 bits.

Relacionado à representação numérica está o tamanho e a precisão dos números inteiros que uma CPU pode representar. No caso de uma CPU binária, isso é medido pelo número de bits (dígitos significativos de um inteiro codificado em binário) que a CPU pode processar em uma operação, que é comumente chamada de tamanho de palavra, largura de bit, largura do caminho de dados, precisão inteira ou tamanho inteiro. O tamanho inteiro de uma CPU determina o intervalo de valores inteiros nos quais ela pode operar diretamente. Por exemplo, uma CPU de 8 bits pode manipular diretamente números inteiros representados por oito bits, que têm um intervalo de 256 (28) valores inteiros discretos.

O intervalo inteiro também pode afetar o número de locais de memória que a CPU pode endereçar diretamente (um endereço é um valor inteiro que representa um local de memória específico). Por exemplo, se uma CPU binária usa 32 bits para representar um endereço de memória, ela pode endereçar diretamente 2 32 locais de memória. Para contornar essa limitação e por vários outros motivos, algumas CPUs usam mecanismos (como troca de banco) que permitem o endereçamento de memória adicional.

CPUs com tamanhos de palavras maiores requerem mais circuitos e, consequentemente, são fisicamente maiores, custam mais e consomem mais energia (e, portanto, geram mais calor). Como resultado, microcontroladores menores de 4 ou 8 bits são comumente usados em aplicativos modernos, embora CPUs com tamanhos de palavra muito maiores (como 16, 32, 64 e até 128 bits) estejam disponíveis. Quando um desempenho maior é necessário, no entanto, os benefícios de um tamanho de palavra maior (intervalos de dados e espaços de endereço maiores) podem superar as desvantagens. Uma CPU pode ter caminhos de dados internos menores que o tamanho da palavra para reduzir tamanho e custo. Por exemplo, embora o conjunto de instruções do IBM System/360 fosse um conjunto de instruções de 32 bits, o System/360 Modelo 30 e o Modelo 40 tinham caminhos de dados de 8 bits na unidade lógica aritmética, de modo que uma adição de 32 bits exigia quatro ciclos, um para cada 8 bits dos operandos, e, embora o conjunto de instruções da série Motorola 68000 fosse um conjunto de instruções de 32 bits, o Motorola 68000 e o Motorola 68010 tinham caminhos de dados de 16 bits na unidade lógica aritmética, de modo que um A adição de 32 bits exigia dois ciclos.

Para obter algumas das vantagens oferecidas por comprimentos de bits menores e maiores, muitos conjuntos de instruções têm diferentes larguras de bits para dados inteiros e de ponto flutuante, permitindo que as CPUs que implementam esse conjunto de instruções tenham diferentes larguras de bits para diferentes partes do dispositivo. Por exemplo, o conjunto de instruções do IBM System/360 era principalmente de 32 bits, mas suportava valores de ponto flutuante de 64 bits para facilitar maior precisão e alcance em números de ponto flutuante. O System/360 Modelo 65 tinha um somador de 8 bits para aritmética binária decimal e de ponto fixo e um somador de 60 bits para aritmética de ponto flutuante. Muitos designs de CPU posteriores usam largura de bit mista semelhante, especialmente quando o processador é destinado para uso geral, onde é necessário um equilíbrio razoável de capacidade de número inteiro e ponto flutuante.

Paralelismo

Modelo de uma CPU subscalar, em que leva quinze ciclos de relógio para completar três instruções

A descrição da operação básica de uma CPU oferecida na seção anterior descreve a forma mais simples que uma CPU pode assumir. Este tipo de CPU, geralmente referido como subescalar, opera e executa uma instrução em um ou dois dados por vez, ou seja, menos de uma instrução por ciclo de clock (IPC < 1).

Este processo dá origem a uma ineficiência inerente em CPUs subescalares. Como apenas uma instrução é executada por vez, toda a CPU deve aguardar a conclusão dessa instrução antes de prosseguir para a próxima instrução. Como resultado, a CPU subescalar fica "desligada" em instruções que levam mais de um ciclo de clock para completar a execução. Mesmo adicionando uma segunda unidade de execução (veja abaixo) não melhora muito o desempenho; em vez de um caminho ser interrompido, agora dois caminhos são interrompidos e o número de transistores não utilizados é aumentado. Este projeto, em que os recursos de execução da CPU podem operar em apenas uma instrução por vez, só pode atingir desempenho escalar (uma instrução por ciclo de clock, IPC = 1). No entanto, o desempenho é quase sempre subescalar (menos de uma instrução por ciclo de clock, IPC < 1).

As tentativas de alcançar escalar e melhor desempenho resultaram em uma variedade de metodologias de projeto que fazem com que a CPU se comporte menos linearmente e mais em paralelo. Ao se referir ao paralelismo em CPUs, dois termos são geralmente usados para classificar essas técnicas de projeto:

  • paralelismo de nível de instrução (ILP), que busca aumentar a taxa em que as instruções são executadas dentro de uma CPU (isto é, para aumentar o uso de recursos de execução on-die);
  • paralelismo de nível de tarefa (TLP), que pretende aumentar o número de threads ou processos que uma CPU pode executar simultaneamente.

Cada metodologia difere tanto nas formas como são implementadas quanto na eficácia relativa que proporcionam no aumento do desempenho da CPU para um aplicativo.

Paralelismo em nível de instrução

Oleoduto básico de cinco estágios. No melhor cenário, este pipeline pode sustentar uma taxa de conclusão de uma instrução por ciclo de relógio.

Um dos métodos mais simples para aumentar o paralelismo é começar as primeiras etapas de busca e decodificação de instruções antes que a instrução anterior termine a execução. Essa é uma técnica conhecida como pipelining de instrução e é usada em quase todas as CPUs modernas de uso geral. O pipelining permite que várias instruções sejam executadas por vez, dividindo o caminho de execução em estágios discretos. Essa separação pode ser comparada a uma linha de montagem, na qual uma instrução se torna mais completa a cada estágio até sair do pipeline de execução e ser retirada.

Pipelining, no entanto, introduz a possibilidade de uma situação em que o resultado da operação anterior é necessário para concluir a próxima operação; uma condição geralmente chamada de conflito de dependência de dados. Portanto, os processadores com pipeline devem verificar esses tipos de condições e atrasar uma parte do pipeline, se necessário. Um processador com pipeline pode se tornar quase escalar, inibido apenas por paradas de pipeline (uma instrução gastando mais de um ciclo de clock em um estágio).

Um pipeline superscalar simples. Ao buscar e enviar duas instruções de cada vez, um máximo de duas instruções por ciclo de relógio pode ser concluído.

Melhorias no pipelining de instrução levaram a reduções ainda maiores no tempo ocioso dos componentes da CPU. Os projetos considerados superescalares incluem um longo pipeline de instruções e várias unidades de execução idênticas, como unidades load-store, unidades aritméticas-lógicas, unidades de ponto flutuante e unidades de geração de endereço. Em um pipeline superescalar, as 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). Caso positivo, são despachados para as unidades executoras, resultando em sua execução simultânea. Em geral, o número de instruções que uma CPU superescalar completará em um ciclo depende do número de instruções que ela é capaz de despachar simultaneamente para as unidades de execução.

A maior parte da dificuldade no projeto de uma arquitetura de CPU superescalar reside na criação de um despachante eficaz. O despachante precisa ser capaz de determinar rapidamente se as instruções podem ser executadas em paralelo, bem como despachá-las de forma a manter o maior número possível de unidades de execução ocupadas. Isso requer que o pipeline de instruções seja preenchido com a maior frequência possível e requer quantidades significativas de cache da CPU. Ele também torna as técnicas de prevenção de riscos, como previsão de ramificação, execução especulativa, renomeação de registro, execução fora de ordem e memória transacional cruciais para manter altos níveis de desempenho. Ao tentar prever qual ramificação (ou caminho) uma instrução condicional seguirá, a CPU pode minimizar o número de vezes que todo o pipeline deve esperar até que uma instrução condicional seja concluída. A execução especulativa geralmente fornece aumentos de desempenho modestos executando partes do código que podem não ser necessárias após a conclusão de uma operação condicional. A execução fora de ordem reorganiza um pouco a ordem na qual as instruções são executadas para reduzir atrasos devido a dependências de dados. Também no caso de um único fluxo de instrução, vários fluxos de dados - um caso em que muitos dados do mesmo tipo precisam ser processados -, os processadores modernos podem desabilitar partes do pipeline para que, quando uma única instrução for executada várias vezes, a CPU ignora as fases de busca e decodificação e, assim, aumenta muito o desempenho em certas ocasiões, especialmente em mecanismos de programas altamente monótonos, como software de criação de vídeo e processamento de fotos.

Quando apenas uma fração da CPU é superescalar, a parte que não é sofre uma penalidade de desempenho devido a paralisações de agendamento. O Intel P5 Pentium tinha duas ALUs superescalares que podiam aceitar uma instrução por ciclo de clock cada, mas sua FPU não. Assim, o P5 era superescalar inteiro, mas não superescalar de ponto flutuante. O sucessor da Intel para a arquitetura P5, o P6, adicionou habilidades superescalares aos seus recursos de ponto flutuante.

Pipelining simples e design superescalar aumentam o ILP de uma CPU, permitindo que ela execute instruções a taxas superiores a uma instrução por ciclo de clock. A maioria dos projetos de CPU modernos são pelo menos um pouco superescalares, e quase todas as CPUs de uso geral projetadas na última década são superescalares. Nos últimos anos, parte da ênfase no projeto de computadores de alto ILP foi transferida do hardware da CPU para sua interface de software ou arquitetura de conjunto de instruções (ISA). A estratégia da palavra de instrução muito longa (VLIW) faz com que algum ILP seja implícito diretamente pelo software, reduzindo o trabalho da CPU em aumentar o ILP e, assim, reduzir a complexidade do projeto.

Paralelismo em nível de tarefa

Outra estratégia para obter desempenho é executar vários threads ou processos em paralelo. Esta área de pesquisa é conhecida como computação paralela. Na taxonomia de Flynn, essa estratégia é conhecida como fluxo múltiplo de instruções, fluxo múltiplo de dados (MIMD).

Uma tecnologia usada para esse fim foi o multiprocessamento (MP). O sabor inicial dessa tecnologia é conhecido como multiprocessamento simétrico (SMP), em que um pequeno número de CPUs compartilha uma visão coerente de seu sistema de memória. Nesse esquema, cada CPU possui hardware adicional para manter uma visão constantemente atualizada da memória. Ao evitar exibições obsoletas de 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 cooperantes além de um punhado, esquemas como acesso não uniforme à memória (NUMA) e protocolos de coerência baseados em diretórios foram introduzidos na década de 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 suas interconexões são todos implementados em um único chip, a tecnologia é conhecida como chip-level multiprocessing (CMP) e o chip único como um processador multi-core.

Mais tarde, foi reconhecido que o paralelismo de grão mais fino existia com um único programa. Um único programa pode ter vários threads (ou funções) que podem ser executados separadamente ou em paralelo. Alguns dos primeiros exemplos dessa tecnologia implementaram processamento de entrada/saída, como acesso direto à memória como um thread separado do thread de computação. Uma abordagem mais geral para essa tecnologia foi introduzida na década de 1970, quando os sistemas foram projetados para executar vários threads de computação em paralelo. Esta tecnologia é conhecida como multi-threading (MT). Essa abordagem é considerada mais econômica do que o 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. No MT, as unidades de execução e o sistema de memória, incluindo os caches, são compartilhados entre vários threads. A desvantagem do MT é que o suporte de hardware para multithreading é mais visível para o software do que o do MP e, portanto, o software supervisor, como sistemas operacionais, precisa passar por mudanças maiores para oferecer suporte ao MT. Um tipo de MT que foi implementado é conhecido como multithreading temporal, onde um thread é executado até ficar parado esperando que os dados retornem da memória externa. Nesse esquema, a CPU alternaria rapidamente o contexto para outro thread que está pronto para ser executado, a alternância geralmente feita em um ciclo de clock da CPU, como o UltraSPARC T1. Outro tipo de MT é o multithreading simultâneo, onde as instruções de vários threads são executadas em paralelo dentro de um ciclo de clock da CPU.

Por várias décadas, desde a década de 1970 até o início dos anos 2000, o foco no projeto de CPUs de uso geral de alto desempenho foi em grande parte alcançar alto ILP por meio de tecnologias como pipelining, caches, execução superescalar, execução fora de ordem etc. culminou em CPUs grandes e com alto consumo de energia, como o Intel Pentium 4. No início dos anos 2000, os projetistas de CPU foram impedidos de obter desempenho superior com técnicas de ILP devido à crescente disparidade entre as frequências de operação da CPU e as frequências de operação da memória principal, bem como o aumento da CPU dissipação de energia devido a técnicas ILP mais esotéricas.

Os projetistas de CPU então emprestaram ideias de mercados de computação comercial, como processamento de transações, onde o desempenho agregado de vários programas, também conhecido como computação de throughput, era mais importante do que o desempenho de um único thread ou processo.

Essa inversão de ênfase é evidenciada pela proliferação de designs de processador dual e mais core e, notavelmente, pelos designs mais recentes da Intel que se assemelham à sua arquitetura P6 menos superescalar. Projetos tardios em várias famílias de processadores exibem CMP, incluindo x86-64 Opteron e Athlon 64 X2, SPARC UltraSPARC T1, IBM POWER4 e POWER5, bem como várias CPUs de console de videogame, como o Xbox 360's triple-core PowerPC design e o microprocessador Cell de 7 núcleos do PlayStation 3.

Paralelismo de dados

Um paradigma menos comum, mas cada vez mais importante, dos processadores (e, de fato, da computação em geral) lida com o paralelismo de dados. Os processadores discutidos anteriormente são todos referidos como algum tipo de dispositivo escalar. Como o nome indica, os processadores vetoriais lidam com vários dados no contexto de uma instrução. Isso contrasta com os processadores escalares, que lidam com um dado para cada instrução. Usando a taxonomia de Flynn, esses dois esquemas de tratamento de dados são geralmente chamados de fluxo de instrução única, fluxo de dados múltiplos (SIMD) e instrução única fluxo, dados únicos fluxo (SISD), respectivamente. A grande utilidade na criação de processadores que lidam com vetores de dados está na otimização de tarefas que tendem a exigir que a mesma operação (por exemplo, uma soma ou um produto escalar) seja executada em um grande conjunto de dados. Alguns exemplos clássicos desses tipos de tarefas incluem aplicativos multimídia (imagens, vídeo e som), bem como muitos tipos de tarefas científicas e de engenharia. Enquanto um processador escalar deve completar todo o processo de busca, decodificação e execução de cada instrução e valor em um conjunto de dados, um processador vetorial pode executar uma única operação em um conjunto comparativamente grande de dados com uma instrução. 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 dos primeiros processadores vetoriais, como o Cray-1, foram associados quase exclusivamente a pesquisas científicas e aplicativos de criptografia. No entanto, como a multimídia mudou amplamente para a mídia digital, a necessidade de alguma forma de SIMD em processadores de uso geral tornou-se significativa. Logo depois que a inclusão de unidades de ponto flutuante começou a se tornar comum em processadores de uso geral, especificações e implementações de unidades de execução SIMD também começaram a aparecer para processadores de uso geral. Algumas dessas especificações SIMD iniciais - como Multimedia Acceleration eXtensions (MAX) da HP e MMX da Intel - eram apenas números inteiros. Isso provou ser um impedimento significativo para alguns desenvolvedores de software, já que muitos dos aplicativos que se beneficiam do SIMD lidam principalmente com números de ponto flutuante. Progressivamente, os desenvolvedores refinaram e refizeram esses projetos iniciais em algumas das especificações SIMD modernas comuns, que geralmente são associadas a uma arquitetura de conjunto de instruções (ISA). Alguns exemplos modernos notáveis incluem o Streaming SIMD Extensions (SSE) da Intel e o AltiVec relacionado ao PowerPC (também conhecido como VMX).

Contador de desempenho de hardware

Muitas arquiteturas modernas (incluindo as incorporadas) geralmente incluem contadores de desempenho de hardware (HPC), que permitem coleta de baixo nível (nível de instrução), benchmarking, depuração ou análise de métricas de software em execução. O HPC também pode ser usado para descobrir e analisar atividades incomuns ou suspeitas do software, como exploits de programação orientada a retorno (ROP) ou programação orientada a sigreturn (SROP), etc. Isso geralmente é feito por equipes de segurança de software para avaliar e encontrar programas binários maliciosos.

Muitos fornecedores importantes (como IBM, Intel, AMD e Arm etc.) fornecem interfaces de software (geralmente escritas em C/C++) que podem ser usadas para coletar dados de registros de CPUs para obter métricas. Os fornecedores de sistemas operacionais também fornecem software como perf (Linux) para registrar, comparar ou rastrear eventos de CPU executando kernels e aplicativos.

CPUs virtuais

A computação em nuvem pode envolver a subdivisão da operação da CPU em unidades de processamento central virtual (vCPUs).

Um host é o equivalente virtual de uma máquina física, na qual um sistema virtual está operando. Quando existem várias máquinas físicas operando em conjunto e gerenciadas como um todo, os recursos de computação e memória agrupados formam um cluster. Em alguns sistemas, é possível adicionar e remover dinamicamente de um cluster. Os recursos disponíveis em nível de host e cluster podem ser particionados em pools de recursos com granularidade fina.

Desempenho

O desempenho ou velocidade de um processador depende, entre muitos outros fatores, da taxa de clock (geralmente dada em múltiplos de hertz) e das instruções por clock (IPC), que juntos são os fatores para as instruções por segundo (IPS) que a CPU pode executar. Muitos valores de IPS relatados representaram "pico" taxas de execução em sequências de instruções artificiais com poucas ramificações, enquanto as cargas de trabalho realistas consistem em uma mistura de instruções e aplicativos, alguns dos quais demoram mais para serem executados do que outros. O desempenho da hierarquia de memória também afeta muito o desempenho do processador, um problema pouco considerado nos cálculos do MIPS. Devido a esses problemas, vários testes padronizados, geralmente chamados de "benchmarks" para esta finalidade—como SPECint—foram desenvolvidos para tentar medir o desempenho efetivo real em aplicativos comumente usados.

O desempenho de processamento de computadores é aumentado pelo uso de processadores multi-core, que basicamente conectam dois ou mais processadores individuais (chamados de núcleos neste sentido) em um circuito integrado. Idealmente, um processador dual core seria quase duas vezes mais poderoso que um processador single core. Na prática, o ganho de desempenho é muito menor, apenas cerca de 50%, devido a algoritmos de software e implementação imperfeitos. Aumentar o número de núcleos em um processador (ou seja, dual-core, quad-core, etc.) aumenta a carga de trabalho que pode ser tratada. Isso significa que o processador agora pode lidar com vários eventos assíncronos, interrupções, etc., que podem afetar a CPU quando sobrecarregados. Esses núcleos podem ser pensados como andares diferentes em uma planta de processamento, com cada andar lidando com uma tarefa diferente. Às vezes, esses núcleos lidam com as mesmas tarefas que os núcleos adjacentes a eles, se um único núcleo não for suficiente para lidar com as informações.

Devido a recursos específicos das CPUs modernas, como multithreading simultâneo e uncore, que envolvem o compartilhamento de recursos reais da CPU enquanto visam o aumento da utilização, monitorar os níveis de desempenho e o uso do hardware tornou-se gradualmente uma tarefa mais complexa. Como resposta, algumas CPUs implementam lógica de hardware adicional que monitora o uso real de várias partes de uma CPU e fornece vários contadores acessíveis ao software; um exemplo é a tecnologia Performance Counter Monitor da Intel.

Contenido relacionado

Kremvax

Kremvax era originalmente um site fictício da Usenet no Kremlin, nomeado como o então grande número de Usenet VAXen com nomes no formato foovax. Kremvax...

KL0

Kernel Language 0 é uma linguagem de programação de lógica sequencial baseada em Prolog, usada no projeto de computador ICOT de quinta...

Modelo de Objeto de Documento

O Document Object Model é uma plataforma cruzada e uma interface independente de linguagem que trata um documento XML ou HTML como uma estrutura de árvore...
Más resultados...
Tamaño del texto:
Copiar