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

Slides:



Advertisements
Apresentações semelhantes
gerador de código intermediário
Advertisements

Programação em Java Prof. Maurício Braga
Complexidade de Algoritmos
UNIVERSIDADE FEDERAL DE UBERLÂNDIA ENGENHARIA CIVIL
Estruturas de Repetição
Árvores de Decisão Tabelas de Decisão Aplicações Informáticas
Algoritmos de Ordenação
Estrutura Condicional
Programação de Computadores I Prof. Eduardo 2011
Engenharia de Software
Informática Aplicada.
Funciona, porém está ilegível!
Introdução à Programação
Introdução a Programação
1 MergeSort Seja uma lista A de n elementos. O algoritmo consiste das seguintes fases Dividir A em 2 sub-listas de tamanho n/2 Conquistar: ordenar cada.
Busca Dispersa Scatter Search
Medida do Tempo de Execução de um Programa
Medida do Tempo de Execução de um Programa
Automato de Pilha.
Segmentação de Escrita
Carolina Fonseca Neumar Ribeiro
Contextualização da disciplina DAD-II Prof. Alexandre Parra
Construção de Compiladores
Complexidade de Algoritmos
Lógica de Programação Módulo II
Linguagem C Funções.
Vetores, Matrizes e Funções
DESENVOLVIMENTO DE COMÉRCIO ELETRÔNICO
Algoritmos de Ordenação
Prof.° Jean Daniel Henri Merlin Andreazza Estrutura de Dados
Criptografia Simétrica
Aula prática 6 Vetores e Matrizes
Aula prática 4 Laços Monitoria de Introdução à Programação
Introdução à Programação Estruturas de Repetição
Prof. Natalia Castro Fernandes Mestrado em Telecomunicações – UFF 2º semestre/2012.
Algoritmos e Estruturas de Dados II
VETORES Roteiro da aula Referência ao Programa: Estrutura de Dados
VETORES Roteiro da aula Referência ao Programa: Estrutura de Dados
Universidade Federal de Alagoas – UFAL Centro de Tecnologia – CTEC
Aula 03 – BCC202 Análise de Algoritmos (Parte 1) Túlio Toffolo www
LINGUAGENS DE PROGRAMAÇÃO PROF. DANIELA PIRES
Adpt. por Prof. Guilherme Amorim
Prof. Ricardo Santos PONTEIROS
Expressões e Instrução de Atribuição
Sistema de equações lineares
Introdução à Programação de Computadores
AULA COMPUTACIONAL - Síntese de Sistemas de Separação (Cap. 7) 20 DE OUTUBRO DE 2008.
Estrutura de decisão Neste tipo de estrutura o fluxo de instruções a ser seguido é escolhido em função do resultado da avaliação de uma ou mais condições.
Prof: Leandro Maranim Dei Santi Prof. Eduardo Rossit Paiossin
SISTEMAS OPERACIONAIS I
Algoritmos - Profa. Alciléia1 Profa. Maria Alciléia Alves Rocha Funções em C 2011.
Aula prática 2 Operadores e Expressões Comandos de Decisão Comentários
Lógica para Computação Prof. Celso Antônio Alves Kaestner, Dr. Eng. celsokaestner (at) utfpr (dot) edu (dot) br.
Programação de PIC em C Exposição das funções básicas para
Compiladores.
Comandos de Condição Aula 1 1. Introdução Até agora, todos os algoritmos que fizemos têm um fluxo de execução único. As instruções executadas são sempre.
Lógica e Estrutura de Dados Fundamentais Professor: Eduardo O. Teles
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013
Refinamento Motivação e Objetivos –Tornar especificações mais concretas (mais próximas de uma implementação) que as desenvolvidas inicialmente –Aumentar.
Sistema de controle com compensação em retroação
Sistemas de Equações Lineares (SEL ) – Parte II
Introdução a Programação
Algoritmo É uma descrição seqüencial ordenada dos passos que devem ser executados de forma lógica e clara, com a finalidade de facilitar a resolução de.
Aula 4 Estrutura de Decisão.
Profa. Juliana Mafra ESTRUTURA DE DADOS 30 de Setembro de 2009 Faculdade de Informática e Tecnologia de Pernambuco.
Laço ou loop e repetição
Estrutura de Repetição
Visual C# (parte 2) Prof. Igor Conrado Alves de Lima – Operadores, estruturas de decisão, vetores (arrays), e estruturas de.
ALGORITMOS Profº Antonio Carlos Marcelino de Paula 1.
USP – ICMC – SSC SSC0300 2º Semestre 2015
Transcrição da apresentação:

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. Critérios de avaliação: tamanho, velocidade, eficiencia, memoria....

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

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

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.

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.

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

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

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

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çã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; ...

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.

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

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

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çã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

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

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

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

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/