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

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

Otimizações – Parte 1 André José Diniz Barboza

Apresentações semelhantes


Apresentação em tema: "Otimizações – Parte 1 André José Diniz Barboza"— 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. Critérios de avaliação: tamanho, velocidade, eficiencia, memoria....

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 for ( int i=0; i<N; i++) {
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. Retirada de elementos que estejam internos em um loop.

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. Tópico 1 – Curso introdutório não precisa de otimização, porque programas seriam executados 1 vez, deveriam apenas mostrar boas msg de erro

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 1 2 Bloco básico 3 IF 5 7 6 8

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). - Não se justifica escrver um programa mal escrito porque ele vai ser otimizado;

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
Renomeação de variáveis temporárias Código-fonte x=a+b; x=t1; y=(a+b)*c; z=d+(a+b); 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
Renomeação de variáveis temporárias Código-fonte x=(a+b)*(c+d); y=(e*f)+(g*h); Código Intermediário t1=a+b; t2=c+d; x=t1*t2; t1=e*f; t2=g*h; y=t1+t2; 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; - poderíamos renomear t4 como t1, t5 como t2 e eliminar t3 e t6!

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 t1, 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. Normalmente, quando a ordem de precedência é indicada explicitamente com o uso de parênteses, a ordem de avaliação dada não deve ser alterada. Este seria o caso de

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

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


Carregar ppt "Otimizações – Parte 1 André José Diniz Barboza"

Apresentações semelhantes


Anúncios Google