Você está na página 1de 24

Universidade Federal de Lavras

Departamento de Ciência da Computação

Arquitetura de Computadores II
Prof. Luiz Henrique Andrade Correia
Baseado nas transparências do Prof. David Patterson
Sumário


ILP

Técnicas do compilador para aumentar o ILP

Desdobramento de loop

Preditor estático de desvios

Preditor dinâmico de desvios

Escalonamento dinâmico para evitar risco
(hazard) de dados

Conclusão
Instruction Level Parallelism (ILP)

Instruction-Level Parallelism (ILP): sobreposição


na execução de instruções para melhora do
desempenho.
• Duas abordagens para a exploração do ILP:
1) Descoberta e exploração das opções de
paralelização via hardware (abordagem dinâmica)
(e.g., Pentium 4, AMD Opteron, IBM Power); e
2) Procura de oportunidades de paralelismo via
tecnologia de software (abordagem estática em
tempo de compilação) (e.g., Itanium 2).
Instruction Level Parallelism (ILP)

Um bloco básico (BB) ILP é bem pequeno.

– BB: uma sequência de código em que não há


desvios no interior do bloco com exceção da primeira
entrada do bloco ou do fim do bloco.

– Podem existir muitas dependências entre as


instruções dentro de um BB.
Instruction Level Parallelism (ILP)

Para obtenção de melhorias no desempenho, o


ILP deve ser explorado sobre múltiplos blocos.

Caso mais simples: loop-level parallelism para


exploração do paralelismo entre as iterações de
um loop. Exemplo:

for (i=1; i<=1000; i++)


x[i] = x[i] + y[i];
Loop-Level Parallelism

Exploração do paralelismo no nível de loops através do


desdobramento do loop via:

1. Preditor de desvios dinâmicos; ou

2. Desdobramento estático realizado pelo compilador.

A determinação de dependências de instruções é


importante para a exploração do Loop Level Parallelism.
Dependência de dados e
riscos (hazards)

Se 2 instruções são:

• paralelas, então elas podem ser executadas


simultaneamente em um pipeline de profundidade
arbitrária sem causar nenhum stall (assumindo que não
ocorrem riscos estruturais).

• dependentes, então elas não podem ser paralelizadas


e devem ser executadas em ordem, apesar de que
frequentemente elas possam ser parcialmente
sobrepostas.
Dependência de dados e
hazards

• A dependência de dados --> Read After Write (RAW)


I: add r1,r2,r3
J: sub r4,r1,r3
• a instrução J é dependente de uma instrução K que por
sua vez depende da instrução I.
• Duas instruções não podem ser executadas simulta-
neamente ou serem completamente sobrepostas
• Dependência de dados na sequência de instruções
 dependência de dados no código-fonte => efeito da
dependência original deve ser preservado.
ILP e dependências de
dados, hazards

HW/SW deve preservar a ordem do programa:
– Dependências são uma propriedade dos programas

Presença de dependência indica potencial para
um hazard, mas um hazard real e o tamanho de
qualquer stall é propriedade do pipeline

Dependências de dados conduzem a:
1) possibilidade de um hazard.
2) ordem em que os resultados devem ser calculados.
3) limite de quanto o paralelismo pode ser explorado
Dependências de nomes
• Dependência de nomes:
quando 2 instruções usam o mesmo registrador ou
posição de memória, chamado por um nome, mas não há
nenhum fluxo de dados entre as instruções associadas
com o nome;

• Existem 2 versões de dependências de nomes:


• Anti-dependência => WAR e
• dependência de saída => WAW
Dependências de nomes #1:
Anti-dependências
Instrução J escreve o operando antes que a
instrução I leia o operando:
I: sub r4,r1,r3
J: add r1,r2,r3
K: mul r6,r1,r7

Chamado de “anti-dependência” por


desenvolvedores de compiladores devido ao
reuso do nome “r1”.
Se a anti-dependência causar um hazard no
pipeline, é chamado risco Write After Read
(WAR).
Dependência de nomes #2:
Dependência de saída
I: sub r1,r4,r3
J: add r1,r2,r3
K: mul r6,r1,r7

Conhecido como “dependência de saída” pelos
desenvolvedores de compiladores pelo reuso do nome r1

Caso a anti-dependência cause um risco no pipeline, a
dependência é conhecida Write After Write (WAW)

Instruções com dependência de nomes são executadas
simultaneamente se o nome usado nas instruções seja
mudado para que não haja conflitos
Register renaming resolve a dependência de nomes
para os registradores
Pode ser realizado pelo compilador ou pelo HW.
Dependências de Controle


Toda instrução é dependente de controle caso seja
associada à um conjunto de desvios. Em geral, esta
dependência de controle deve ser preservada para
preservar a ordem do programa.

if p1 {
S1;
};
if p2 {
S2;
}
• S1 é dependente de controle de p1, e S2 é dependente de
controle de p2, mas não de p1.
Dependências de controle
ignoradas

• Dependências de controle não precisam ser


preservadas quando a execução de uma
instrução que não deveria ser executada não
atrapalha o resultado final do programa

• 2 propriedades são críticas para a execução


correta de um programa:
 Comportamento com exceções; e
 Fluxo de dados.
Exceções no MIPS


Eventos inesperados podem mudar o fluxo
normal de execução das instruções

Dois tipos de eventos:
– Exceção – é um evento inesperado que vem de
dentro do processador
– Interrupção – causa uma mudança inesperada
no fluxo de controle das instruções, mas tem
origem fora do microprocessador
Exceções no MIPS


Para suportar exceções é necessário conhecer
a causa ou situação em que ocorre
Dependências de controle
ignoradas

Exemplo de Exceções no MIPS:
– IF: page fault, desalinhamento de memória,
violação de memória
– ID: instrução não implementada
– EX: overflow de Inteiro ou anomalia de FP
– MEM: idem IF
– WR: nenhuma

Exceções => vetor de status

Vetor de status => desliga sinais de escrita
(registradores e memórias)
Exceções no MIPS


Na ocorrência de uma exceção a ação que a
máquina deve tomar é o salvamento dos
endereços da instrução envolvida

O registrador EPC é responsável pelo
armazenamento dos endereços

EPC é usado para transferir o controle para o
sistema operacional, em algum endereço
especificado.

SO trata a exceção por meio do registrador de

causa que possui um campo para indicar o
motivo da exceção
Exceções no MIPS
Comportamento com
exceções


Preservando o comportamento com exceções:

 qualquer mudança com a ordem de


execução de instruções não deve alterar o
resultado conforme as exceções acontecem
em um programa.

 ignorar exceções quando ocorre salto.


Comportamento com
exceções

Exemplo: Seja o ISA do MIPS-64 para o código
abaixo:
DADDU R2,R3,R4
BEQZ R2,L1
LW R1,0(R2)
L1:


(Assumindo que não ocorrem desvios atrasados)
Há algum problema em mover o LW para antes do
BEQZ?
Sim! A instrução LW pode causar uma exceção de
proteção a memória.
Fluxo de dados

• Fluxo de dados: fluxo real de valores de dados


entre instruções que produzem resultados e
aqueles que os consomem


Desvios produzem fluxo dinâmico, determinando qual
instrução é a fornecedora de dados.
Fluxo de dados

Exemplo:

DADDU R1,R2,R3
BEQZ R4,L
DSUBU R1,R5,R6
L: …
OR R7,R1,R8

• OR depende de DADDU ou de DSUBU?


De ambos!

O fluxo de dados deve ser preservado na


execução.
Fluxo de dados

Exemplo:

DADDU R1,R2,R3
BEQZ R12, skip
DSUBU R4,R5,R6
DADDU R5,R4,R9
skip:
OR R7,R8,R9

Assumindo que R4 não é usado depois do skip, é


possível mover DSUBU para antes do desvio?
SIM!

Você também pode gostar