Por Dentro da Microarquitetura Intel Core
Por Gabriel Torres e Cássio Lima em 25 de abril de 2006
Introdução
A nova microarquitetura Intel Core, que foi divulgada durante o IDF Spring 2006, será usada em todos os novos processadores da Intel, como o Merom, o Conroe e o Woodcrest. Esta nova arquitetura é baseada na arquitetura do Pentium M, trazendo algumas novas características. Neste tutorial mostraremos a fundo como funciona esta nova arquitetura da Intel funciona.
A primeira coisa que se deve ter em mente é que, apesar do nome, a arquitetura Core não tem nada a ver com os processadores Core Solo e Core Duo da Intel. O Core Solo nada mais é do que um Pentium M com tecnologia de 65 nm, enquanto que o Core Duo – também conhecido pelo seu nome-código Yonah – é uma versão de dois núcleos do processador Pentium M com tecnologia de 65 nm.
O Pentium M é um processador voltado para o mercado de notebooks e é baseado na arquitetura Intel de 6ª geração, também conhecida como P6, que é a mesma arquitetura usada pelos processadores Pentium Pro, Pentium II, Pentium III e os primeiros modelos de Celeron. Você pode pensar no Pentium M como uma versão aprimorada do Pentium III. Portanto, você pode pensar na arquitetura Core como um Pentium M melhorado.
Para uma maior compreensão deste tutorial sugerimos que você leia antes os tutorias Como os Processadores Funcionam e Por Dentro da Arquitetura do Pentium M. O primeiro explica como um processador funciona, e o segundo explica como o Pentium M trabalha internamente. Na verdade, podemos considerar o presente tutorial como seqüência desses tutoriais. Sugerimos também que você leia nosso tutorial Por Dentro da Arquitetura do Pentium 4 para poder comparar as diferenças entre a arquitetura do Pentium 4 e a arquitetura Core.
A arquitetura Core tem um pipeline de 14 estágios. Pipeline é uma lista de todos os estágios que uma dada instrução precisa percorrer para ser executada. A Intel não divulgou o pipeline do Pentium M e até agora eles não publicaram nada a respeito da descrição de cada estágio do pipeline da arquitetura Core, o que nos impossibilita de fornecer informações mais detalhas sobre o assunto. O pipeline do Pentium III tinha 11 estágios, o Pentium 4 original tinha um pipeline de 20 estágios e os novos modelos de Pentium 4 baseados no núcleo Prescott tem um pipeline de 31 estágios!
Claro que se a Intel publicar mais detalhes a respeito da arquitetura Core atualizaremos este tutorial.
Falaremos agora sobre as diferenças entre a arquitetura Core e a arquitetura do Pentium M.
Cache de Memória e Unidade de Busca
Só para relembrar, o cache de memória é uma memória de alta velocidade (RAM estática ou SRAM) que está dentro do processador, usada para armazenar dados que o processador pode precisar. Se o dado requerido pelo processador não estiver localizado no cache, ele deve buscá-lo na lenta memória RAM, o que reduz o desempenho do micro, já que o processador acessa a memória RAM através do barramento local. Por exemplo, em um processador de 3,2 GHz, o cache de memória é acessado a 3,2 GHz enquanto que a memória RAM é acessada a apenas 800 MHz.
A arquitetura Core foi criada com o conceito da tecnologia de múltiplos núcleos em mente, ou seja, mais de um núcleo de processamento dentro de um único processador físico. O processador Pentium D é uma versão de dois núcleos do Pentium 4 e cada núcleo tem o seu próprio cache L2. O problema desta implementação é que em um dado momento o cache de memória L2 de um dos núcleos pode “acabar”, enquanto que o cache L2 do outro núcleo ainda tem partes não usadas. Quando isto acontece o primeiro núcleo precisa ir à lenta memória RAM, mesmo que haja espaço no cache L2 do segundo núcleo que poderia ser usado para armazenar dados e evitar que o primeiro núcleo acessasse a memória RAM.
Na arquitetura Core este problema foi resolvido. O cache de memória L2 é compartilhado, o que significa que ambos os núcleos podem usar a mesma memória cache L2, configurando dinamicamente a quantidade que cada núcleo usará. Em um processador com 2 MB de cache L2, por exemplo, um núcleo pode estar usando 1,5 MB enquanto que o outro pode estar usando 512 KB (0,5 MB), ao contrário do valor fixo 50%-50% usado pelos processadores de dois núcleos da arquitetura anterior.
E não é só isso. As pré-buscas são compartilhadas entre os núcleos, ou seja, se o controlador de cache carregar um bloco de dados para ser usado pelo primeiro núcleo, o segundo núcleo também pode usar o dado já carregado no cache. Na arquitetura anterior, se o segundo núcleo precisasse de um dado armazenado no cache L2 do primeiro núcleo, ele tinha que acessar o tal dado através do barramento externo (que trabalha com um clock muito menor do que o clock interno do processador) ou até mesmo pegar o dado requerido diretamente da lenta memória RAM.
A Intel também aprimorou a unidade de pré-busca do processador, que procura por padrões utilizados pelo processador na buscar dados na memória, com o objetivo de tentar “adivinhar” que dado o processador carregará, copiando-o antecipadamente para o cache de memória antes que o processador realmente precise dele. Por exemplo, se o processador acaba de carregar dados do endereço 1, e depois do endereço 3 e em seguida do endereço 5, a unidade de pré-busca do processador “chutará” que o programa em execução carregará dados do endereço 7, copiando os dados contidos neste endereço para o cache antes que o processador solicite. Na verdade, esta idéia não é nova e todos os processadores desde o Pentium Pro utilizam algum tipo de previsão para preencher o cache L2 com dados que o processador poderá precisar. Na arquitetura Core, a Intel simplesmente aprimorou este recurso fazendo com que a unidade de pré-busca procure por padrões nos dados solicitados em vez de simplesmente indicadores estáticos de qual dado o processador solicitará.
Decodificador de Instruções: Fusão de Instruções
Um novo conceito foi introduzido com a arquitetura Core: fusão de instruções (macro-fusion). Fusão de instruções é a capacidade de combinar duas instruções x86 dentro de apenas uma microinstrução. Isto aumenta o desempenho e diminui o consumo do processador, já que ele executará apenas uma microinstrução em vez de duas.
Este esquema, no entanto, é limitado a instruções de desvio condicional e de comparação (ou seja, instruções CMP, TEST e Jcc). Por exemplo, considere o trecho do programa abaixo:
…
load eax, [mem1]
cmp eax, [mem2]
jne target
…O que isto faz é carregar para o registrador de 32 bits EAX dados contidos na posição de memória 1, compara seus valores com os dados contidos na posição de memória 2 e, se eles forem diferentes (jne = vá para se não for igual), o programa vai para o endereço “destino”, mas se eles forem iguais, o programa continua na posição atual.
Com a fusão de instruções as instruções de comparação (cmp) e condicional (jne) serão concatenadas dentro de uma única microinstrução. Então, depois de passar pelo decodificador de instrução, esta parte do programa será algo como:
…
load eax, [mem1]
cmp eax, [mem2] + jne target
…Como você pode ver, economizamos uma microinstrução. Quanto menor o número de instruções a serem executadas, mais rápido o computador realizará a execução da tarefa além de consumir menos.
O decodificador de instruções encontrado na arquitetura Core pode decodificar quatro instruções por pulso de clock, enquanto que os processadores Pentium M e Pentium 4 podem decodificar apenas três.
Por causa da fusão de instruções o decodificador de instruções da arquitetura Core envia cinco instruções por vez para a fila de instruções, apesar de ele poder decodificar apenas quatro instruções por pulso de clock. Isto é feito assim porque se duas das cinco instruções forem fundidas em apenas uma, o decodificador pode ainda decodificar quatro instruções por pulso de clock. De outro modo ele ficaria parcialmente ocioso toda vez que uma fusão de instruções aparecesse, ou seja, ele entregaria apenas três microinstruções em sua saída enquanto que ele é capaz de entregar até quatro.
Na Figura 1 você pode ver um breve resumo do que explicamos nesta página e nas anteriores.
clique para ampliar
Figura 1: Unidade de busca e decodificador de instruções da arquitetura Core.Unidades de Execução
O Pentium M tem cinco portas de envio localizadas na sua estação de reserva, mas apenas duas portas são usadas para o envio de microinstruções para a unidade de execução. As outras três são usadas pelas unidades relacionadas à memória (Carregamento [Load] e armazenamento [Store] de dados da memória). A arquitetura Core mantém as cinco portas de envio, no entanto três delas são usadas para enviar microinstruções para as unidades de execução. Isto significa que os processadores baseados na arquitetura Core serão capazes de enviar três microinstruções para serem executadas por pulso de clock, ao contrário de apenas duas, como ocorre nos processadores Pentium M.
A arquitetura Core tem uma unidade de ponto flutuante (FPU) e uma IEU (também conhecida como ALU, unidade lógica e aritmética) extras em comparação à arquitetura do Pentium M. Isto significa que a arquitetura Core pode processar três instruções inteiras por pulso de clock, ao contrário de apenas uma, como ocorre no Pentium M.
Mas nem todas instruções matemáticas podem ser executadas em todas as FPUs. Como você pode ver na Figura 2, operações de multiplicação envolvendo números de ponto flutuante podem ser executadas apenas na terceira FPU e operações de soma de números de ponto flutuante podem ser executadas apenas na segunda FPU. Instruções FPmov podem ser executadas na primeira FPU ou nas outras duas, se não houver nenhuma instrução mais complexa (FPadd ou FPmul) prontas para serem enviadas às unidades de execução. Instruções MMX/SSE são tratadas pela FPU.
Na Figura 2 você ver um diagrama em blocos preliminar das unidades de execução da arquitetura Core.
clique para ampliar
Figura 2: Unidades de execução da arquitetura Core.Uma outra grande diferença entre as arquiteturas do Pentium M e a do Pentium 4 em relação à arquitetura Core é que nesta última as unidades de carga e armazenamento têm suas próprias unidades de geração de endereços. Nos processadores Pentium 4 e Pentium M a unidade de geração de endereço é separada, e no Pentium 4 a primeira ULA é usada para armazenar dados na memória.
Aqui está uma pequena explicação de cada unidade de execução encontrada na arquitetura Core:
- IEU: A Unidade de Execução de Instrução (IEU, Instruction Execution Unit) é onde instruções “comuns” são executadas. Esta unidade é também chamada de ULA (Unidade Lógica e Aritmética). Instruções “comuns” são também chamadas de instruções “inteiras”.
- JEU: A Unidade de Execução de Desvios (JEU, Jump Execution Unit) processa os desvios e também é conhecida como Unidade de Desvio.
- FPU: A Unidade de Ponto Flutuante é responsável por executar as instruções MMX e SSE e operações matemáticas envolvendo números com ponto flutuante. Nesta arquitetura as FPUs não estão “completas”, já que alguns tipos de instruções (FPmov, FPadd e FPmul) podem apenas serem executadas em certas FPUs:
- FPadd: Apenas esta FPU pode executar operações de adição envolvendo números de ponto flutuante, como ADDPS (que, a propósito, é uma instrução SSE).
FPmul: Apenas esta FPU pode executar operações de multiplicação envolvendo números de ponto flutuante, como MULPS (que, a propósito, é uma instrução SSE).- FPmov: Instruções para carregar ou copiar um registrador FPU, como MOVAPS (que transfere dados para um registrador SSE XMM de 128 bits). Este tipo de instrução pode ser executada por qualquer FPU, mas na segunda e na terceira FPUs apenas se instruções do tipo FPadd ou FPmul não estiverem disponíveis na estação de reserva para serem enviadas para processamento.
- Load: Unidade de carga, processa instruções que solicitam dados a serem lidos da memória RAM.
- Store: Unidade de armazenamento de dados, processa instruções que solicitam dados a serem escritos na memória RAM.
Tenha em mente que instruções complexas podem levar várias pulsos de clocks para serem processadas. Vamos pegar um exemplo da porta 2, onde a unidade de ponto flutuante FPmul está localizada. Enquanto esta unidade está ocupada processando uma instrução muito complexa que leva vários pulsos de clock para ser executada, a porta 2 não estará ocupada e continuará enviando instruções simples para a IEU enquanto a FPU estiver ocupada.
Caminho Interno de Dados de 128 bits
Um outro recurso novo encontrado na arquitetura Core é um caminho de dados real de 128 bits. Nos processadores anteriores, o caminho interno de dados era de apenas 64 bits. Isto era um problema para as instruções SSE, já que registradores SSE, chamados XMM, são de 128 bits. Desta forma, quando uma instrução que manipulava dados de 128 bits era executada, esta operação tinha que ser quebrada em duas operações de 64 bits.
O novo caminho de dados de 128 bits faz com que a arquitetura Core seja mais rápido para processar instruções que manipulem dados de 128 bits.
A Intel chama este novo recurso de “Advanced Digital Media Boost”.Desambiguação de Memória
Desambiguação de memória é uma técnica usada para acelerar a execução de instruções relacionadas com a memória.
Todos os processadores da Intel desde o Pentium Pro têm uma unidade de execução fora de ordem, que permite ao processador executar instruções não dependentes em qualquer ordem. O que acontece é que instruções relacionadas à memória são tradicionalmente executadas na mesma ordem em que aparecem no programa, ou de outra forma inconsistência de dados poderia aparecer. Por exemplo, se o programa original tem uma instrução do tipo “armazene o valor 10 no endereço 5555” e então uma instrução “carregue os dados armazenados no endereço 5555”, elas não podem ser invertidas (ou seja, executadas fora de ordem) ou a segunda instrução pegaria dados errados, já que o dado do endereço 5555 foi alterado pela primeira instrução.
O que a unidade desambiguação de memória faz é localizar e executar instruções relacionadas à memória que podem ser executadas fora de ordem, acelerando a execução do programa (falaremos mais sobre isto adiante).
Na Figura 3 você tem um exemplo de um processador sem o recurso desambiguação de memória (ou seja, todos os processadores que não são baseados na arquitetura Core). Como você pode ver, o processador tem que executar as instruções à medida que elas aparecem no programa original. Por exemplo, “Load4” não está relacionada a nenhuma outra instrução relacionada à memória e poderia ser executada primeiro, no entanto, ela tem que esperar todas as outras instruções serem executadas primeiro.
clique para ampliar
Figura 3: Processador sem o recurso de desambiguação de memória.Na Figura 4 você ver como o programa mostrado na Figura 3 é executado em um processador baseado na arquitetura Core. Ele “sabe” que “Load4” não está relacionada a outras instruções e pode ser executada primeiro.
clique para ampliar
Figura 4: Processador com recurso de desambiguação de memória.Isto aumenta o desempenho do processador já que agora “Load4” é executada e o processador tem o dado requerido para executar outras instruções que precisam do valor de “X” para serem executadas.
Em outros processadores, se após “Load4” tivéssemos uma instrução “Add 50”, ela (e todas as outras instruções que dependem deste resultado) teria que esperar todas as outras instruções mostradas na Figura 3 serem executadas. Com o recurso de desambiguação de memória, essas instruções podem ser executadas depois, já que o processar terá agora o valor de “X” mais cedo.Chaveamento Elétrico Avançado
Com a tecnologia de chaveamento elétrico avançado (advanced power gating) a arquitetura Core traz para os processadores um recurso de economia de energia totalmente novo. Este recurso permite que o processador desligue unidades que não estão sendo usadas no momento. Esta idéia vai mais além, já que o processador pode desligar partes específicas dentro de cada unidade do processador de modo a economizar energia, para dissipar menos calor e para otimizar a utilização da bateria (em caso de processadores para notebooks).
Uma outra capacidade de economizar energia da arquitetura Core é ligar apenas os bits necessários nos barramentos internos do processador. Muitos dos barramentos internos do processador são dimensionados para o pior caso – ou seja, a maior instrução x86 que existe, que é de 15 bytes (480 bits)*. Em vez de ligar todas as linhas de dados de 480 bits deste barramento em particular, o processador pode ligar apenas 32 linhas, somente o que é necessário para transmitir uma instrução de 32 bits, por exemplo.
* Você pode ficar um pouco perdido com esta afirmação, já que estamos dizendo que a arquitetura Intel usa instruções de 32 bits, portanto uma explicação mais aprofundada é necessário para um maior entendimento.
Dentro do processador o que é considerado uma instrução é o opcode da instrução (o equivalente em linguagem de máquina da instrução em linguagem assembly), mais todos os dados requeridos. Isto ocorre porque a instrução deve entrar na unidade de execução “completa” de modo a ser executada, isto é, junto com todos os dados requeridos. Além disso, o tamanho do opcode de cada instrução x86 é variável e não fixo em 32 bits, como você poderia imaginar. Por exemplo, uma instrução do tipo mov eax, (dado de 32 bits), que armazena um dado de 32 bits no registrador EAX é considerada internamente como uma instrução de 40 bits (mov eax é traduzida em um opcode de 8 bis mais os 32 bits de seu dado). Na verdade, ter instruções com diferentes comprimentos é o que caracteriza um conjunto de instruções CISC (Complex Instruction Set Computing, computação usando um conjunto de instruções complexo).
Se você quer aprender mais sobre este assunto leia AMD64 Architecture Programmer’s Manual Vol. 3: General Purpose and System Instructions (apesar de a Intel fornecer o mesmo tipo de informação em seu Intel Architecture Software Developer’s Manual Vol. 2A, as explicações e diagramas da AMD são mais fáceis de entender).
Originalmente em http://www.clubedohardware.com.br/artigos/1203
© 1996-2008, Clube do Hardware. Todos os direitos reservados.
É expressamente proibida a reprodução total ou parcial do conteúdo deste site e dos textos disponíveis, seja através de mídia eletrônica, impressa, ou qualquer outra forma de distribuição. Os infratores serão indiciados e punidos com base na lei nº 9.610 de 19/02/1998.
Não nos responsabilizamos por danos materiais e/ou morais de qualquer espécie promovidos pelo uso das informações contidas no Clube do Hardware.