36
Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Embed Size (px)

Citation preview

Page 1: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Otimizações – Parte 1

André José Diniz Barboza

Edmo Sérgio Ribeiro Bezerra

Prof. André Santos

Page 2: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Estrutura da Apresentação

• Introdução

• Conjunto de Otimizações

• Otimizações Locais

• Oportunidades de Otimização

• Algoritmo DAG

• Referências

Page 3: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Introdução

• Um “Otimizador” é um programa que recebe como entrada outro programa P e gera um programa P’ equivalente que é melhor segundo um critério de avaliação.

• Geralmente, é fácil fazer uma otimização em um programa, difícil é obter informação necessária para aplicar a otimização sem alterar o funcionamento do programa original.

Page 4: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Introdução• Ex. Considere o trecho de programa, e as

opções para sua melhora sem alterar seu funcionamento:

x = a + b

Este programa pode ser melhorado (ficar mais rápido e menor) se o comando for retirado!

Page 5: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

IntroduçãoMas, o comando só pode ser removido se alguma das seguintes condições forem satisfeitas:

Condição 1: o comando nunca é executado.

if (0) { x = a + b}

Condição 2: o comando é inútil

x = a + b;

x = a + b;

Page 6: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

IntroduçãoCondição 3: comando inútil porque comandos posteriores não usaram valor de ‘x’.

int funcao (int z) {int x;

....x = a + b;

}

Page 7: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Introdução• O exemplo mostra que não é pratico otimizar um

programa eliminando apenas seus comandos.• As condições de cada eliminação dependem do

comando, da posição e, de certa maneira, dos comandos restantes do programa.

• Portanto, para se construir um otimizador de utilidade prática deve-se identificar oportunidades que sejam produtivas em situações coerentes.

Page 8: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Introdução• Um outro exemplo:

for ( int i=0; i<N; i++) {a = j+5;f(a*i);

}

- Se n = 100, o comando a =j+5 poderia ser retirado do laço e 100 somas deixariam de ser executadas.

- Porém, se n=0, o programa foi “pessimizado”, porque o comando a=j+5 que não seria executado, passa a ser executado uma vez.

Page 9: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Conjunto de otimizações• Depende muito da finalidade do compilador o

conjunto de otimizações que ele deve oferecer• Deve ser considerada a quantidade de informação

que deve ser manipulada. Pode-se observar:- Otimizações Locais - Otimizações Intermediárias- Otimizações Globais

• A maioria dos compiladores oferece otimizações do primeiro tipo combinadas com a fase de geração de código.

Page 10: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Conjunto de Otimizações• Otimizações Locais:

trechos pequenos de programas, por exemplo, trechos sem desvios, basic blocks.

• Otimizações intermediárias:otimizações consideradas apenas dentro de módulos, funções, ou classes.

• Otimizações globais:consideram inter-relações entre todas as partes do programa.

Page 11: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Conjunto de Otimizações• A maneira de tratar otimizações pode ser

extremamente pragmática.Ex.: em um programa grande, 90% de sua execução está concentrada em 10% do código.

• Estes 10% de código correspondem, geralmente, ao loop mais interno do programa.

• Uso de ferramenta – “profilers” – permite identificar trechos mais executados e concentrar a otimização neles.

• Por esta razão, muito do trabalho no desenvolvimento de técnicas de otimização é voltado para otimizações locais.

Page 12: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Otimizações Locais• Então, o que seria um bloco básico?• Primeiro comando inicia um bloco básico• Qualquer comando com label, ou que de

alguma forma seja alvo de um comando de desvio inicia um novo bloco básico

• Qualquer comando de desvio termina um bloco básico

• Ou seja, blocos básicos são trechos de programas cujas instruções são executadas sempre sequencialmente.

Page 13: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Otimizações Locais

1

2

3

IF

5 7

6 8

Bloco básico

Page 14: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Otimizações Locais• Várias técnicas de otimização se aplicam para

blocos básicos, podendo ser realizada em três ocasiões:

1. Na representação intermediária

2. Durante o processo de geração de código

3. Após a geração de código diretamente no objeto

Page 15: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Otimizações Locais• Otimização não faz milagres!!!

• Em particular, a otimização não altera a complexidade dos algoritmos, ela altera apenas as constantes multiplicativas.

• Se existe para um problemas um algoritmo θ(nlogn), não espere que em um programa no qual foi usado um algoritmo θ(n2) se transforme durante sua otimização no algoritmo θ(nlogn).

Page 16: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Oportunidades de Otimização

• Eliminação de sub-expressões comuns• Eliminação de código morto• Renomeação de variáveis temporárias• Transformações algébricas• Dobramento de constantes• Redução de força• Otimização de loops

Page 17: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Oportunidades de Otimização

Eliminação de sub-expressões comuns• Ocorre quando a mesma expressão (possivelmente

uma sub-expressão de outra expressão maior) aparece mais de uma vez em um trecho de programa.

• Se as variáveis que ocorrem na expressão não tem seus valores alterados entre as duas ocorrências, é possível calcular seu valor apenas uma vez.

Page 18: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Oportunidades de OtimizaçãoEliminação de sub-expressões comuns

... x=a+b;

... y=a+b; ...

Se os valores de a e de b não são alterados, é possível guardar o valor da expressão a+b em uma variável temporária.

... t1=a+b;

x=t1;

... y=t1; ...

Page 19: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Oportunidades de Otimizaçãoou, se a variável x ainda está disponível com o mesmo valor da segunda vez que a expressão é calculada,

... x=a+b;

... y=x; ...dispensando o uso da variável temporária t1.Obs. : Note que, para garantir que os valores de a, b não se alteram, é preciso examinar todos os comandos que podem ocorrer entre as duas avaliações da expressão.

Page 20: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Oportunidades de Otimização

Eliminação de código morto

Ocorre quando um programa contém código que não pode ser alcançado durante a sua execução, logo este trecho inatingível pode ser eliminado.

Page 21: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Oportunidades de Otimização

Eliminação de código morto

• Ocorre após uma instrução de encerramento de um programa ou de uma função.

int f(int x) {

return x++; }

• Ocorre após um teste com uma condição impossível de ser satisfeita.

if (0) { x++; }

Page 22: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Oportunidades de Otimização

Eliminação de código morto

• Ocorre após um comando de desvio que e não é alvo de nenhum outro desvio.

goto x;

i=3;

...

x: ...

Page 23: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Oportunidades de Otimização

Renomeação de variáveis temporárias

• Ocorre quando as variáveis temporárias introduzidas durante a geração de código intermediário não são estritamente necessárias.

• Normalmente, este controle é feito dando outros nomes para as variáveis que vão guardar os valores temporários.

Page 24: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Oportunidades de Otimização

Código-fonte

x=a+b;

x=t1;

y=(a+b)*c;

z=d+(a+b);

Renomeação de variáveis temporárias Código Intermediário(1)

t1=a+b;

x=t1;

t2=a+b;

t3=t2*c;

y=t3;

t4=a+b;

t5=d+t4;

z=t5;

Código Intermediário(2)

t1=a+b;

x=t1;

t2=t1;

t3=t2*c;

y=t3;

t4=t1;

t5=d+t4;

z=t5;

Código Intermediário(3)

x=a+b;

y=x*c;

z=d+x;

Page 25: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Oportunidades de Otimização

Renomeação de variáveis temporárias

Pode acontecer que uma variável temporária possa ser re-usada após uma ocorrência anterior. Isto é feito mudando os nomes de algumas ocorrências dessas variáveis.

Page 26: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Oportunidades de Otimização

Código-fonte

x=(a+b)*(c+d);

y=(e*f)+(g*h);

Renomeação de variáveis temporárias Código Intermediário

t1=a+b;

t2=c+d;

t3=t1*t2;

x=t3;

t4=e*f;

t5=g*h;

t6=t4+t5;

y=t5;

Código Intermediário

t1=a+b;

t2=c+d;

x=t1*t2;

t1=e*f;

t2=g*h;

y=t1+t2;

Page 27: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Oportunidades de Otimização

Transformações algébricas

Podemos aplicar algumas transformações baseadas em propriedades algébricas, como comutatividade, associatividade, identidade, etc.

Page 28: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Oportunidades de OtimizaçãoTransformações algébricas

• exemplo, como a soma é comutativa, podemos transformar x=a+b*c; em x=b*c+a; o que corresponde a trocar código como:

Load bMult cStore t1Load aAdd t1Store x

que dispensa a temporária t1, e as instruções que a manipulam.

Load b

Mult c

Add a

Store x

Page 29: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Oportunidades de Otimização

Transformações algébricas

Só devem ser utilizadas com autorização explícita do usuário uma vez que algumas destas transformações podem criar problemas para a convergência ou a estabilidade em relação a erros de arredondamento dos programas.

Page 30: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Oportunidades de Otimização

Dobramento de constantes

Expressões ou sub-expressões compostas de valores constantes podem ser avaliadas em tempo de compilação (dobradas), evitando sua avaliação repetida em tempo de execução.

Page 31: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Oportunidades de OtimizaçãoDobramento de constantes

• exemplo:#define N 100

...while (i<N-1) { ... }

não há necessidade de se fazer repetidamente o cálculo para o valor de N-1. Este valor pode ser pré-calculado,e substituído por 99.

Page 32: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Oportunidades de Otimização

Dobramento de constantes

• Podem existir problemas de portabilidade.• Máquina alvo é diferente da máquina de

compilação.• Neste caso, avaliação é realizada uma única vez

logo no início da execução do programa.

Page 33: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Oportunidades de Otimização

Redução de Força

Há vários casos em que operações mais caras podem ser substituídas por operações mais baratas.

Page 34: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Oportunidades de Otimização

Redução de Força

• Cálculo de comprimento da concatenação de duas cadeias.strlen(strcat(s1, s2)) strlen(s1) + strlen(s2)

• Cálculo do quadrado de um número.pow(x, 2) e 2.0*ln x

x*x

Page 35: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Oportunidades de OtimizaçãoOtimização de loop

Há várias otimizações que se aplicam a loops. a mais comum é a transferência de invariantes do loop para fora dele. Pórem é necessário verificar:

• Se a expressão é composta apenas de constantes, ou de variáveis cujos valores não são alterados dentro do loop.

• Nenhum uso da expressão, dentro ou fora do loop deve ter acesso a um valor de x diferente do valor a que tinha acesso antes do original.

Page 36: Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos

Referências• Alfred V. Aho, Ravi Sethi, Jeffrey D. Ulmann,

Compilers: Principles, Techniques and Tools, • Steven S. Muchnick, Advanced Compiler Design

& Implementation• J. L. Rangel, Otimização de Código• Compiler Switches Optimization

http://www.astro.uu.se/~bf/cobold/node9.html• http://citeseer.nj.nec.com/Programming/

CompilerOptimization/