A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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

Apresentações semelhantes


Apresentação em tema: "Otimizações – Parte 1 André José Diniz Barboza Edmo Sérgio Ribeiro Bezerra Prof. André Santos."— Transcrição da apresentação:

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

2 Estrutura da Apresentação Introdução Conjunto de Otimizações Otimizações Locais Oportunidades de Otimização Algoritmo DAG Referências

3 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.

4 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!

5 Introduçã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;

6 Introduçã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; }

7 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.

8 Introdução Um outro exemplo: for ( int i=0; i

9 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.

10 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.

11 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.

12 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.

13 Otimizações Locais IF Bloco básico

14 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

15 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).

16 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

17 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.

18 Oportunidades de Otimização Eliminaçã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;...

19 Oportunidades 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,... 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.

20 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.

21 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++; }

22 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:...

23 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.

24 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;

25 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.

26 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;

27 Oportunidades de Otimização Transformações algébricas Podemos aplicar algumas transformações baseadas em propriedades algébricas, como comutatividade, associatividade, identidade, etc.

28 Oportunidades de Otimização Transformaçõ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 b Mult c Store t1 Load a Add t1 Store x que dispensa a temporária t 1, e as instruções que a manipulam. Load b Mult c Add a Store x

29 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.

30 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.

31 Oportunidades de Otimização Dobramento de constantes exemplo: #define N while (i

32 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.

33 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.

34 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

35 Oportunidades 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.

36 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 Optimization/


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

Apresentações semelhantes


Anúncios Google