Title: Otimiza
1Otimizações Parte 1
- André José Diniz Barboza
- Edmo Sérgio Ribeiro Bezerra
- Prof. André Santos
2Estrutura da Apresentação
- Introdução
- Conjunto de Otimizações
- Otimizações Locais
- Oportunidades de Otimização
- Algoritmo DAG
- Referências
3Introduçã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.
4Introduçã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!
5Introdução
- Mas, 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
6Introdução
- Condição 3 comando inútil porque comandos
posteriores não usaram valor de x. - int funcao (int z)
- int x
- ....
- x a b
-
7Introduçã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.
8Introdução
- Um outro exemplo
- for ( int i0 iltN i)
- a j5
- f(ai)
-
- Se n 100, o comando a j5 poderia ser retirado
do laço e 100 somas deixariam de ser executadas. - Porém, se n0, o programa foi pessimizado,
porque o comando aj5 que não seria executado,
passa a ser executado uma vez.
9Conjunto 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.
10Conjunto 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.
11Conjunto 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.
12Otimizaçõ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.
13Otimizações Locais
1
2
Bloco básico
3
IF
5
7
6
8
14Otimizaçõ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
15Otimizaçõ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).
16Oportunidades 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
17Oportunidades 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.
18Oportunidades de Otimização
- Eliminação de sub-expressões comuns
- ... xab
- ... yab ...
- Se os valores de a e de b não são alterados, é
possível guardar o valor da expressão ab em uma
variável temporária. - ... t1ab
- xt1
- ... yt1 ...
19Oportunidades de Otimização
- ou, se a variável x ainda está disponível com o
mesmo valor da segunda vez que a expressão é
calculada, - ... xab
- ... yx ...
- 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.
20Oportunidades 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.
21Oportunidades 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
22Oportunidades 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
- i3
- ...
- x ...
23Oportunidades 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.
24Oportunidades de Otimização
Renomeação de variáveis temporárias
- Código-fonte
- xab
- xt1
- y(ab)c
- zd(ab)
Código Intermediário(1) t1ab xt1 t2a
b t3t2c yt3 t4ab t5dt4 zt5
Código Intermediário(2) t1ab xt1 t2t1
t3t2c yt3 t4t1 t5dt4 zt5
Código Intermediário(3) xab yxc z
dx
25Oportunidades 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.
26Oportunidades de Otimização
Renomeação de variáveis temporárias
- Código-fonte
- x(ab)(cd)
- y(ef)(gh)
Código Intermediário t1ab t2cd t3t1
t2 xt3 t4ef t5gh t6t4t5 yt5
Código Intermediário t1ab t2cd xt1t
2 t1ef t2gh yt1t2
27Oportunidades de Otimização
- Transformações algébricas
- Podemos aplicar algumas transformações baseadas
em propriedades algébricas, como comutatividade,
associatividade, identidade, etc.
28Oportunidades de Otimização
- Transformações algébricas
- exemplo, como a soma é comutativa, podemos
transformar xabc em xbca o que
corresponde a trocar código como - Load b
- Mult c
- Store t1
- Load a
- Add t1
- Store x
- que dispensa a temporária t1, e as instruções
que a manipulam.
Load b Mult c Add a Store x
29Oportunidades 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.
30Oportunidades 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.
31Oportunidades de Otimização
- Dobramento de constantes
- exemplo
- define N 100
- ...
- while (iltN-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.
32Oportunidades 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.
33Oportunidades 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.
34Oportunidades 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.0ln x
xx
35Oportunidades de Otimização
- Otimizaçã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.
36Referê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/CompilerOpt
imization/