Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André...
Transcript of Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André...
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
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.
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!
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;
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;
}
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.
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.
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.
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.
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.
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.
Otimizações Locais
1
2
3
IF
5 7
6 8
Bloco básico
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
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).
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
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.
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; ...
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.
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.
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++; }
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: ...
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.
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;
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.
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;
Oportunidades de Otimização
Transformações algébricas
Podemos aplicar algumas transformações baseadas em propriedades algébricas, como comutatividade, associatividade, identidade, etc.
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
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.
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.
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.
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.
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.
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
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.
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/