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

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

Um estudo sobre possíveis técnicas de otimização de código para bytecode Lua Alex de Magalhães Machado Orientador: Prof. Dr. Olinto José Varela Furtado.

Apresentações semelhantes


Apresentação em tema: "Um estudo sobre possíveis técnicas de otimização de código para bytecode Lua Alex de Magalhães Machado Orientador: Prof. Dr. Olinto José Varela Furtado."— Transcrição da apresentação:

1 Um estudo sobre possíveis técnicas de otimização de código para bytecode Lua Alex de Magalhães Machado Orientador: Prof. Dr. Olinto José Varela Furtado Banca Examinadora: Prof. Dr. Ricardo Azambuja Silveira Prof. José Eduardo De Lucca Outubro 2009

2 O que são otimizações de código e por que realizá- las?

3 Alterar sintaticamente o código de um programa, mantendo sua semântica, de forma a melhorar algum aspecto desse programa.

4 O que são otimizações de código e por que realizá- las? O compilador hoje em dia deve ser capaz de realizar pelo menos as principais otimizações de código.

5 O que são otimizações de código e por que realizá- las? Pior caso: 20% mais rápido. Melhor caso: 65% mais rápido. Programa C sem otimização Programa C otimizado Tempo de execução100 ~ 130 ms45 ~ 80 ms Tamanho do código~60 KB~90 KB

6 O que são otimizações de código e por que realizá- las?

7 Como é a linguagem Lua? O que é um bytecode Lua?

8 de Script Imperativa Máquina virtual Multiparadigma Leve Simples Rápida Dinâmica Como é a linguagem Lua? O que é um bytecode Lua?

9

10 Simplicidade Eficiência Portabilidade Programas embarcáveis, com baixo custo Como é a linguagem Lua? O que é um bytecode Lua?

11 Mesma expressão sendo calculada em dois pontos no programa, sendo que o valor das variáveis envolvidas continua o mesmo. Eliminação de subexpressões comuns

12 Mesma expressão sendo calculada em dois pontos no programa, sendo que o valor das variáveis envolvidas continua o mesmo. Eliminação de subexpressões comuns V = 4/3 * PI * r³A = 4 * PI * r² a = 4 * PI; b = a / 3; c = raio * raio; d = c * raio; volume = b * d; e = 4 * PI; f = raio * raio; area = e * f;

13 Mesma expressão sendo calculada em dois pontos no programa, sendo que o valor das variáveis envolvidas continua o mesmo. Eliminação de subexpressões comuns V = 4/3 * PI * r³A = 4 * PI * r² a = 4 * PI; b = a / 3; c = raio * raio; d = c * raio; volume = b * d; e = a; f = c; area = e * f;

14 Valores sendo copiados de uma variável para outra. Cópias costumam ser criadas durante outras otimizações. Propagação de Cópia

15 Valores sendo copiados de uma variável para outra. Cópias costumam ser criadas durante outras otimizações. Propagação de Cópia V = 4/3 * PI * r³A = 4 * PI * r² a = 4 * PI; b = a / 3; c = raio * raio; d = c * raio; volume = b * d; e = a; f = c; area = e * f;

16 Valores sendo copiados de uma variável para outra. Cópias costumam ser criadas durante outras otimizações. Propagação de Cópia V = 4/3 * PI * r³A = 4 * PI * r² a = 4 * PI; b = a / 3; c = raio * raio; d = c * raio; volume = b * d; e = a; f = c; area = a * c;

17 Um código estará morto quando ele não possuir utilidade, e sua remoção não alterar em nada a semântica do programa. Eliminação de código morto

18 Um código estará morto quando ele não possuir utilidade, e sua remoção não alterar em nada a semântica do programa. Eliminação de código morto V = 4/3 * PI * r³A = 4 * PI * r² a = 4 * PI; b = a / 3; c = raio * raio; d = c * raio; volume = b * d; e = a; f = c; area = a * c;

19 Um código estará morto quando ele não possuir utilidade, e sua remoção não alterar em nada a semântica do programa. Eliminação de código morto V = 4/3 * PI * r³A = 4 * PI * r² a = 4 * PI; b = a / 3; c = raio * raio; d = c * raio; volume = b * d; area = a * c;

20 Cálculo de uma expressão é constante. Desdobramento de constante

21 Cálculo de uma expressão é constante. Desdobramento de constante V = 4/3 * PI * r³A = 4 * PI * r² a = 4 * PI; b = a / 3; c = raio * raio; d = c * raio; volume = b * d; area = a * c;

22 Cálculo de uma expressão é constante. Desdobramento de constante V = 4/3 * PI * r³A = 4 * PI * r² a = ; b = ; c = raio * raio; d = c * raio; volume = b * d; area = a * c;

23 Tirar de laços internos instruções invariantes do laço. Movimentação de código Variáveis de indução e redução de força Otimizar o cálculo de variáveis de indução, realizando redução de força, entre outras técnicas.

24 Prós: Muitas oportunidades de implementação Máquina virtual baseada em registradores Apenas 38 instruções

25 Contras: Cada nova versão da linguagem a máquina virtual pode sofrer alterações Nova versão é lançada a cada 3 anos, e a última versão foi lançada há 3 anos

26 Atual situação da linguagem: Otimizações já realizadas: Desdobramento de constante Eliminação de código morto

27 Características do otimizador: Linguagem de desenvolvimento C Aprox linhas de código 25 ~ 35 ms no mínimo 80 ~ 100 ms para otimizar 200 linhas de código 190 ~ 220 ms para otimizar 1000 linhas de código Otimizações já implementadas: Eliminação de subexpressões comuns Propagação de cópia Eliminação de código morto

28 Otimizando código pré-compilado:

29 Otimizador de código não prejudica desempenho do programa, pois as otimizações são realizadas off-line.

30 Análise de Fluxo de Dados Percorrer o programa fonte e coletar informações a respeito do seu funcionamento Código dividido em blocos básicos e observado if (exp){ //Bloco básico x }else{ //Bloco básico y } //Bloco básico z

31 Análise de Fluxo de Dados Cada bloco básico tem um conjunto IN e um conjunto OUT, os quais guardarão as informações coletadas em cada análise de fluxo de dados.

32 Definições de Alcance Definição: Qualquer atribuição de uma variável Análise determina quais definições alcançam cada ponto no programa

33 Definições de Alcance Definição: Qualquer atribuição de uma variável Análise determina quais definições alcançam cada ponto no programa

34 Expressões Disponíveis Uma expressão e está disponível num ponto p qualquer se ela for calculada em todos os pontos predecessores e ainda estiver viva. if (exp){ j = a + b; }else{ k = a + b; } //Expressão a + b está disponível aqui.

35 Expressões Disponíveis Uma expressão e está disponível num ponto p qualquer se ela for calculada em todos os pontos predecessores e ainda estiver viva. if (exp){ j = a + b; }else{ k = a + c; } //Nem a + b e nem a + c estão disponíveis aqui.

36 Expressões Disponíveis Uma expressão e está disponível num ponto p qualquer se ela for calculada em todos os pontos predecessores e ainda estiver viva.

37 Quais otimizações implementar? Desdobramento de constante e eliminação de código morto já são realizados na linguagem Eliminação de subexpressões comuns e propagação de cópia são úteis em conjunto Ambas geram código morto

38 Otimizações implementadas Eliminação de subexpressões comuns Propagação de cópia Eliminação de código morto gerado acima

39 Eliminação de Subexpressão Comum Verifica se alguma expressão está no conjunto IN e no conjunto e_gen de algum bloco básico

40 Eliminação de Subexpressão Comum

41

42 Propagação de Cópia Eliminação de subexpressão comum gera instruções de cópia que podem ser propagadas Percorre-se o código procurando instruções de cópia

43 Propagação de Cópia Para cada cópia encontrada, tenta-se propagá-la o mais longe possível no grafo de fluxo Se foi possível propagá-la até o fim do grafo, então a cópia teoricamente pode ser removida

44 Eliminação de código morto (cópias inúteis) Eliminação de subexpressão comum gera instruções de cópia que geralmente podem ser removidas Porém, algumas instruções de cópia não podem ser removidas.

45 Eliminação de código morto (cópias inúteis) Instruções como a instrução CALL utilizam cópias para organizar os parâmetros de função, por exemplo. No total, 6 instruções da LVM precisam que certos valores estejam em registradores específicos

46 Eliminação de código morto (cópias inúteis) Após propagar cada cópia, verificou-se se ela é relevante para alguma instrução Se não era relevante para nenhuma instrução, a cópia era removida.

47 local a, b, c, d, e, f, g, i, n, start, stop, h, j, l; h = 0; j = 0 while h < 10 do start = os.clock() n = i = 0 a = 4 b = 3 c = math.pi d = a / b e = d * c while i < n do d = a / b e = d * c f = i * i f = f * i g = e * f i = i + 1 end stop = os.clock() j = j + stop - start h = h + 1 end j = j/10 print("Benchmark: ",j,"segundos.\n")

48 loadk 11 0 ; 0 loadk 12 0 ; 0 lt ; 10, to [5] if true jmp 29 ; to [34] getglobal 14 2 ; os gettable ; "clock call move 9 14 loadk 8 4 ; loadk 7 0 ; 0 loadk 0 5 ; 4 loadk 1 6 ; 3 getglobal 14 7 ; math gettable ; "pi div mul lt ; to [19] if true jmp 7 ; to [26] div mul mul mul mul add ; 1 jmp -9 ; to [17] getglobal 14 2 ; os gettable ; "clock call move add sub add ; 1 jmp -31 ; to [3] div ; 10 getglobal ; print loadk ; move loadk ; call return 0 1

49 Código antes e depois de: Eliminação de Subexpressão Comum Propagação de cópia e eliminação de código morto div mul move 3 3 move 4 4 ; instruções ; removidas move 3 3 move 4 4

50 loadk 11 0 ; 0 loadk 12 0 ; 0 lt ; 10, to [5] if true jmp 29 ; to [34] getglobal 14 2 ; os gettable ; "clock call move 9 14 loadk 8 4 ; loadk 7 0 ; 0 loadk 0 5 ; 4 loadk 1 6 ; 3 getglobal 14 7 ; math gettable ; "pi div mul lt ; to [19] if true jmp 7 ; to [26] mul mul mul add ; 1 jmp -9 ; to [17] getglobal 14 2 ; os gettable ; "clock call move add sub add ; 1 jmp -31 ; to [3] div ; 10 getglobal ; print loadk ; move loadk ; call return 0 1

51 Ganho de performance: Aprox. 33% mais rápido do que sem otimização Antes de otimizar Após otimizar Em C Tempo de execução s0.86 s0.35 s

52 Lua é uma linguagem rápida e leve, porém dá espaço para várias otimizações de código Com as implementações realizadas e com os testes feitos, verificou-se que é possível ainda ir mais além e melhorar muito a performance de programas em Lua

53 Implementar novas otimizações de código Aprimorar as já existentes, deixando-as mais poderosas Acoplar o otimizador de código ao compilador de Lua

54 Um estudo sobre possíveis técnicas de otimização de código para bytecode Lua Alex de Magalhães Machado Orientador: Prof. Dr. Olinto José Varela Furtado Banca Examinadora: Prof. Dr. Ricardo Azambuja Silveira Prof. José Eduardo De Lucca Outubro 2009


Carregar ppt "Um estudo sobre possíveis técnicas de otimização de código para bytecode Lua Alex de Magalhães Machado Orientador: Prof. Dr. Olinto José Varela Furtado."

Apresentações semelhantes


Anúncios Google