1. Histórico 1Computação Paralela



Baixar 113.6 Kb.
Encontro31.07.2016
Tamanho113.6 Kb.
PROCESSADOR SUPER ESCALAR

Notas de aula (Stalling) - Carlos Sica - 1999


1.Histórico



1.1Computação Paralela


A área de sistemas de computação, estuda paralelismo desde o surgimento dos computadores. Já na década de 40, Von Neumann debatia algoritmos para soluções de equações diferenciais com técnica de paralelismo. As idéias de executar tarefas simultaneamente e de antecipar atividades são amplamente utilizadas atualmente nas arquiteturas. Neste contexto são discutidos os seguintes conceitos: busca antecipada de instruções (lookahead); superposição de fases de execução de instrução (overlap), múltiplas unidades funcionais, estágios de execução (pipeline), processamento vetorial e multiprocessamento.

Assim, dentre os principais motivos para o surgimento da computação paralela citam-se: desempenho, modularidade, tolerância a falhas e o aparecimento de microprocessadores de 32 bits e, os níveis de paralelismo mais evidentes são:



  • Hardware (múltiplas unidades funcionais e pipeline)

  • Micromáquina (microcódigo)

  • Convencional (conjunto de recursos visíveis ao programador)

  • Sistema operacional (concorrência de processos)

  • Linguagem de programação (fragmentação de programa)

1.2RISC x CISC


Segundo (Stallings, 1996), numa implementação da arquitetura super escalar de um processador, instruções comuns como: aritmética inteira e de ponto flutuante, leitura e escrita na memória e desvios condicionais, podem ser inicializadas simultaneamente e executadas independentemente e tal implementação aumenta o grau de complexidade relacionada às instruções pipelined.

As implementações da arquitetura superescalar são feitas baseadas, principalmente, na arquitetura RISC, porém, elas podem ser feitas tanto na RISC como na CISC. A primeira afirmação é devida ao fato de que o pequeno conjunto de instruções da arquitetura RISC, já o revela em parte como sendo a técnica superescalar.

Apesar do período de gestação da arquitetura RISC para a decolagem comercial desde o verdadeiro início da pesquisa com o IBM801 e o RISC de Berkeley ter sido de sete a oito anos, a disponibilização da primeira máquina superescalar comercialmente ocorreu em um ou dois anos.

2.Introdução


O termo escalar é utilizado para distinguir os modelos de execução:

  • de uma única instrução manipulando operandos discretos;

  • das instruções vetoriais, que desencadeiam a ativação em paralelo de múltiplos elementos de processamento, todos executando uma única operação.

Além destes dois modelos, existe o que executa várias instruções concorrentemente, sem que elas precisem ter o mesmo código de operação (não vetoriais). Este modelo é utilizado pelos computadores superescalares, assim chamados, por processarem instruções escalares em grande grau de paralelismo.

Computadores superescalares são máquinas projetadas para melhorar a performance de execução de instruções escalares, em outras palavras, eles exploram o paralelismo em baixo nível e, assim, podem executar diversas instruções de máquina simultaneamente, contanto que, todas sejam provenientes do mesmo programa objeto.

O nome contrasta com o propósito dos processadores vetoriais e matriciais, pois, utilizam a técnica de processar várias instruções de um mesmo tipo em paralelo, enquanto que um superescalar pode processar simultaneamente instruções diferentes.

Este debate é feito porque cada máquina é especializada em executar determinados tipos de programas específicos e, como na maioria das aplicações, a massa de operações são quantidades escalares, a "filosofia" superescalar representa o próximo passo na condução dos processadores de propósito geral para a alta performance, que podem então, executar eficientemente uma larga gama de programas de aplicação não se limitando à aplicações vetoriais ou matriciais.


2.1Superescalar x superpipelined


Uma técnica alternativa para atingir alta performance no processamento é intitulada como superpipelined, termo utilizado pela primeira vez em 1988 [JOUP88]. Essa técnica explora o fato de que o estágio de pipeline executa tarefas que requerem menos de meio ciclo de clock. Assim, um processador com velocidade de clock interno dobrada, permite um aumento de performance de duas tarefas executadas em um único ciclo de clock externo. (MIPS R4000)

Comparação:

Uma máquina usando pipeline básico executa uma instrução por ciclo de clock e tem e um estágio de pipeline por clock também. O pipeline tem quatro estágios: busca, decodificação, execução e armazenamento do resultado. Note que, ainda que várias instruções estejam sendo executadas concorrentemente, somente uma instrução está no estágio de execução de cada vez.

A implementação superpipelined é capaz de executar dois estágios de pipeline de cada vez. Um forma alternativa de enxergar isso, é entender que a função executada em cada estágio, pode ser dividida em duas partes não sobrepostas e cada pode executar em meio ciclo de clock. Uma implementação superpipelined que se comporta deste modo é chamada de grau 2.

A implementação superescalar pode executar duas instâncias de cada estágio em paralelo.

Tanto o superpipelined como o superescalar comparados, tem o mesmo número de instruções executando ao mesmo tempo no mesmo estado. O processador superpipelined parece com o superescalar ao início de cada programa de cada desvio de fluxo.


2.2Limitações


A técnica superescalar depende da capacidade de executar múltiplas instruções em paralelo. O termo intruction-level parallelism refere-se ao grau no qual, em média, instruções de um programa podem ser executadas em paralelo. A combinação das técnicas de otimização baseada em compilador e baseada em hardware, pode ser utilizada para maximizar o nível de paralelismo das instruções. Antes de analisar a técnica utilizada pelas máquinas superescalares para incrementar o nível de paralelismo, é necessário entender as limitações de paralelismo que o sistema deve tolerar.

[JONH91] lista cinco limitações: True data dependency, Procedural dependency, Resource conflicts, Output dependency e Antidependency.

Estas limitações são chamadas por alguns autores de dependências verdadeiras no caso das três primeiras e, de falsas dependências, no caso das duas últimas, que serão discutidas nos itens 4.1.2 e 4.1.3, repectivamente.

2.2.1Dependência de dados (true data dependency)


Considere a seguinte seqüência:

Add r1,r2 ; r1=r1+r2

Move r3,r1 ; r3=r1

A segunda instrução pode ser buscada e decodificada a qualquer momento, mas não pode ser executada até que a primeira seja executada. A razão é que ela depende do dado produzido pela primeira. Essa situação é nominada como true data dependency, chamada ainda de flow dependency ou write-read dependency.

Sem a dependência duas intruções podem ser buscadas, interpretadas e executadas em paralelo. Se existe uma dependência de dados entre a primeiro e a segunda instrução, então a segunda é atrasada tantos ciclos de clock quantos requerido para remover a dependência. Em geral, toda instrução deve ser atrasada até que todos os seus valores de entrada tenham sido produzidos.

Esta característica, a princípio, limita a performance de qualquer pipeline, porém, em um pipeline escalar simples, a seqüência de instruções acima não causa atraso.


2.2.2Dependência procedural (procedural dependency)


A presença de instruções de desvio complica a operação de pipeline. A instrução seguinte ao desvio tem uma dependência procedural e não pode ser executada até que o desvio seja efetuado. Este tipo de dependência também afeta um pipeline escalar e, novamente, a conseqüência disso para um pipeline superescalar é mais grave, visto que uma grande magnitude de oportunidade é perdida com cada atraso.

Essa análise é feita sobre desvios incondicionais, no caso de desvios condicionais a complexidade aumenta, pois, o processador não saberá se o próximo código a ser executado é o que está logo após a instrução de desvio, ou no alvo do desvio.

Se uma instrução "variable-length" é utilizada, então outra variação de dependência procedural aparece. Devido ao tamanho de uma instrução em particular ser desconhecido, ela deve ser decodificada, pelo menos parcialmente, antes da instrução seguinte ser buscada. Isto impede a busca simultânea requerida pelo pipeline superescalar. Este é um dos motivos que a técnica superescalar seja aplicada em um arquitetura RISC ou aproximação desta, onde as instruções tem tamanho fixo.

2.2.3Conflito de recursos (resource conflicts)


Um conflito de recursos é uma competição de duas ou mais instruções para o mesmo recursos ao mesmo tempo. Esses recursos podem ser: memória, cache, barramentos, portas e unidades funcionais como é o caso do somador da ULA.

Nos termos do pipeline, um conflito de recursos exibe comportamento similar à uma dependência de dados, contudo, existem diferenças: conflitos de recursos podem ser resolvidos por duplicação de recursos, enquanto que uma dependência de dados não pode ser eliminada. Além disso, quando uma operação toma um tempo elevado para ser executada, conflitos de recursos podem ser minimizados por um pipeline apropriado para unidades funcionais.


3.Estudo do paralelismo de instruções e de máquina

3.1Nível de paralelismo entre instruções


Acontece quando instruções agrupadas em seqüência são independentes e assim podem ser executadas em paralelo, utilizando recursos de hardware distintos.

Como exemplo do conceito de nível de paralelismo entre instruções, considere os fragmentos abaixo [JOUP89b].



load

r1r2

add

r3r3,"1"

add

r3r3,"1"

add

r4r3,r2

add

r4r4,r2

store

[r4] r0

paralelismo=3

paralelismo=1

As três instruções da primeira coluna são independentes e, teoricamente, as três podem ser executadas paralelamente. Contrastando com isso, as três instruções da segunda coluna não podem ser executadas em paralelo porque a segunda instrução depende do resultado da primeira e, a terceira, depende da segunda.

O nível de paralelismo entre instruções é determinado por dois fatores: a freqüência da dependência de dados e da dependência procedural contida no código. Esses fatores, por sua vez, são dependentes da arquitetura do conjunto de instruções da máquina e da aplicação.

Esse nível de paralelismo é também determinado [JOUP89a] pelo grau de latência da operação: o tempo enquanto o resultado de uma operação fica disponível, para uso como operando pela instrução subsequente. A latência determina qual o atraso que uma dependência de dado ou de procedimento causa.

3.2Paralelismo de máquina


É a medida da capacidade do processador de obter vantagens sobre o paralelismo de instrução. O paralelismo de máquina é determinado pelo número de instruções que ele pode buscar e executar ao mesmo tempo (o número de pipelines paralelos) e pela velocidade e sofisticação do mecanismo que o processador utiliza para encontrar instruções independentes.

Tanto o paralelismo de instruções quanto o de máquina são fatores importantes na melhora da performance. Um programa pode não ter paralelismo de instrução suficiente para denotar vantagens sobre o paralelismo de máquina, já o uso de um conjunto de instruções de tamanho fixo, como no RISC, melhora o paralelismo em nível de instruções. Em outras palavras, um paralelismo de máquina limitado, não limitará a performance mais que a natureza do programa em si.


4.Política de despacho de instruções


Como mencionado, máquinas paralelas não são tão simples quanto ter múltiplas instâncias de cada estágio pipeline. O processador deve também ter capacidade de identificar níveis de paralelismo de instrução e gerenciar a busca, decodificação e execução de instruções paralelas.

Despacho das instruções: processo de inicialização da execução da instrução na unidade funcional do processador.

Política de despacho das instruções: protocolo usado para o despacho das instruções.

Em essência, o processador fica vigiando o ponto corrente da execução para localizar instruções que podem completar o (entrar no) pipeline e, então, executar.

Três pontos da ordenação são importantes neste estudo:

A ordem na qual a instrução é buscada;

A ordem na qual a instrução é executada

A ordem na qual a instrução altera registradores e posições de memória (write back)

Quanto mais sofisticado o processador, menor o limite de estreitamento do relacionamento entres estes pontos. Para alcançar a utilização máxima dos vários elementos do pipeline, o processador deverá alterar a ordem de um ou mais dos itens acima em relação a ordem de uma execução estritamente seqüencial. Uma responsabilidade do processador é construir resultados corretos. Assim, o processador deve acomodar várias dependências e conflitos discutidos anteriormente.

Em termos gerais, podemos agrupar o Despacho de instruções superescalares dentro das seguintes categorias:



  • Despacho em ordem com conclusão em ordem

  • Despacho fora de ordem com conclusão em ordem

  • Despacho fora de ordem com conclusão fora de ordem

4.1.1Despacho em ordem com finalização em ordem


A política mais simples, é despachar as instruções na ordem exata que ela foi concluída na execução seqüencial (despacho em ordem) e escrever os resultados na mesma ordem (ordem de conclusão).

Exemplo: um computador pipeline superescalar capaz de buscar e decodificar duas instruções ao mesmo tempo, executar em três unidades funcionais separadas e trabalhar com duas instâncias de pipeline de alteração em registrador ou memória (writeback)

I1: necessita de dois ciclos para executar

I3 e I4: sofrem conflito na mesma unidade funcional

I5: depende do valor produzido em I4

I5 e I6: sofrem conflito na mesma unidade funcional



Ciclo




Decodifica




Executa




Writeback

1

I1

I2
















2

I3

I4

I1

I2










3

I3

I4

I1













4




I4







I3

I1

I2

5

I5

I6







I4







6




I6




I5




I3

I4

7










I6










8
















I5

I6

As instruções são buscadas duas de cada vez e passadas para a unidade de decodificação. Visto que as instruções são trazidas ao pares, a próxima dupla deve esperar até que o par do pipeline do estágio de decodificação esteja vazio. Para garantir a finalização em ordem, as instruções esperam quando existem conflito de unidade funcional ou quando uma unidade funcional precisa mais que um ciclo para produzir resultado.

4.1.2Despacho em ordem com finalização fora de ordem


A finalização fora de ordem é utilizada em processadores RISC superescalares para melhorar a performance de instruções que requerem vários ciclos, por exemplo, as operações de ponto flutuante no Motorola 88000.

Exemplo: uso em processador superescalar.



I2: pode executar e finalizar com prioridade à I1, o que permite I3 finalizar antecipadamente

Ciclo




Decodifica




Executa




Writeback

1

I1

I2
















2

I3

I4

I1

I2










3




I4

I1




I3

I2




4

I5

I6







I4

I1

I3

5




I6




I5




I4




6










I6




I5




7
















I6




Com a finalização fora de ordem, qualquer número de instruções podem estar no estágio de execução ao mesmo tempo, respeitado o grau de paralelismo de máquina das unidades funcionais e dependência procedural.

Aqui surge o conceito de uma das dependência falsas, a qual é chamada de dependência da saída (também chamada de dependência de leitura e escrita).

Exemplo:


(I1)

R3 = R3 op R5

(I2)

R4 = R3 + 1

(I3)

R3 = R5 +1

(I4)

R7 = R3 op R4

A instrução I2, não pode ser executada antes da I1 porque ele precisa do resultado no R3 produzido em I1. Este é um exemplo da dependência de dados já discutida anteriormente. Similarmente, I4 deve esperar I3 porque ele usa o resultado produzido em I3.

No relacionamento entre I1 e I3, não existe dependência de dados, contudo, se I3 termina antes de I1, quando I4 for executar, provavelmente I1 já terá terminado e o valor contido em R3 será errado, pois, foi produzido por I1. Por conclusão, I3 deve completar depois de I1 para produzir um valor de saída correto.

Para garantir isso, o despacho da terceira instrução deve ser congelado, se o resultado pode mais tarde ser sobrescrito por uma instrução anterior que demora para ser executada.

A técnica do despacho com finalização fora de ordem, requer, com certeza, uma lógica de despacho de instruções mais complexa que o despacho em ordem, discutido no item anterior. Principalmente, se levarmos em consideração que é mais difícil trabalhar em conjunto com interrupções e exceções. Quando uma interrupção ocorre, a execução é suspensa no ponto corrente, para ser reassumida mais tarde. O processador deve garantir que a retomada seja feita no ponto exato e, no instante da interrupção, instruções anteriores a instrução que causou a interrupção já estejam completas.


4.1.3Despacho fora de ordem com finalização fora de ordem


No método com despacho em ordem, o processador somente decodificará instruções até o ponto da dependência do conflito. Nenhuma instrução a mais é decodificada até que o conflito seja resolvido. Como resultado, o processador não pode pesquisar pontos de conflito para instruções subsequentes, que podem ser independentes das que já estão carregadas no pipeline e, assim, seria útil introduzi-las no pipeline.

Para permitir o despacho fora de ordem, é necessário desacoplar o código e executar estágios de pipeline. Isto é feito com um buffer chamado de janela de instruções. Com essa organização, após o processador ter terminado a decodificação, a instrução é colocada dentro da janela. Enquanto este buffer tiver espaço vazio o processador pode continuar buscando e decodificando novas instruções. Quando um unidade funcional é disponibilizada no estágio de execução, uma instrução da janela pode ser inserida no estágio de execução. Qualquer instrução da janela pode ser ativada contanto que: a) a unidade funcional que ela precisa esteja disponível e b) nenhum conflito ou dependência esteja bloqueando-a.

Nesta organização, as instruções são executadas a partir da janela de instruções que mantém pouca relação com a ordem original do programa e, o resultado dessa organização, é que o processador ganha uma capacidade de previsão, permitindo identificar instruções independentes que podem ser levadas para dentro do estágio de execução.

Exemplo:


Ciclo




Decodifica




Janela




Executa




Writeback

1

I1

I2



















2

I3

I4

I1, I2

I1

I2










3

I5

I6

I3, I4

I1




I3

I2




4







I4, I5, I6




I6

I4

I1

I3

5







I5




I5




I4

I6

6



















I5




Em cada ciclo, duas instruções são buscadas para o estágio de decodificação, e a partir disso, sujeito as condições do tamanho do buffer, duas instruções são movidas do estágio de decodificação para a janela de instruções. Neste exemplo, foi possível executar a instrução I6 antes da I5 (relembrando que I5 depende de I4, mas I6 não). Assim, um ciclo é economizado nos estágios de execução e alteração de dados e, consequentemente, a finalização do conjunto é feita um ciclo antes.

A janela de instruções não é um estágio adicional de pipeline, uma instrução entrar na janela, implica simplesmente que o processador tem informações suficientes para avaliar qual instrução pode ser executada.

O policiamento para o despacho fora de ordem e finalização fora de ordem está sujeito a mesma exigência descrita anteriormente, ou seja, uma instrução não pode ser executada se ela viola as dependências ou conflitos. A diferença é que mais instruções estão disponíveis para execução, reduzindo a probabilidade que um estágio de pipeline tenha que ser congelado. Aqui aparece uma nova dependência, chamada de antidependência (também chamada de dependência de escrita-escrita) ilustrada abaixo.

Exemplo:


(I1)

R3 = R3 op R5

(I2)

R4 = R3 + 1

(I3)

R3 = R5 +1

(I4)

R7 = R3 op R4

I3 não pode ser completada antes que I2 inicie sua execução com os operandos já buscados. Isto é devido à I3 atualizar o registrador R3 que é um operando fonte para I2. Aqui surge a segunda dependência falsa e, o termo antidependência, é utilizado porque a exigência é similar à de uma dependência de dados, porém, ao inverso, ou seja, ao invés de uma instrução produzir um valor que a segunda irá utilizar, a segunda instrução destrói um valor que a primeira utiliza.

5.Renomeação de registradores


Quando o despacho de instruções fora de ordem e/ou finalização fora de ordem são aceitos, existe um crescimento da possibilidade do surgimento da dependência da saída e da antidenpendência. Estas dependências diferem dependência de dados e conflito de recursos, que refletem o fluxo de dados através do programa e da seqüência de execução. A dependência da saída e a antidependência, por outro lado, crescem em probabilidade, porque o valor no registrador pode não refletir a seqüência de valores ditados pelo fluxo do programa.

Quando as instruções são despachadas e completadas em seqüência, é possível especificar o conteúdo de cada registrador em cada ponto de execução. Quando a técnica "fora de ordem" é utilizada, os valores nos registradores não podem ser conhecidos com segurança em cada ponto no instante avaliado, considerada a seqüência de instruções ditadas pelo programa. Desta forma, os valores estão em conflito pelo uso de registradores e o processador deve resolver estes conflitos congelando ocasionalmente um estágio de pipeline.

A antidependência e a dependência de saída são exemplos de conflitos de armazenamento. Múltiplas instruções concorrendo ao uso do mesmo registrador, geram exigências que retardam a performance do pipeline. O problema é mais detalhado quando utiliza-se a técnica de otimização de registradores (Cap 12), porque essas técnicas de compiladores, tentam ao máximo utilizar registradores, maximizando o número de conflitos de armazenamento.

Um método para resolver esse tipo de conflitos de armazenamento é baseado na tradicional solução de conflitos de recursos: duplicação de recursos. Neste contexto a técnica é chamada de renomeação de registradores. Em essência, os registradores são alocados dinamicamente pelo hardware do processador e a eles são associados os valores necessários para as instruções, a qualquer momento. Quando um valor novo é escrito no registrador, isto é, quando uma instrução executada tem um registrador como operando destino, um novo registrador deve ser alocado para guardar esse valor. Subseqüentemente, quando uma instrução acessa esse valor como operando fonte acontece o processo de renomeação: o registrador referenciado nessa instrução dever ser renomeado para referir ao registrador contendo o valor correto. Assim, a mesma referência ao registrador original por diferentes instruções pose se referir a registradores diferentes se valores diferentes são almejados.

Exemplo 1:

R3b = R3a op R5a (I1)

R4b = R3b + 1 (I2)

R3c = R5a +1 (I3)

R7v = R3c op R4b (I4)

A referência para um registrador que utiliza índice (registrador lógico), aponta para um registrador do segundo lote de hardware, alocado para guardar o novo valor.

Quando uma nova alocação é feita para um registrador lógico em particular, a referência para ele como operando fonte das instruções subsequentes, são feitas para se referir ao registrador de hardware mais recentemente utilizado, em termos da seqüência das instruções do programa.

Neste exemplo, a criação do registrador R3c na instrução I3 evita a antidependência na segunda instrução e a dependência da saída na primeira e não interfere com o valor correto a ser acessado pela instrução I4. O resultado é que I3 pode ser utilizado imediatamente. Sem a renomeação dos registradores, I3 não poderia ser executada até que a primeira instrução estivesse completa e a segundo estivesse executando.

Em geral, os sistemas utilizam um conjunto de registradores acessíveis pelo programador e outros invisíveis, utilizados para a renomeação. Se considerarmos um banco de 16 registradores numerador de R0 a R15, a primeira metade, R0 a R7, seria visível e, a segunda, R8 a R15, seria utilizada pela renomeação.

Exemplo 2:



I1

R1 = R0 * 127;

I2

R0 = 255;

I3

R3 = R0 | R2;

I4

R0 = R1 & R5;

I5

R4 = R0 + R1;

análise: 1 e 2 são antidependentes

2 e 3 são dependentes de dados

2 e 4 tem dependência de saída

3 e 4 são antidependentes

1 e 4 são dependentes

4 e 5 são dependentes

Para executar I1 e I2 de forma independente, os registradores adicionais (R8 a R15) inacessíveis ao programador são invocados: ao decodificar a instrução I2, o sistema nota percebe a antidependência e, após verificar a um registrador livre no banco, R0 é substituído ou renomeado pelo primeiro livre criando um ponteiro para, suponhamos neste exemplo, R8.

Como a I3 depende diretamente de I2, através do ponteiro criado, o registrador acessado será R8. O algoritmo despacha a instrução I3, passando como parâmetros para a unidade lógica os registradores R3, R8 e R2. Esta técnica, referenciando R8, continua sendo utilizada até que R0 seja utilizada novamente como operando destino, como é o caso da I4.

I3 e I4 são antidependentes, e I2 e I4 tem dependência de saída, assim, se no momento do atendimento de I4, as duas versões de R0 (R0 e R8) estiverem sendo utilizadas, uma terceira versão será criada, suponhamos R9 e, após esta renomeação, I4 é despachada para ser executada na unidade funcional adequada após R1 estar pronto.

Independente disso, o algoritmo de despacho continua sendo executado e, ao examinar I5, R0 é substituído, através de um ponteiro, por R9.

Resultado:


I1

R1 = R0 * 127;

I2

R8 = 255;

I3

R3 = R8 | R2;

I4

R9 = R1 & R5;

I5

R4 = R9 + R1;

6.Paralelismo de máquina


Foram discutidos três técnicas de hardware que podem ser utilizadas em processadores superescalares para melhorar sua performance: duplicação de recursos, execução fora de ordem e renomeação.

Exemplo de simulação de vários seqüências de programa:

O eixo vertical corresponde à inferioridade de velocidade de uma máquina superescalar sobre uma máquina escalar. O eixo horizontal mostra o resultado de quatro organizações alternativas de processadores.


  • A máquina base não duplica qualquer unidade funcional, mas pode executar instruções fora de ordem.

  • A segunda configuração duplica a unidade funcional carga/armazenamento que acessa a cache de dados.

  • A terceira configuração duplica a ULA.

  • A quarta duplica tanto a unidade de carga/armazenamento quanto a ULA.

Cada gráfico mostra o resultado referente a janela de instrução com tamanho de 8, 16 e 32 instruções, o qual influi na quantidade de progresso que processador pode ter.

A diferença entre os dois gráficos é que, no segundo, é utilizada a renomeação de registradores. Isto eqüivale a dizer que o primeiro gráfico reflete uma máquina que é limitada à todas as dependências e o segundo apenas às "true dependencies".

Os dois gráficos combinados levam para importantes conclusão:


  • A primeira é que, provavelmente, não é útil adicionar unidades funcionais sem renomeação de registradores.

  • Ocorre uma melhora insignificante na performance, baseada no custo de aumentar a complexidade do hardware.

  • Com a renomeação de registradores, a qual elimina a antidependência e a dependência de saída, ganhos significativos são concluídos adicionando mais unidades funcionais. Note, contudo, que existem diferenças significativas no ganho, entre a utilização de janela de 8 instruções e janelas maiores, isso indica que se uma janela é muito pequena, a dependência de dados prevalecerá sobre a utilização efetiva de unidades funcionais extras; o processador deve ter a capacidade de se manter pesquisando instruções independentes em ordem para utilizar o hardware com maior eficiência.

7.Previsão de desvios


Qualquer máquina com pipeline de alta performance deve procurar trabalhar se preocupando dos desvios de fluxo. Por exemplo, o 486 trabalha o problema buscando tanto a próxima instrução da seqüência após um desvio, quanto a instrução alvo do desvio. Contudo, devido existir dois estágios de pipeline entre a pré-busca e a execução, esta estratégia incorre num atraso de dois ciclos quando o desvio é feito.

Com o advento das máquinas RISC, a estratégia do atraso de desvio foi explorada, permitindo ao processador calcular o resultado do desvio condicional antes de qualquer instrução não utilizável ter sido pré-buscada. Com este método, o processador sempre executa uma instrução simples que segue imediatamente o desvio. Mantendo assim, o pipeline cheio enquanto o processador busca a nova seqüência de instrução.



Com o desenvolvimento das máquinas superescalares, a técnica do desvio atrasado tem sido menos utilizada. A razão é que várias instruções precisam ser executadas no atraso, aparecendo vários problemas relacionados com dependência de instrução. Desta forma, máquinas superescalares retornam à técnica pré-RISC de previsão de desvio. Alguns, como o PowerPC 601, utilizam a técnica de previsão estática de desvios. Outros, mais sofisiticados como PowerPC 620 e o Pentium, usam a dinâmica, baseado na análise da história dos desvios.




©principo.org 2016
enviar mensagem

    Página principal