You are on page 1of 32

As Optimizaes com o Pipelining

Os anos 60 deram origem ao incio do desenvolvimento do primeiro


supercomputador : o CDC 6600. Possuindo 1 CPU e 10 unidades de
processamento perifricas, este computador tinha a possibilidade de
realizar operaes em paralelo. Considerado por muitos como a primeira
mquina RISC, o 6600 era nico tambm por outras razes: era uma
arquitectura load/store (em que todas as operaes ocorriam de registo
para registo, excepto para leituras e escritas); possuia mltiplas
unidades funcionais, temporizao de instrues, e alm disso foi das
primeiras mquinas que usou uma nova tcnica que lhe permitia
processar mais que uma instruo de cada vez, e por essa razo no
precisaria de esperar que uma instruo completasse para comear a
prxima : o pipelining.
O pipelining assim uma forma de obter uma alta performance ao "partir" o
processamento de uma instruo numa srie de estgios, que so ligados como
as estaes numa linha de montagem. Esta linha de montagem para
processamento de instrues tem o nome de pipelining. medida que as
instrues fluem ao longo do pipeline, o hardware em cada estgio realiza algum
processamento, at que as instrues, que deixam o pipeline so completamente
processadas. A alta performance obtida pelo paralelismo no processamento das
vrias instrues ao mesmo tempo, cada uma em diferentes estgios do pipeline.
assim uma tcnica fundamental de processamento que, sendo inicialmente
introduzida nas arquitecturas RISC, estendeu-se s CISC, estando hoje presente,
por exemplo, nos processadores Intel Pentium.

1. Descrio Geral
Assuma-se que se tem a seguinte sequncia de instrues (sem objectivo
evidente) para serem executadas...
1. load FP1 = mem(R1 + R2) # carrega o nmero em vrgula flutuante na
posio de memria apontada por RB + RC no registo FP1
2. load FP2 = mem(R3 + 4) # carrega o nmero em vrgula flutuante na
posio de memria apontada por R3 + 4 no registo FP2
3. mult FP3 = FP1, FP2 # multiplicao em vrgula flutuante, em que o
resultado colocado em FP3
4. store mem(R1 + R2) = FP3 # escreve o resultado ,contido em FP3, na
posio de memria apontada por R1 + R2.
... e que cada uma delas demora 5 ciclos de relgio a ser executada.
fcil de verificar que, o nmero de ciclos necessrios para completar a execuo
destas 4 instrues seria de 4 * 5 ciclos = 20 ciclos.
Usando o conceito de pipelining, parta-se o processamento destas instrues, por
exemplo, em 5 estgios, descritos da seguinte forma:
1. Busca da Instruo (IF): O contador de programa (PC) usado para ir
buscar a prxima instruo a ser processada. As instrues so
geralmente mantidas numa memria cache para instrues que lida
durante este estgio.
2. Descodificao da Instruo e Busca dos Operandos (ID): O opcode e os
operandos so inspecionados e so gerados os sinais de controlo. Os
especificadores de registos provindos da instruo so usados para ler os
operandos do ficheiro de registos.
3. Execuo (EX): A operao especificada pelo opcode executada. Para
instrues de acesso memria, a operao forma o endereo de
memria.
4. Acesso Memria (ME): Os dados so lidos ou escritos em memria. Para
este efeito, usada geralmente memria cache.
5. Escrita de Retorno (WB): O resultado da operao escrito no ficheiro de
registos.
Assumindo que, em cada instante, cada um destes estgios est a realizar algum
processamento, verifique-se que a sequncia de instrues a serem executadas
usando pipeline (os problemas com esta sequncia de instrues ser analizado
mais tarde) ser:
0 1 2 3 4 5 6 7
load FP1 = mem(R1 + R2) IF ID EX ME WB
load FP2 = mem(R3 + 4) IF ID EX ME WB
mult FP3 = FP1, FP2 IF ID EX ME WB
store mem(R1 + R2) = FP3 IF ID EX ME WB
Os 20 ciclos de relgio, do assim lugar a apenas 7 ciclos !
Cada estgio do pipeline consiste em lgica e memria de alta velocidade, na
forma de registos ou cache. Estes estgios esto separados por latches (um latch
um elemento de memria em que o valor de sada igual ao valor do estado
contido nesse elemento e esse estado alterado sempre que os valores de
entrada apropriados so alterados, em sincronizao com o sinal de relgio).
Um sinal de relgio comum sincroniza os latches da pipeline em cada estgio, e
dessa forma todos os latches guardam os dados produzidos de cada estgio ao
mesmo tempo. O relgio vai assim "bombeando" as instrues ao longo do
pipeline. No incio de um perodo de relgio, ou ciclo de relgio, os dados e
controlo das instrues parcialmente processadas so mantidas num pipeline
latch at ao final desse ciclo.
Num pipeline bem desenhado, todos os estgios contm lgica com mais ou
menos o mesmo tempo de propagao de sinal. Este perodo de relgio tem de
ser suficientemente longo para para acomodar o tempo requerido pelo estgio
mais lento.
O pipeline desenhado para iniciar (e terminar) uma nova instruo em cada
perodo de relgio. Dessa forma, esse perodo de relgio determina o throughput.
O tempo que demora uma nica instruo a atravessar o comprimento total do
pipeline referido como a latncia. Por exemplo, se o pipeline da figura seguinte
usa um relgio de 50 MHz, ento o throughput consiste numa instruo por cada
20 ns (1/50.000.000 = 0.00000002 s = 20 ns) ou ento 50 milhes de instrues
por segundo (50 MIPS). A latncia do pipeline ento 5 perodos de relgio ou
100 ns (50 MHz/5 = 10 MHz = 0.0000001 s = 100 ns).
Sem o pipeline o throughput seria o recproco da latncia. No exemplo anterior,
se no existisse pipelining, o throughput mximo, assumindo que uma instruo
demoraria 5 ciclos de relgio a ser executada, seria assim de uma instruo por
100 ns ou 10 MIPS.
Na realidade, o throughput no pipelined seria um pouco melhor porque os
latches adicionam algum atraso (ou overhead) latncia total. Removendo-os,
poderia levar a um ligeiro melhoramento na latncia do que os 100 ns.
Um aspecto curioso acerca deste tcnica que, embora permita de facto um
aumento significativo do throughput, de forma que um maior nmero de
intrues seja processado por unidade de tempo, o tempo de execuo de um
instruo mantm-se, inalterado. Como se pode depreender, mquinas que
processem um grande nmero de instrues por unidade de tempo sero mais
beneficiadas com esta tcnica, do que as mquinas que, tendo instrues mais
completas (e complexas) permitem que o programa seja executado num menor
nmero de passos, no exploram tanto as potencialidades do pipelining.
2. Problemas com o pipelining e as solues encontradas
O pipelining tem demonstrado permitir um melhoramento to significativo na
performance dos sistemas (num nmero n de estgios, no sendo n muito
elevado, cr-se que corresponde a um tempo de execuo n vezes mais rpido)
que o cepticismo que o acompanhou, na altura da sua implementao nas
primeiras mquinas, teve de ser abandonado, sendo utilizado nos dias de hoje na
maioria dos mquinas. Esse cepticismo deveu-se, e deve-se, ao facto de o
pipelining implicar alguns problemas que impossibilitam mquina, em certas
ocasies, de executar a prxima instruo no ciclo de relgio seguinte. Por esta
razo uma instruo pode ser impedida de entrar no estgio seguinte, enquanto
espera pelos dados da instruo anterior. Quando uma instruo retida por um
ou mais perodo de relgio, so introduzidas "bolhas" no pipeline. Essas "bolhas"
so simplesmente instrues que no fazem absolutamente nada (tambm
designadas por nop - "no operation"), e so utilizadas apenas para atrasar a
execuo de uma instruo, quando se prev uma paragem (ou dependncia, ou
stall).
Esses problemas podem ser classificados segundo os seguintes critrios:
1. Riscos Estruturais
2. Riscos de Controlo
3. Riscos de Dados
O que significa cada um deles, e a(s) forma(s) de os resolver dada de seguida.
No final so descritas formas de prevenir paragens na pipeline, designadas por
pipeline interlocks.
Mas antes de continuar convm fazer referncia s situaes excepcionais que
podem causar um bloqueamento na execuo normal do programa. As situaes
ditas de excepcionais so mais difceis de manipular numa mquina pipelined pois
a sobreposio de instrues torna mais difcil de saber quais aquelas que podem,
com segurana, alterar o estado da mquina. Numa mquina pipelined, uma
instruo executada por partes e dessa forma no completada antes de vrios
ciclos de relgio. Mas, infelizmente, outras instrues no pipeline podem causar
excepes que podero forar a mquina a abortar a execuo das instrues no
pipeline que ainda no completaram a sua execuo. No possvel
simplesmente analisar o Contador de Programa (PC) para saber qual foi a
instruo que causou a excepo, e atribuir a excepo correcta instruo
correcta, e dessa forma algumas mquinas resolveram este problema relaxando
simplesmente este requerimento, dando origem s chamadas de excepes
imprecisas. Por exemplo, tendo o PC um determinado endereo no incio do ciclo
de relgio, e existindo uma excepo nesse ciclo, atribudo o endereo da
excepo ao valor do PC, mesmo que no tenha sido essa instruo a causar o
problema, e deixar ao sistema operativo resolver o problema. No entanto, nos
sistemas modernos esta no uma soluo vivel, e a maioria deles usa modelos
evoludos de tratamento de excepes precisas.
2.1. Riscos Estruturais e o Aumento dos Recursos
Os riscos estruturais podem ocorrer quando duas instrues precisam, ao mesmo
tempo, dos mesmos recursos para serem executados. Pode acontecer, por
exemplo, quando se tem apenas uma memria (e apenas uma porta de acesso),
ou ento o caso de se ter uma operao que ocupe o estgio de execuo por
vrios perodos de relgio (como a multiplicao seguinte).
1. mult R1 = R2, R3
2. store mem(R4) = R1
A instruo imediatamente a seguir ser retida, esperando pela liberao do
estgio de execuo.
Uma soluo j referida, ser de inserir "bolhas" ou "nops" para atrasar a
execuo da instruo. Assim...
0 1 2 3 4 5 6 7
mult R1 = R2, R3 IF ID EX EX EX ME WB
store mem(R4) = R1 IF ID Nop Nop EX ME WB
... em que 'Nop' representa a "bolha".
Uma outra soluo, a qual usada por muitos sistemas de hoje, aumentar os
recursos existentes adicionando tambm mais lgica de controlo de modo a
saber-se quais os recursos a serem usados em cada ciclo de relgio. Referindo-se
aos exemplos anteriores, passaria por introduzir mais memria, ou utilizar mais
unidades de execuo, por exemplo, uma para processar a aritmtica e outra
para a escrita (mas se ocorressem duas instrues aritmticas seguidas
voltaramos ao mesmo).

2.2. Riscos de Controlo e a Previso de Salto
Estes riscos, ou dependncias, surgem da necessidade de tomar uma deciso
baseada nos resultados de uma instruo que ainda no terminou. Acontecem,
geralmente, em instrues de salto condicional, que podem alterar o fluxo das
instrues ao longo do pipeline, pois o resultado destes saltos condicionais no
so conhecidos at ao momento de serem executados. Uma instruo deve ser
buscada em cada ciclo de relgio para sustentar o pipeline, mas a deciso acerca
de realizar o salto ou no s conhecida no final do estgio de execuo. Dessa
forma tero de ser inseridos Nops para obviar este problema.
0 1 2 3 4 5 6 7
branch Next, R1 >0 IF ID EX ME WB
Nop Nop Nop Nop Nop
Nop Nop Nop Nop Nop
Next: add R2 = R3, R1 IF ID EX ME WB
Como se pode verificar, usado um salto condicional para a label "Next",
baseado na comparao do registo R1 com 0. Assuma-se que o contedo de R1
maior que 0. Enquanto que esta instruo buscada, descodificada e executada,
a unidade de busca de instrues tem de esperar que o resultado da comparao
anterior seja conhecido. Neste pipeline, a comparao feita no estgio EX, e a
busca tem de esperar pelo ciclo seguinte para comear.
No exemplo anterior, foram introduzidos dois Nops para poder ser executada a
adio. Este mtodo claramente ineficiente. Por essa razo, os desenhadores de
sistema desenvolveram um outro processo para lidar com este problema, que
consiste em prever qual ser a deciso de tomar (ou no) o salto.

Assumir Salto no Tomado
um tipo de previso esttica e baseia-se simplesmente em agir sempre da
mesma forma face a uma instruo de salto condicional, isto , continuar a
execuo ao longo do fluxo normal de instrues. Se na altura o salto for, de
facto, tomado, as instrues que foram buscadas e descodificadas tero de ser
descartadas e a execuo continua no endereo correcto de destino.
Previso Dinmica de Salto
Assumir que o salto no tomado uma forma rude de previso de salto. Nesse
caso, previsto que o salto no tomado, "limpando" o pipeline quando essa
previso est errada. Um outro tipo de previso, consiste em analisar o endereo
dessa instruo de salto e verificar se na ltima vez que foi executada o salto foi
de facto tomado ou no, e se foi, comea-se a buscar novas instrues do mesmo
stio que anteriormente.
Uma implementao desta aproximao consiste num buffer de previso de salto,
ou ento numa "tabela de histria de saltos". Um buffer de previso de salto
consiste nume memria pequena, indexada pelo endereo dessa instruo de
salto. Essa memria contm tambm um (ou mais) bit(s) que indica(m) se o
salto foi tomado recentemente tomado ou no. Assim, se cada entrada no buffer
ou tabela contiver o endereo da instruo de salto, e dois bits de histria de
salto, a previso pode ser realizada na forma que se segue.
Quando o salto tomado pela primeira vez, a unidade de execuo providencia
feedback para a lgica de previso de salto. assim guardado o endereo dessa
instruo e os bits de histria de salto so inicializados de forma a indicar que o
salto foi tomado em 100% das vezes que foi executado. Estes bits podem indicar
um de 4 estados possveis:
1. Fortemente Tomado. Os bits de histria so inicializados com este
estado quando a entrada criada. Adicionalmente, se um salto marcado
como Fracamente Tomado tomado novamente, ento alterado para
este estado. Por sua vez, quando um salto marcado como Fortemente
Tomado, e no tomado na prxima vez, ento decresce para o estado
seguinte. Se for tomado ento o estado no se altera.
2. Fracamente Tomado. Se uma instruo de salto for assim marcada, e o
salto for de facto, tomado, ento o estado cresce para Fortemente
Tomado. Por sua vez, se no for tomado, ento decresce para Fracamente
No Tomado.
3. Fracamente No Tomado. Se uma instruo de salto for marcada como
Fracamente No Tomada e existir um salto, ento os bits de histria so
alterados para Fracamente Tomado. Se no for tomado o salto, ento
decresce para Fortemente No Tomado.
4. Fortemente No Tomado. Se for marcada desta forma e o salto for
tomado, ento o estado alterado para Fracamente No Tomado. Se no
for tomado ento mantm-se.


2.3. Riscos de Dados e o Forwarding
Estas dependncias ocorrem quando uma instruo depende dos resultados de
uma instruo anterior que ainda se encontra no pipeline. Acontece, por exemplo,
quando se tem uma operao que coloca o resultado num registo que usado
como operando na instruo seguinte. Uma soluo bvia ser colocar nops de
modo a atrasar a execuo da instruo, como se exemplifica de seguida:
0 1 2 3 4 5 6 7 8
add R2 = R1, R0 IF ID EX ME WB
mult R0 = R2, R1 IF Nop Nop Nop ID EX ME WB
Mas alm de bvia, tambm ineficiente ! Uma outra forma de resoluo deste
problema consiste no uso de caminhos especiais, que transferem rapidamente os
dados de um estgio para outro (depositando os valores em buffers especiais
desenhados para este efeito), isto , fazem o forwarding (ou bypassing) dos
dados. Assim, as instrues seguintes no tm de esperar que essa chegue ao
estgio WB, para depois lerem os operandos do ficheiro de registos.
Uma possibilidade de implementao ser exemplificada na figura seguinte.

Na figura anterior foram adicionados 4 bypasses. Trs vo para o estgio de
execuo, provindos dos estgio de execuo, de acesso memria e escrita de
retorno, e um vai do estgio de acesso memria para ele prprio. Obviamente
representa apenas uma possibilidade de implementao, e existiro outras, mas
verifique-se que o problema apresentado nas duas instrues anteriores (de
adio e multiplicao) fica resolvido, pois o registo R2 ficar disponvel na
segunda instruo via o bypass que vem do estgio de execuo para o estgio
de descodificao.
Verifique-se que a sequncia de instrues apresentadas no ponto 8.1. (Descrio
Geral) apresenta o mesmo problema, e uma primeira soluo ser de inserir os
nops, como se exemplifica de seguida.
0 1 2 3 4 5 6 7 8 9 10 11 12 13
load FP1 = mem(R1
+ R2)
IF ID EX ME WB
load FP2 = mem(R3
+ 4)
IF ID EX ME WB
mult FP3 = FP1, FP2 IF Nop Nop Nop ID EX ME WB
store mem(R1 + R2)
= FP3
IF Nop Nop Nop ID EX ME WB
A instruo de multiplicao usa como operando um registo cujo valor s ficar
disponvel no final do estgio de acesso memria da instruo de leitura
anterior e a instruo de escrita usa um valor que s fica disponvel no final do
estgio de execuo da instruo de multiplicao, logo no sero apenas
precisos 7 ciclos de relgio para completar a execuo desta sequncia, como
descrito atrs. Usando o forwarding (ou bypass) descrito anteriormente,
possvel de retirar os nops entre a multiplicao e a instruo de escrita. O ltimo
nop entre a segunda instruo de leitura e a multiplicao no pode ser eliminado
pois no existem bypasses que vo desde o estgio de acesso memria para o
estgio de descodificao (na implementao que foi exemplificada). O resultado
final ser assim:
0 1 2 3 4 5 6 7 8
load FP1 = mem(R1 + R2) IF ID EX ME WB
load FP2 = mem(R3 + 4) IF ID EX ME WB
mult FP3 = FP1, FP2 IF Nop ID EX ME WB
store mem(R1 + R2) = FP3 IF ID EX ME WB

2.4. Pipeline Interlocks
Como se verificou, uma dependncia de dados, de controlo, ou de recursos pode
causar que uma instruo seja bloqueada num estgio do pipeline espera que a
instruo anterior produza um resultado ou libere um recurso. Para ter a certeza
que uma instruo impedida de executar quando necessrio, isto , quando
poder vir a causar uma paragem, o hardware verifica se existem dependncias e
bloqueia essas instrues de seguirem a sua execuo at que as dependncias
sejam resolvidas. O hardware que realiza essas verificaes referido como
lgica interlock.
As seguintes so as maiores verificaes que podem ser realizadas quando uma
instruo passa ao longo do pipeline. Determinando precisamente quais as
verificaes que so necessrias e quando tm de ser feitas uma funo da
implementao especfica do pipeline.
Registos Operandos : os registos operandos, tm de estar disponveis
durante o estgio de descodificao/leitura de operandos; no dever
existir nenhuma instruo a ser executada que os modifique.
Unidades Funcionais: Em certas implementaes, uma operao pode
demorar mais de um ciclo de relgio para ser executada, mas poder no
ser pipelined. Este caso acontece mais frequentemente com os
multiplicadores de inteiros e divisores. Neste caso, poder existir um
interlock no estgio de execuo para bloquear as instrues seguintes
que necessitem de usar essa mesma lgica de execuo.
Resultados de Comparao: No estgio de busca de instrues, os
resultados de comparao para um salto condicional devem estar
completados antes que as instrues a seguir ao salto sejam buscadas.
Estes resultados de comparao so produzidos geralmente no estgio de
execuo e tero de ser passadas de volta ao pipeline na forma de bits de
cdigos de condio, registos de resultado ou algum tipo de sinais de
controlo.
Cache de Dados: Se uma instrues de leitura de memria falha na cache,
existir um atraso enquanto os dados so buscados da memria principal.
Em muitas implementaes, este atraso significa que um recurso de cache
de dados est bloqueado. Um interlock impede as instrues subsequentes
de acederem ao estgio de acesso memria enquanto que a cache de
dados est espera de dados vindos da memria principal.
Porta de Escrita para Registos: Em algumas implementaes de pipeline,
vrias instrues podem terminar ao mesmo tempo. Neste caso, dever
existir um interlock no estgio de escrita de retorno para partilhar uma
nica porta de escrita no ficheiro de registos.
Para uma instruo passar de um estgio para o seguinte, todos os interlocks
nesse estgio devem "passar". Adicionalmente, deve haver espao para a
instruo no prximo estgio do pipeline, isto , se uma instruo no estgio
seguinte est bloqueada, a instruo no estgio corrente poder ser forada a
bloquear tambm, mesmo tendo "passado" em todos os interlocks.
3. Alm dos pipelines simples
Esta seco d apenas uma viso geral daquilo que se pode fazer no sentido de
optimizar as tcnicas j existentes, entre as quais o pipeline. Assim, combinando
optimizaes sobre o hardware como pipelines mais longos ou a operarem em
paralelo, quer sobre software, como a temporizao de instrues pode-se atingir
um throughput bastante mais elevado do que se teria usando, por exemplo o
pipeline descrito na seco anterior.
Pipelines mais longos (Superpipelining)
Para os pipelines discutidos at ao momento, o throughput mximo de uma
instruo por ciclo de relgio. Dado este constrangimento, um mtodo bvio de
obter maior throughput ser de aumentar a frequncia de relgio. Uma forma de
o fazer ser de usar mais estgios, em que cada um deles realiza menos trabalho
(e dessa forma demora menos a executar diminuindo tambm a perodo de
relgio).

Enquanto que as instrues sejam independentes, pipelines mais longos do
origem a um throughput maior, na medida em que o relgio tambm mais
rpido. Mais estgios significa que mais instrues podem ser processadas em
paralelo.
No entanto, com instrues dependentes, os melhoramentos na performance so
limitados devido ao facto de os estgios de pipeline adicionais estarem
preenchidos com nops ou bolhas, e no instrues. Essas bolhas ocorrem entre
instrues em que uma delas requere que um certo resultado ou informao de
controlo seja providenciado pela instruo anterior. Dividindo o trabalho em mais
estgios simplesmente adicionar um maior nmero de bolhas, separando as
instrues dependentes. medida que o pipeline tornado mais longo e o
nmero de bolhas aumenta, chegado um limite nos melhoramentos de
performance pois os estgios adicionais no tero mais instrues, mas apenas
bolhas.
Para cada estgio do pipeline, ocorre um certo atraso que decorre da escrita no
registo pipeline (ou latch) que divide os estgios. Este atraso significa que o
perodo de relgio no ser reduzido em proporo directa com o nmero de
estgios adicionados. Por exemplo, se uma implementao de 4 estgios com um
perodo de relgio de 50 ns for dividida em 8 estgios, perodo de relgio
provavelmente ser algo superior aos 25 ns. Dessa forma, a performance poder
ser reduzida para pipelines mais longos quando as dependncias de instrues
limitam o nmero de instrues que podem ser processadas ao mesmo tempo, e
a largura do pipeline adiciona uma maior latncia.
Pipelines Paralelos
At agora, focou-se apenas "pipelines lineares" que possuem apenas um caminho
que todas as instrues percorrem com o objectivo de serem processadas.
Pipelines paralelos providenciam caminhos diferentes dependendo do tipo das
instrues.

Primeiro, existe um pipeline nico para busca e descodificao de instrues, mas
que depois se divide em partes paralelas dependendo do tipo da instruo a ser
executada. Este tipo de pipeline permite que as instrues sejam executadas com
maior independncia. Uma instruo no bloqueada apenas porque a sua
precedente pode estar tambm bloqueada no pipeline ou a usar o estgio de
execuo por vrios ciclos de relgio. Os pipelines paralelos podem ser de
comprimentos diferentes, dependendo das suas funes. Por exemplo, um
pipeline de multiplicao de nmero em vrgula flutuante ser certamente maior
que uma que realiza apenas operaes lgicas simples. Por causa dessa variao
de comprimento, instrues na pipeline podem completar numa ordem diferente
daquela que foram iniciadas.
Uma vantagem importante destas pipelines ocorrem quando uma instruo
bloqueada na cache de dados devido a uma falha. Se a cache estiver num
pipeline diferente das operaes de vrgula flutuante, a instruo de vrgula
flutuante indepente que se segue pode proceder e no mantida atrs da
instruo de memria que falhou a cache.
Processadores Superescalares
Observou-se anteriormente que uma forma de melhorar o throughput do pipeline
tornar esse pipeline mais longo e aumentar a frequncia do relgio. Uma outra
forma construir pipelines capazes de buscar, descodificar e executar
simultaneamente mais de uma instruo de cada vez.
As implementaes "superescalares" vo buscar o seu nome ao facto de "escalar"
sugerir o processamento de um item de dados de cada vez (em contraste com o
processamento vectorial usado em muitos supercomputadores). Processadores
superescalares vo alm do processamento escalar na medida em que operam
em vriaos items de dados de cada vez, usando instrues escalares.

Nos pipelines paralelos, a descodificao era feita num nico estgio ID, o que
limitava o nmero mximo de intrues descodificadas por perodo de relgio. Em
implementaes superescalares, vrias instrues so buscadas e depois
despachadas para descodificao, por ciclo de relgio, para vrios estgios de
execuo. Este implementao leva a uma maior processamento e instrues e
uma melhor utilizao dos pipelines paralelos.
Estas implementaes tm aumentado significativamente os interlocks e os
problemas de conflito de recursos, em comparao com as suas congneres
escalares. Os interlocks tm de ser resolvidos no apenas nas instrues
precedentes da pipeline, mas com quaisquer instrues que estejam no mesmo
estgio. Alm disso, alguns estgios do pipeline, como o acesso memria,
tornam-se mais complicados se a implementao suportar mais que um acesso
de cada vez. Por esta razo, algumas implementaes restringem os tipos de
instrues que podem ser executados simultneamente. Por exemplo, em
algumas implementaes, duas operaes de memria, ou duas operaes de
vrgula flutuante no podem ser processadas simultneamente no mesmo estgio
do pipeline; contudo, uma instruo de acesso memria e uma instruo de
vrgula flutuante podem processadas na mesma altura.
Pipelining Dinmico e Execuo Especulativa
O pipelining dinmico resolve o problema da paragen de uma instruo que fica
bloqueada no pipeline, executando aquelas que lhe seguem, enquanto espera que
essa paragem seja resolvida. Tipicamente, o pipeline dividido em trs grandes
unidades: uma unidade de busca e despacho, unidades de execuo e unidade de
trmino.

A figura anterior mostra bem o modelo. A primeira unidade busca as instrues,
descodifica-as, e envia-as para as correspondentes unidades funcionais, no
estgio de execuo. Cada unidade funcional possui buffers, chamados de
Estaes de Reserva, que guardam os operandos e a prpria operao. Quando
essa estao possuir todos os operandos e a unidade funcional est pronta a
executar, o resultado calculado. Nessa altura, depende da unidade de trmino
de decidir se seguro colocar esse resultado em registos (ou memria).
Este modelo bsico possui assim, vrias mquinas independentes a processar
instrues: uma unidade a ir buscar e descodificar instrues, vrias unidades
funcionais a realizar operaes e uma unidade que d por terminada a execuo
das instrues. Para por os programas a comportarem-se como se estivessem
numa mquina sem pipeline, a unidade de busca e descodificao despacha
instrues na ordem que esto originalmente, e unidade de trmino requerido
que escreva os resultados na ordem normal de execuo do programa. Este
modelo designado por "trmino em ordem". Contudo as unidades funcionais,
so livres de executarem as instrues na ordem que "quiserem". Um outro
modelo de execuo, consistir em executar e terminar as instrues fora da
ordem normal do programa designado por "trmino fora de ordem".
O pipelining dinmico geralmente combinado com a previso de salto, dando
origem ao conceito de "execuo especulativa". Assim, "tendo em mos" uma
instruo de salto, o que o processador faz dar uma previso de salto, e a partir
dessa previso executar em paralelo as instrues seguintes. Caso se verifique
uma previso errada, ter de existir a possibilidade de descartar as instrues
que foram executadas at ento, e comear de novo a buscar e executar
instrues a partir do salto. As mquinas dinmicas so assim capazes de prever
o fluxo de execuo do programa, analisando as instrues para verificar qual
delas ser executada de seguida, e execut-las especulativamente baseado na
previso ou ento nas dependncias ocorridas com instrues anteriormente.
As motivaes para a execuo dinmica so ento as seguintes:
1. Esconder a latncia da memria.
2. Evitar paragens que o compilador no pde resolver, geralmente devido a
dependncias relacionadas com leitura/escrita.
3. Executar especulativamente as instrues enquanto se espera que os
problemas sejam resolvidos.

Optimizaes por software
Analisou-se anteriormente melhoramentos que eram possveis ao nvel do
desenho do sistema, mas, dado que os programas que so desenvolvidos para
esses sistemas passam sempre por um processo de compilao ou interpretao,
cabe ao software, quer se trate do compilador ou interpretador, uma importante
palavra acerca do assunto. So vrias as tcnicas de optimizao de programas,
e uma delas, largamente usada, a de temporizao de instrues. A
temporizao de instrues consiste apenas em resolver certas dependncias
executando entre essas intrues de risco, outras instrues que no traro
problemas. Assim, em vez de se inserirem bolhas, ou nops, o que o compilador
faz inserir instrues cuja ordem de execuo no faz grande diferena.
Assuma-se que se tem a seguinte sequncia de instrues:
1. add R3 = R4 + R5
2. load FP1 = mem(R1)
3. load FP2 = mem(R2)
4. mult FP3 = FP1, FP2
Entre a segunda instruo de leitura e a multiplicao, ir existir uma
dependncia de dados, que como se verificou anteriormente, ter de ser resolvida
com uma bolha entre as duas, de modo a atrasar a execuo da ltima. Mas se o
compilador alterar a ordem das instrues para a forma:
1. load FP1 = mem(R1)
2. load FP2 = mem(R2)
3. add R3 = R4 + R5
4. mult FP3 = FP1, FP2
Verifica que a dependncia desaparece, pois substitui-se uma instruo que no
fazia nada (apenas atrasava a execuo) por outra que, atrasando tambm a
execuo da multiplicao, j realiza trabalho til, e no cria problemas
adicionais.
4. Pipelining no PowerPC 604e
O processador PowerPC 604e tem a possibilidade de obter um throughput de
mais do que uma instruo por ciclo de relgio a partir dos vrios
desenvolvimentos em termos de performance que possui. Estes incluem vrias
unidades de execuo que operam indepentemente e em paralelo, pipelining,
despacho de instrues superescalar, previso dinmica de salto, implementao
de duas estaes de reserva para cada unidade de execuo para evitar maior
latncia devido a paragens no pipeline, e buses de resultados que realizam o
forwarding dos mesmos resultados para instrues dependentes, em vez de se
esperar que esses resultados fiquem disponveis nos registos de sistema. A figura
seguinte realizada pela Motorola, mostra o diagrama tcnico do processador
PowerPC 604e.
carregue para ver imagem
A unidade de trmino do 604e (Completion Unit) pode retirar 4 instrues por
ciclo de relgio. Em geral, o processamento de instrues realizado em 6
estgios : estgio de busca, estgio de descodificao, estgio de despacho,
estgio de execuo, estgio de trmino e estgio de escrita de retorno. O
estgio de busca inclui os ciclos de relgio necessrios para o pedido de
instrues cache bem como os ciclos necessrios para esta ltima responder. O
estgio de descodificao consiste no tempo que demora a descoficao de uma
instruo. No estgio de trmino, podem ser completadas 4 instrues por ciclo
de relgio, em ordem normal de programa. No estgio de escrita de retorno, os
resultados so escritos no ficheiro de registos. As instrues so buscadas e
executadas concorrentemente, com a possibilidade de poderem ser executadas
fora da ordem normal de programa. Os detalhes destas operaes sero
explicados nas seces posteriores.
Mas antes de analisar a estrutura do pipeline propriamente dito, convm dar uma
vista de olhos s unidades, ou blocos, que compem o processador PowerPC
604e, e que, dada a sua independncia, relativamente umas s outras, iro
permitir a execuo paralela de instrues, isto , o pipelining.
4.1. As Unidades Funcionais do PowerPC 604e
A figura d uma representao (bastante mais esquemtica e menos tcnica que
a figura anterior) da estrutura interna do processador 604e da Motorola.

Como se pode observar na figura, as unidades que se destacam so:
Unidade de Busca (Fetch Unit) : usando o prximo endereo sequencial
ou o endereo providenciado pela BPU quando um salto previsto ou
resolvido, a unidade de busca providencia as instrues para o Buffer ou
Fila de Instrues (Instruction Queue).
Unidade de Descodificao / Despacho (Dispatch Unit) : esta
unidade descodifica as instrues e despacha-as para a unidade de
execuo apropriada. Durante o despacho, os operandos so
providenciados para a unidade de execuo (ou estao de reserva)
podendo vir do registos, Buffers de Renomeao (Rename Buffers), e
Buses de Resultados (Result Buffers).
Unidade de Processamento de Salto (BPU) : em adio a providenciar
unidade de busca do endereo previsto da prxima instruo, quando
existe essa previso (e um endereo correcto caso se verifique uma m
previso), a BPU executa todas as instrues de controlo de fluxo.
Unidade de Registo de Controlo (CRU): executa todas as instrues
lgicas e de controlo de fluxo relativas aos registo de controlo (CR).
Unidades Aritmticas : como o nome indica tm por funo realizar as
operaes aritmticas (e lgicas).
Unidade de Trmino de Instrues (Completion Unit) : tem por
funo retirar as instrues executadas em ordem normal programa e
controla a actualizao do estado da mquina.
Unidade de Vrgula Flutuante (FPU) : tem por misso a rdua tarefa
de realizar as operaes em vrgula flutuante.
Unidade de Leitura / Escrita (LSU) : trata da transferncia de dados
entre a cache de dados e os buses de resultados.
Estas unidades garantem um fluxo correcto de instrues, e seus operandos, a
serem executadas, bem como uma actualizao correcta do estado da mquina.
4.1.1. Unidade de Busca (Fetch Unit)
Esta unidade providencia instrues fila de instrues, acedendo cache (L1)
de instrues (corresponde a um modelo de Harvard como se pode observar).
Tipicamente, realiza uma busca contnua e sequencial de, no mximo, 4
instrues de cada vez.
O endereo da prxima instruo a ser executada determinado por vrias
condies, as quais obedecem s seguintes prioridades:
1. Deteco de uma excepo. A busca de excepes comea na rotina de
tratamento de excepes.
2. A BPU recupera de uma previso incorrecta quando a instruo de salto se
encontra no estgio de execuo. As instrues que ainda no foram
despachadas, so descartadas e a busca recomea no endereo correcto.
3. A BPU recupera de uma previso incorrecta quando a instruo de salto se
encontra no estgio de despacho. As instrues que ainda no foram
despachadas, so descartadas e a busca recomea no endereo correcto.
4. A BPU recupera de uma previso incorrecta quando a instruo de salto se
encontra no estgio de descodificao. As subsequentes instrues so
descartadas e a busca recomea no endereo correcto.
5. O endereo de busca encontrado na Cache de Endereos de Destino de
Salto (BTAC, do ingls "Branch Target Address Cache") que contm os
endereos de destino de instrues de salto executadas anteriormente e
que sero previstos como tomados; ou ento, como prxima hiptese,
encontrado na Tabela de Histria de Saltos (BHT - "Branch History Table").
Esta ltima, consiste numa cache que contm dois bits extra que indicam
quatro estgios de previso : fortemente tomado, fracamanente tomado,
fracamente no tomado e fortamente no tomado. A transio entre cada
um destes estgios feita da forma explicada anteriormente.
6. Se nenhuma das condies prvias se verificam, a instruo buscada a
partir do prximo endereo sequencial.
4.1.2. Unidade de Descodificao / Despacho
Esta unidade providencia a lgica para descodificao de instrues e envio para
a unidade de execuo apropriada. O buffer ou fila de instrues consiste em
duas filas de 4 entradas cada - uma fila de descodificao (DEQ) e uma fila de
despacho (DISQ). A lgica de descodificao descodifica as quatro instrues e
coloca-as na fila de despacho. Para muitas instrues de salto, estas instrues
agora descodificadas, juntamente com os bits na BHT, so usados no estgio de
descodificao para correes de previses de salto efectuadas anteriormente.
A lgica de despacho descodifica as instrues na DISQ para possvel despacho.
Resolve tambm instrues de salto incondicional, e trata de enviar cada
instruo para a unidade de execuo apropriada. criada uma entrada para
cada instruo no Buffer de Trmino (Reorder Buffer), o que vai permitir
unidade de trmino saber qual a ordem das instrues, e so verificadas
depedncias entre as instrues na fila de despacho. Os Buffers de Renomeao
(Rename Buffers) so analisados medida que os operandos so trazidos dos
registos de sistema. Se os operandos foram escritos por outras instrues
frente desta na fila de despacho -lhe atribuda uma etiqueta que indica qual o
Buffer de Renomeao onde esto; em qualquer dos casos, esse buffer ou os
registos, providenciam sempre os operandos, ou ento uma etiqueta. medida
que as intrues so despachadas a Unidade de Busca notificada que a fila de
despacho pode ser actualizada com mais instrues.
4.1.3. Unidade de Processamento de Salto (BPU)
A BPU usada para instrues de salto e operaes lgicas relativas ao Registo
de Controlo. Todos os saltos, incluindo os incondicionais, so colocados numa
Estao de Reserva (Reservation Station) at que as condies sejam resolvidas
e possam ser executados. Nessa altura, as instrues de salto so executadas por
ordem - a unidade de trmino notificada se a previso foi correcta ou no.
4.1.4. Unidade de Registo de Controlo (CRU)
Como foi referido anteriormente, esta unidade executa as operaes lgicas e de
controlo de fluxo relativas ao registo de controlo. Como a CRU partilha o bus de
despacho com a BPU, apenas uma instruo de registo de controlo ou uma
instruo de salto pode ser despachada por ciclo de relgio. No 604e, as
operaes lgicas da CRU so processadas pela BPU. A adio desta unidade CRU
permite que as instrues de salto sejam potencialmente executas / resolvidas
antes de uma instruo lgica de CR. Embora apenas uma instruo lgica de CR
ou uma instruo de salto possa ser despachada por ciclo de relgio, no impede
que ambas possam ser executadas simultneamente. Os saltos continuam a ser
executados em ordem, em relao s outras instrues de salto. Caso quer a
estao de reserva da CRU, quer a da BPU esteja cheia, ento nenhuma instruo
pode ser despachada para qualquer uma das unidades.
4.1.5. Unidades Aritmticas
O PowerPC 604e possui trs unidades que tm por funo executar todas as
instrues sobre inteiros: duas unidades de ciclo nico (SCIUs) e uma
unidade de ciclo mltiplo (MCIU). Cada uma destas unidades tem um bus
dedicado de resultados que as liga aos Buffers de Renomeao e a todas as
Estaes de Reserva. Tm tambm cada uma delas uma estao de reserva de
duas entradas, com o objectivo de reduzir as paragens. A estao de reserva
pode receber instrues da unidade de descodificao/despacho e operandos dos
registos de uso geral (GPRs), buffers de renomeao e buses de resultados.
Cada SCIU consiste em trs subunidades de ciclo nico : um
somador/comparador, uma subunidade para operaes lgicas e uma outra para
rotaes, deslocamentos e contagem de zeros. Estas subunidades tratam de
todas as instrues aritmticas de ciclo simples; apenas uma subunidade pode
executar uma instruo a uma dada altura.
A MCIU consiste num multiplicador/divisor.
4.1.6. Unidade de Vrgula Flutuante (FPU)
Cada instruo que passa por esta unidade tem uma latncia de 3 ciclos de
relgio.
medida que a unidade de descodificao/despacho envia as instrues para as
estaes de reserva da FPU, os operandos podem ser acedidos dos registos de
vrgula flutuante (FPRs), dos buffers de renomeao de vrgula flutuante, ou dos
buses de resultados. Por sua vez, os resultados so escritos nos buffers de
renomeao para vrgula flutuante e para as estaes de reserva e so tornados
disponveis para as instrues subsequentes. As intrues so executadas da
estao de reserva ne ordem que foram despachadas.
4.1.7. Unidade de Leitura / Escrita (LSU)
A LSU transfere dados entre a cache de dados e os buses de resultados (que
enviam os dados para as outras unidades de execuo).
Contm um somador de 64 bits destinado ao clculo do endereo efectivo (EA). A
lgica de alinhamento de dados manipula os dados de forma a suportar
transferncias alinhadas ou no alinhadas com a cache de dados. As filas de
leitura e escrita so usadas como buffers para instrues que j foram
executadas e esto espera e serem completadas. Essas filas so tambm
usadas para monitorizar dependncias de dados geradas pela execuo fora-de-
ordem, assegurando um modelo sequencial.
4.1.8. Buffers de Renomeao (Rename Buffers)
Para evitar problemas relativos localizao dos registos, o 604e providencia os
chamados registos de renomeao, que tm por funo armazenar os resultados
das instrues antes da unidade de trmino os escrever no registos de sistema.
So 12 registos de renomeao para os GPRs, 8 para os FPRs e 8 para o registo
de condio.
Quando a unidade de despacho envia uma instruo para a correspondente
unidade de execuo, aloca um registo de renomeao para o resultado dessa
instruo. Providencia tambm uma etiqueta para a unidade de execuo,
identificando o resultado que deve ser usado como o operando. Quando o
resultado correcto retornado para o buffer tambm introduzido numa estao
de reserva. Quando todos os operandos estiverem disponveis na estao de
reserva, a execuo pode comeo.
A unidade de trmino no transfere os resultados das instrues, dos registos de
renomeao para os registos de sistema at que qualquer uma das condies
especulativas de salto precedendo-as na fila de trmino esteja resolvida e essas
prprias instrues sejam retiradas da fila de trmino sem ocorrncia de
excepes. Se se descobre que um salto especulativo foi mal previsto, as
instrues executadas especulativamente aps o salto so descartadas da fila de
trmino e os resultados dessas instrues so descartados dos registos de
renomeao.
4.2. Estrutura do Pipeline
A partir das unidades funcionais que se analisaram anteriormente foi possvel
desenvolver um pipeline de instrues principal no 604e que possui 6 estgios.
Instrues executadas pela mquina fluem ao longo destes estgios. Algumas
instrues (leitura, escrita, e vrgula flututante) fluem ao longo de estgios de
execuo adicionais. Os seis estgios bsicos do pipeline de instrues principal
so:
I. Busca (IF)
II. Descodificao (ID)
III. Despacho (DS)
IV. Execuo (EX)
V. Trmino (T)
VI. Escrita de Retorno (WB)

Algumas instrues podero ocupar vrios estgios simultaneamente, e algumas
unidades de execuo individuais, como a FPU e MCIU tm vrios estgios de
execuo.
Pipelines para instrues tpicas para cada uma das unidades de execuo so
mostradas na figura seguinte.

Note-se que esta figura no reflecte a latncia para todas as instrues que
passam ao longo de cada uma das pipelines. A diviso das instrues em "salto",
"inteiro", "leitura/escrita" e "vrgula flutuante" indica a unidade de execuo em
que as instrues so executadas. De notar que em muitas circunstncias, o
trmino e a escrita de retorno podero ocorrer no mesmo ciclo. Alm disso,
instrues de multiplicao de inteiros, diviso de inteiros, mover de/para SPRs, e
leitura e escrita, que podero falhar na leitura da cache podero ocupar ambos os
estgios de execuo (estgio final de execuo) e completude (e escrita de
retorno) simultaneamente.
4.2.1. Estgio de Busca (Fetch Stage)
Este estgio responsvel pela busca das instrues cache de instrues (o
PowerPc representa uma arquitectura de Harvard) e determinar o endereo da
prxima instruo a ir buscar. As instrues que so buscadas cache so
armazenadas no buffer de instrues para consideraes futuras por parte do
estgio de descodificao.
A unidade busca mantm este buffer de instrues fornecido para a unidade de
despacho processar. Normalmente, esta unidade busca as instrues
sequencialmente, mesmo quando o buffer est cheio, pois o espao pode ficar
disponvel na altura que a cache disponibilizar a instruo.
O endereo da prxima instruo a ser buscada pode ser afectado por vrias
condies. Cada estgio oferece o seu candidato, e o ltimo que tem a maior
prioridade. Quando um bloco "pr-buscado" a BTAC e a BHT so analisados com
o endereo de busca. Se esse encontrado na BTAC, ento ser esse o candidato
para o endereo da prxima instruo a ser buscada; caso contrrio, o prximo
endereo (sequencial) o candidato providenciado por este estgio.
O unidade de descodificao pode indicar uma predio anterior incorrecta,
baseado na BHT ou na descodificao de um salto incondicional. A unidade de
processamento de salto (BPU - "Branch Processing Unit") pode indicar que uma
predio de salto anterior, quer da BTAC ou do descodificador estava incorrecta e
pode fornecer um novo endereo. Neste caso, o contedo dos buffers de
intrues so apagados. Lgica relacionada com excepes, dentro da lgica do
estgio de completude pode indicar a necessidade de ir para o endereo de uma
rotina de tratamento de excepes.
Destas escolhas , a excepo ter a prioridade mais elevada, a unidade de salto a
segunda prioridade. a correco de uma predio da BTAC no estgio de
descodificao tem a terceira prioridade, e a predio da BTAC tem e prioridade
final para a "pr-busca" de instrues.
4.2.2. Estgio de Descodificao (Decode Stage)
Tem por funo levar a cabo a descodificao de instrues crticas em relao ao
tempo (que tero necessariamente de ser processadas naquela altura, por
exemplo quando se tm duas instrues em que a segunda precisa de um
operando que calculado na primeira, no se pode realizar a execuo "fora-de-
ordem"), que se encontram no buffer de instrues. Este estgio contm um
buffer de quatro instrues que desloca um ou dois pares de instrues para o
buffer de despacho quando o espao se encontra disponvel. No 604e a correco
de salto neste estgio prediz os saltos cujo endereo tomado do CTR ou LR.
Esta correco realizada apenas nas duas primeiras instrues do estgio de
descodificao.
4.2.3. Estgio de Despacho (Dispatch Stage)
Este estgio responsvel pela descodificao de instrues no crticas em
termos de tempo, fornecidas pelo estgio anterior e por determinar quais as
instrues que podem ser "despachadas" no ciclo de relgio corrente. Alm disso,
os operandos da instruo so lidos e "despachados" com a instruo para o
estgio de execuo. No final deste estgio, todas as instrues despachadas e
seus operandos so introduzidos nas estaes de reserva ou como input numa
determinada unidade de execuo.
Estas estaes de reserva correspondem a buffers entre os estgio de despacho e
execuo que permitem que as instrues sejam despachadas mesmo que os
operandos requeridos para a instruo no estejam disponveis. Existem duas
estaes para cada unidade de execuo, que assim permitem evitar uma maior
latncia devido a paragens na pipeline, pois se uma instruo precisa de um
resultado calculado na instruo anterior, esta instruo anterior, no final do seu
estgio de execuo, coloca o valor num destes reservatrios via bus de
resultados, o que permite instruo seguinte dispor desse valor no ciclo de
relgio pretendido sem precisar de ler os registos (esta tcnica designada por
forwarding)
4.2.4. Estgio de Execuo (Execute Stage)
Como se pode ver na figura, depois de uma instruo passar ao longo dos
estgios de busca, descodificao e despacho, esta passada para a unidade de
execuo apropriada. Nesta altura, diz-se que se encontra no estgio de
execuo. De notar que o tempo que uma instruo passa no estgio de
execuo varia, dependendo da unidade de execuo. Por exemplo, a unidade de
vrgula flutuante tem uma unidade de execuo de trs estgios, totalmente
pipelined, logo a maioria das instrues de vrgula flutuante tm uma latncia de
execuo de trs ciclos de relgio, independentemente da preciso usada.
Algumas instrues, como a diviso de inteiros, tm que repetir alguns estgios
de modo a terem o resultado correcto.
Este estgio executa a instruo seleccionada no estgio de despacho, o que
poder vir das estaes reservatrias ou de instrues provindas da unidade de
despacho. No final do estgio de execuo, a unidade de execuo escreve o
resultado para uma entrada no buffer temporrio, notifica o estgio de
completude que a instruo terminou a sua execuo. Existem vrios buffers
temporrios que so usados por instrues que ainda no completaram, e ainda
como buffers para escrita de retorno para aquelas que j terminaram.
Se determinado que a direco de uma instruo de salto foi incorrectamente
predicta num estgio anterior, ento as instrues desse caminho
incorrectamente predicto so descartadas e a busca para novas instrues
retomada no endereo correcto.
Se uma instruo causar uma excepo, a unidade de execuo indica uma
excepo ao estgio de completude e continua a executar instrues
independentemente da excepo.
4.2.5. Estgio de Trmino (Completion Stage)
Este estgio tem por fim manter o estado correcto da mquina. Para o realizar
considera o nmero de instrues que residem no buffer de completude e usa a
informao acerca do estado das instrues providenciadas pelo estgio de
execuo.
Quando as instrues so despachadas, so-lhes atribudas uma posio no
buffer de 16 entradas da completude que mantm at ultrapassar os
constrangimentos impostos pela completude. Quando uma instruo termina a
sua execuo, o seu estado guardado na correspondente entrada no Buffer de
Trmino (tambm chamado de Buffer de Reordenao). Este buffer gerido
como um FIFO ("first in first out"), isto , examina as entradas na ordem que as
instrues foram despachadas. O facto deste buffer permitir que o processador
guarde a ordem do programa assegura que as instrues so terminadas na
ordem correcta.
O estado de quatro entradas examinado ao longo de cada ciclo para determinar
se os resultados podem ser escritos de retorno, e dessa forma, no mximo quatro
instrues podem terminar por ciclo de relgio. Se uma instruo causar uma
excepo, a informao acerca do seu estado no buffer de completude reflecte
isso mesmo, e essa informao usada para gerar uma excepo. Desta forma
este buffer usado para assegurar um modelo preciso de excepes.
Tipicamente, as excepes so detectadas no estgio de busca, descodificao e
execuo.
A escrita de retorno pode ocorrer neste estgio se as portas e os resultados
estiverem disponveis; caso contrrio, essa escrita tratada como um estgio
separado. Desta forma o processador pode completar as instrues sem ter de se
preocupar com o nmero ou presena (ou no) dos resultados. De notar que se
uma operao de leitura na cache falha, a mesma instruo pode completar (caso
seja certo que no causa uma excepo) mesmo que o resultado no esteja
disponvel.
Os buffers de renomeao para os FPR's, GPR's e CR so usados (como foi
referido anteriormente) por instrues que ainda no completaram ou como
buffers para escrita de retorno para aquelas que terminaram. Cada um destes
buffers tem duas portas de leitura para escrita de retorno, correspondendo s
duas portas providenciadas para escrita nos GPR's, FPR's ou CR. No mximo dois
resultados, so copiados em cada escrita de retorno para registos por ciclo de
relgio.
Se a lgica de completude detectar uma instruo que contenha um estado de
excepo ou uma instruo que cause que as instrues subsequentes sejam
descartadas com a completude, todas as instrues seguintes so canceladas, e
os resultados provindos das unidades de execuo so tambm descartados, e a
busca de novas instrues continua na sequncia correcta de instrues.
4.2.6. Estgio de Escrita de Retorno (Write-Back Stage)
Este estgio usado para escrever qualquer informao provinda dos buffers de
renomeao que no foi escrita no estgio anterior.
Como foi mencionado na seco anterior, cada um desses buffers possui duas
portas de leitura para escrita de retorno, que correspondem s duas portas
providenciadas para escrita em GPR's, FPR's e CR. No mximo dois resultados
podem ser copiados destes buffers para registos por ciclo. Para compensar este
estgio extra, o buffer de renomeao para GPR's tem 12 entradas, o que reduz
as possibilidades de paragens no despacho de instrues que dependem bastante
de instrues sobre inteiros.
5. Pipelining no Intel Pentium
A forma como foi implementada esta tcnica no igual para todos os
processadores Pentium. De facto, podem-se observar estruturas bastante
prprias entre os Pentium (com e sem MMX) e os Pentium Pro. Sero estudados
de seguida a famlia de processadores Pentium sem MMX, portanto com relgios
at 166 MHz, e os Pentium Pro.
5.1. O Intel Pentium
Esta seco descreve (de uma forma geral) a estrutura interna e modelo de
execuo pipelined da famlia de processadores Intel Pentium com relgios at
aos 166 MHz (sem MMX portanto).
A figura seguinte, representa o diagrama de funcionamento do processador
Pentium.

Este processador incorpora dois pipelines para instrues, designadas por pipeline
U e pipeline V. A primeira a pipeline primria, e assim todas as instrues
podem ser aqui executadas, enquanto que na segunda s podem ser executadas
instrues simples. Ambos os pipelines so "alimentados" por um fluxo contnuo
de instrues provindas da unidade de pr-busca (Prefetcher).
O prefetcher, por sua vez, vai buscar o cdigo cache de dados (Code Cache), no
caso de existir uma leitura bem sucedida, ou ento unidade de bus (Bus Unit),
no caso de uma falha, que por sua vez vai buscar a informao memria
externa (cache L2, memria principal, etc).
Quando o processador busca uma linha de cdigo sua cache interna (cache L1),
transfere-a para uma fila na unidade prefetch. Duas instrues so ento
retiradas dessa fila, e enviadas para o primeiro estgio de descodificao (D1),
em cada um dos pipelines. No estgio D1 dos dois pipelines, o processador
verifica a possibilidade de executar as instrues simultneamente (Pairing
Check) e, no caso de se tratar de uma instruo de salto, prev se o salto ser
tomado ou no quando essa instruo de salto chegar ao estgio de execuo.
Esta previso feita pelo Buffer de Salto (ou Branch Target Buffer - BTB).
No estgio 2 de descodificao (D2), as instrues so analisadas de forma a
verificar se iro aceder memria. Se sim, o endereo de destino formado (um
deslocamento adicionado ao endereo de incio de segmento); so realizadas
verificaes de proteco e caso seja necessrio so geradas excepes de
proteco.
As instrues seguem para o estgio de execuo. Se a execuo das instrues
requerer acesso memria, ento gerado um pedido de acesso cache de
dados. Se se tratar de um pedido de leitura, os dados so providenciados pela
cache de dados (no caso de sucesso), ou pela memria externa (no caso de uma
falha). Por sua vez, se se tratar de um pedido de escrita e os dados se
encontrarem na cache, ento a cache actualizada.
Finalmente, se a execuo de uma instruo requerer uma actualizao dos
registos da arquitectura, ento esses so actualizados durante o estgio de
escrita de retorno (Write Back).
O modelo de execuo pipelined do Pentium, pode ser dividido em 5 estgios, os
quais so analisados de seguida:
1. Estgio de Pr-Busca.
2. Estgio 1 de Descodificao.
3. Estgio 2 de Descodificao.
4. Estgio de Execuo.
5. Estgio de Escrita de Retorno.
5.1.1. Estgio de Pr-Busca (Prefetching)
Durante a execuo normal de instrues a unidade de prefetch recebe uma linha
de cdigo da cache (ou unidade de bus, no caso de uma falha) e coloca-a na fila
activa de prefetch. Essa unidade possui duas filas, as quais podem conter at
duas linhas (ou 64 bytes) de informao. Apenas uma fila est activa num dado
momento. O prefetcher continua a sacar sequencialmente cdigo da cache para a
fila, at que a unidade de previso de salto (BTB) preveja que um salto seja
tomado, quando essa instruo chegue ao estgio de execuo. A lgica de
previso de salto, providencia, nesta altura, o endereo de salto da prxima
instruoa executar, unidade de prefetch, que troca de fila e comea a buscar
instrues sequencialmente, a partir deste novo endereo, para esta fila. A fila
recentemente activa providencia instrues para os dois pipelines.
Se o salto tomado quando a instruo de salto chega ao estgio de execuo,
ento as instrues no pipeline so as correctas, e a execuo no pra. Mas se,
por outro lado, o salto no tomado, ento essas instrues tero de ser
despejadas. O prefetcher troca ento para outra fila, que comea a fornecer
instrues para os dois pipelines (que foram pr-buscadas anterioermente troca
de fila). Esse despejo e troca, causa uma breve paragem nas unidades de
execuo at que o fluxo de instrues avance dos estgios D1 e D2 para o
estgio de execuo. Adicionalemente, a lgica de previso de salto (que possui
um algoritmo semelhante ao exemplificado anteriomente referente previso
dinmica de salto) actualizar os bits da histria de saltos, indicando que o salto
no foi tomado desta vez.
Se foi previsto que uma instruo de salto, correntemente no estgio D1, no
ser tomada, a unidade de prefetch continuar a pr-buscar sequencialmente as
instrues para a fila correntemente activa. Se a previso se provar como
incorrecta quando a instruo chegar ao estgio de execuo, ento as instrues
no pipeline esto incorrectas e tero de ser descartadas e o processador dever
instruir a unidade de prefetch para comear a buscar instrues a partir do
endereo correcto de salto. Adicionalmente, a unidade de execuo dever
instruir a BTB de forma a actualizar a histria de saltos, indicando que o salto foi
tomado desta vez.
5.1.2. Estgio 1 de Descodificao (D1)
Neste estgio, cada um dos pipelines recebe instrues simultneamente
provindas da fila activa de prefetch. So realizadas duas verificaes:
As instrues so analizadas de modo a descrobrir se podem ser
executadas simultneamente (Pairing Check). Se no forem
"emparelhveis", a instruo no estgio D1 do pipeline V apagada e o
prefetcher insere-a no estgio D1 do pipeline U, quando a instruo que l
se encontra passar para o estgio D2.
Se qualquer uma das instrues for de salto, a BTB efectuar uma
previso de salto. Se for previsto como tomado, a lgica de previso
indicar ao prefetcher para mudar de filas e comear a buscar instrues a
partir do endereo previsto. Se for previsto como no tomado, o
prefetcher continuar a buscar instrues para a fila activa nesse
momento.
Quando so emparelhadas, as instrues em ambos os pipelines entram e deixam
cada um dos estgios em simultneo (com apenas uma excepo - ver 5.1.4.
Estgio de Execuo). Se uma instruo causar uma paragem, a instruo no
outro pipeline no enviada para o estgio seguinte at que essa instruo
esteja pronta a seguir tambm.

5.1.3. Estgio 2 de Descodificao (D2)
Neste estgio so calculados os operandos que residem em memria, e tambm
so realizadas as verificaes de proteco necessrias quando o processador
est a formar endereos de memria em modo protegido. Este modo
corresponde ao modo nativo do processador. Todas as instrues e capacidades
da arquitectura esto disponveis, sendo o modo recomendado para todas as
aplicaes e sistemas operativos.
5.1.4. Estgio de Execuo
O estgio de execuo possui a unidade aritmtica e lgica, ou ALU. Alm das
operaes aritmticas e lgicas, e sempre que ncessrio, so realizados
tambm neste estgio os acessos cache de dados (no caso de sucesso) ou
acessos memria (no caso de uma falha). Acessos cache de dados podem ser
realizados por qualquer um dos pipelines simultaneamente.
De notar que ambas as instrues entram no estgio de execuo ao mesmo
tempo. Se a instruo no pipeline V parar, ento permitido instruo no
pipeline U de entrar no estgio seguinte. No entanto, a situao inversa no
possvel. No so transferidas instrues para o estgio de execuo at que
ambas as instrues nesse estgio sejam enviadas para o estgio seguinte.
5.1.5. Estgio de Escrita de Retorno
Neste estgio so actualizados os registos da arquitectura, o que inclui o registos
EFLAGS.
5.1.6. Os Estgios da Unidade de Vrgula Flutuante (FPU)
A forma como so executadas estas instrues diferente das restantes, e dessa
forma, dever ser-lhe dada uma referncia especial.
O pipeline da FPU consiste em oito estgio. Os primeiros quatro so partilhados
com a pipeline de inteiros (analisada anteriormente), mas os ltimos quatro
residem na prpria unidade. Os estgios so ento os seguintes :
1. Estgio de Pr-Busca : idntico ao estgio para inteiros.
2. Estgio 1 de Descodificao (D1) : idntico ao estgio para inteiros.
3. Estgio 2 de Descodificao (D2) : idntico ao estgio para inteiros.
4. Estgio de Execuo : so realizadas as leituras a registos, e leituras /
escritas na memria conforme so requeridas pelas instrues (para
aceder aos operandos).
5. Estgio 1 de Execuo da FPU : so realizadas as operaes de vrgula
flutuante dentro desta unidade.
6. Estgio 2 de Execuo da FPU : os resultados so arredondados e
escritos para os registos da arquitectura.
7. Informao de Erros : se um erro detectado, o sistema entra no
estgio de informao de erros, onde esse erro transmitido e o Registo
de Estado da FPU actualizado.
5.2. O Intel Pentium Pro
A estrutura do Pro muito semelhante do PowerPC 604e analisado
anteriormente. Verifique-se a seguinte figura que representa uma
esquematizao dos blocos funcionais do processador, elaborada pela Intel.

Trata-se de um processador pipelined, superescalar, capaz de , em mdia,
descodificar, despachar, e executar (e completar) at trs instrues por ciclo de
relgio. Para suportar este nvel de throughput, apresenta um pipeline de 5
estgios bsicos, capaz executar instrues fora da ordem normal de programa. A
figura anterior mostra um modelo conceptual deste pipeline, com quatro unidades
de processamento: unidade de busca/descodificao, unidade de
despacho/execuo, unidade de trmino e um buffer de reordenao (Reorder
Buffer).
Para assegurar um fluxo contnuo de instrues e dados para o pipeline, o
Pentium Pro incorpora dois nveis de cache. Uma cache L1, dividida em cache de
dados e cache de instrues (modelo de Harvard) e uma cache L2 a funcionar
velocidade do relgio do processador.
Aspectos importantes do Pentium Pro, incluem :
Previso de Salto
Anlise Dinmica de Fluxo de Dados : que involve uma anlise em tempo-
real do fluxo de dados ao longo do processador para determinar
depedncias de dados e de registos e detectar oportunidade para
execuo fora-de-ordem.
Execuo Especulativa
A maior diferena entre o Pentium e o PowerPc prende-se com a descodificao e
despacho. Em vez tentar realizar uma execuo pipelined de instrues de
tamanho varivel, a unidade de descodificao do Pro traduz as instrues da
Intel para instrues de tamanho fixo, de 72-bits, designadas por micro-
operaes, e envia-as para o buffer de reordenao e estaes de reserva. Esta
traduo demora 1 ciclo de relgio para determinar o tamanho das instrues da
Intel e mais dois para criar as micro-operaes. Uma micro-instruo (ou
micro-operao) no mais do que uma representao do controlo usando
instrues de baixo nvel, em que cada uma regula o conjunto de sinais de
controlo que esto activos em cada ciclo de relgio, e especifica qual a micro-
instruo que executada de seguida.
A maioria das instrues so traduzidas para uma a quatro micro-instrues, mas
as instrues realmente complexas so executadas por um micro-programa
convencional que emite uma longa sequncia de micro-instrues.
Como se verifica na figura, as principais unidades funcionais no Pentium Pro so
as seguinte :
Subsistema de memria : bus de sistema, cache L2, unidade de interface
de bus, cache de instrues (L1), cache de dados (L1), unidade de
interface de memria, e buffer de reordenao.
Unidade de Busca/Descodificao: unidade de busca de instrues, buffer
de salto (Branch Target Buffer), descodificador de instrues (Instruction
Decoder), sequenciador de micro-cdigo (Microcode Instrucion
Sequencer), e uma tabela de renomeao de registos (Register Alias
Table).
Buffer de Instrues (Buffer de Reordenao ou Reorder Buffer).
Unidade de Despacho/Execuo : Estao de Reserva (Reservation
Station), duas unidades de inteiros, duas unidades de vrgula flutuante, e
duas unidades de gerao de endereos (dentro da Memory Interface
Unit).
Unidade de Trmino (Retirement Unit).
5.2.1. Unidade de Busca / Descodificao
Esta unidade l um conjunto de instrues da arquitectura Intel da cache L1 de
instrues e descodica-as numa srie de micro-instrues. Este conjunto de
micro-instrues (ainda na ordem original) enviado para o Buffer de Instrues.
A unidade de busca de instrues busca uma linha de cache de 32-bytes por ciclo
de relgio para a cache de instrues. Tem tambm por funo calcular o
Contador de Programa, baseado nos dados vindos do Buffer de Salto, bem como
excepes, interrupes e indicaes de previses erradas de salto realizadas
pelas unidades de execuo de inteiros. A parte mais importante deste processo
a previso de salto realizada pelo Buffer de Salto. Tem a possibilidade de analisar
muitas instrues frente do contador da unidade de trmino.
O descodificador de instrues contm trs descodificadores a trabalhar em
paralelo: dois para instrues simples e um para instrues complexas. Cada um
deles converte uma instruo da arquitectura para uma ou mais micro-instrues.
Essas micro-instrues, como referido, so as primitivas de instrues que so
executadas pelas seis unidades paralelas de execuo do processador.
Muitas instrues da arquitectura so convertidas directamente para micro-
instrues simples pelos descodificadores (para instrues simples), e outras so
descodificadas para uma a quatro micro-instrues. As instrues mais
complexas so convertidas em sequncias de micro-instrues pr-programadas
obtidas pelo sequenciador de micro-cdigo. Os descodificadores de instrues
podem gerar at seis micro-instrues por ciclo de relgio (uma para cada um
dos descodificadores de instrues simples, e quatro para o descodificador de
instrues complexas).
O conjunto de registos da arquitectura pode causar paragens devido a
dependncias de registos. Para obviar este problema, o processador providencia
40 registos internos de uso geral (no os da arquitectura), que so usadas nos
clculos (os registos de renomeao - na Register Alias Table). Este registos
podem tratar de valores inteiros e em vrgula flutuante. Para alocar estes registos
internos, a fila de micro-instrues do descodificador enviada para a tabela de
renomeao de registos, onde as referncias aos registos da arquitectura so
convertidos em referncias para os registos internos.
No processo final de descodificao, a lgica que trata da alocao da tabela de
renomeao de registos adiciona os bits de estado e flags s micro-instrues
para prepar-las para a execuo fora de ordem e envia as micro-instrues
resultantes para o buffer de instrues.
5.2.2. Buffer de Instrues
Antes de entrar neste Buffer, o conjunto de micro-instrues estava na mesma
ordem que o conjunto de instrues da arquitectura que foi enviado para a
unidade de descodificao. No foi realizada nenhuma reordenao de instrues.
Este buffer consiste num array de memria, arranjado em 40 registos de micro-
instrues. Contm as micro-instrues que esto espera de ser executadas,
bem como aquelas que j o foram, mas ainda no foram retiradas. A unidade de
despacho / execuo pode executar as instrues neste "buffer" em qualquer
ordem.
5.2.3. Unidade de Despacho / Execuo
Trata-se de uma unidade que temporiza e executa (fora da ordem normal de
programa) as micro-instrues do Buffer de Instrues de acordo como as
dependncias de dados e disponibilidade de recursos, e guarda temporariamente
os resultados dessas execues especulativas.
A temporizao e despacho de micro-instrues do buffer de instrues levada
a cabo pela estao de reserva. Est continuamente a pesquisar o buffer de
instrues por micro-instrues que esto prontas a serem executadas (isto ,
todos os operandos esto disponveis) e despacha-as para a respectiva unidade
de execuo. Os resultados da execuo destas micro-instrues so retornados
ao buffer de instrues, juntamente como a micro-instruo, at que seja
retirada. Este processo de temporizao e despacho suporta a execuo fora de
ordem, onde as micro-instrues so despachadas para as unidades de execuo
de acordo com os constrangimentos relativos ao fluxo de dados e a
disponibilidade de recursos para executarem as mesmas. Quando duas ou mais
micro-instrues do mesmo tipo (por exemplo, operaes de inteiros) esto
disponveis ao mesmo, elas so executadas de acordo como a sua ordem no
buffer de instrues.
A execuo das micro-instrues levada a cabo por duas unidades para inteiros,
duas unidades para vrgula flutuante e uma unidade de interface de memria
(que por sua vez se divide em duas unidades: uma para gerao de endereos
para escrita e outra para gerao de endereos para leitura), permitindo
que at 5 micro-instrues sejam executadas por ciclo de relgio.
As duas unidades de execuo para inteiros podem tratar de duas micro-
instrues em paralelo. Uma das unidades para inteiros foi desenhada para tratar
de micro-instrues de salto. Esta unidade tem a possibilidade de detectar
previses erradas e sinalizar o Buffer de Salto para reinicializar o pipeline,
enviando-lhe o endereo correcto.
A unidade de interface de memria trata das micro-instrues de leitura e escrita.
Um acesso para leitura precisa de especificar o endereo de memria, de forma a
poder ser codificado numa micro-instruo. Um acesso para escrita precisa de
especificar quer o endereo quer os dados a serem escritos, e dessa forma
codificada em duas micro-instrues. A parte desta unidade que trata das escritas
tem duas portas que permitem que processe a micro-instruo para especificao
de endereo e a que trata dos dados a serem escritos, em paralelo. Este unidade,
pode assim executar quer uma leitura quer uma escrita em paralelo num ciclo de
relgio.
As unidades de execuo para vrgula flutuante so semelhantes quelas que se
encontram no processador Pentium. Novas instrues de vrgula flutuante foram
adicionadas ao Pentium Pro para permitir o processamento de saltos condicionais
e transferncias de dados.
5.2.4. Unidade de Trmino
Esta unidade tem por funo terminar a execuo das micro-instrues, enviando
os seus resultados para os registos da arquitectura e retirando-as do buffer de
instrues. Analogamente estao de reserva, esta unidade verfica
continuamente o estado das micro-instrues no buffer de instrues, procurando
aquelas que j foram executadas e que no apresentam mais dependncias
relativamente a outras micro-instrues nesse buffer. Retira ento as micro-
instrues que foram completadas na ordem original de programa, tendo em
conta interrupes, excepes, e previses erradas de salto.
Pode retirar at trs micro-instrues por ciclo de relgio.
5.2.5. Estrutura do Pipeline
A partir das unidades funcionais descritas anteriormente, e usando uma estrutura
semelhante ao PowerPc 604e, pode-se descrever uma estrutura bsica de 5
estgios do pipeline do Pentium Pro:
1. Estgio de Busca (IF) : buscada uma linha contendo instrues
cache L1 de instrues; tambm calculado o Contador de Programa,
baseado nos inputs do buffer de salto.
2. Estgio de Descodificao (ID) : utilizando os dois descodificadores
para instrues simples e o descodificador para instrues complexas pode
descodificar trs instrues da arquitectura para at seis micro-operaes,
que so depois enviadas para a Tabela de Renomeao de Registos e
preparadas para execuo fora-de-ordem; aps terem-lhe sido
adicionados os bits de estado e algumas flags as instrues so enviadas
para o Buffer de Reordenao para o seu despacho.
3. Estgio de Despacho (DS) : a Estao de Reserva est continuamente a
analisar o Buffer de Reordenao pesquisando as instrues a esto
prontas a serem executadas (isto quando todos os seus operandos
estiverem disponveis) e envia-as para a unidade de execuo
correspondente.
4. Estgio de Execuo (EX) : neste estgio so executadas fora-de-
ordem as micro-operaes para inteiros, pelas unidades de inteiros (de
notar que uma delas tem a possibilidade de detectar previses incorrectas
de salto); micro-operaes de vrgula flutuante, pelas unidades de vrgula
flutuante (possivelmente executadas utilizando vrios estgios, prprios
desta unidade); e as micro-operaes de leitura / escrita, realizadas pela
unidade de interface de memria. Como foi referido, os resultados destas
micro-operaes, so colocados de volta no Buffer de Reordenao,
juntamente com as prprias micro-operaes.
5. Estgio de Trmino (T) : o Buffer de Reordenao pesquisado por
instrues que j terminaram a sua execuo, e aquelas que no so
passveis de causar problemas, so retiradas deste buffer e os seus
resultados so escritos nos registos da arquitectura, ou ento em
memria. Podem se retiradas at trs micro-operaes por ciclo de
relgio.

You might also like