Um estudo sobre possíveis técnicas de otimização de código para bytecode Lua Alex de Magalhães...

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

Transcript of Um estudo sobre possíveis técnicas de otimização de código para bytecode Lua Alex de Magalhães...

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

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

Page 2: 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.

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

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

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

Alterar sintaticamente o código de um programa, mantendo sua semântica, de forma a melhorar

algum aspecto desse programa.

Page 4: 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.

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.

Page 5: 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.

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ção 100 ~ 130 ms 45 ~ 80 ms

Tamanho do código ~60 KB ~90 KB

Page 6: 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.

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

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

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

Page 8: 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.

•de Script•Imperativa•Máquina virtual•Multiparadigma

•Leve•Simples•Rápida•Dinâmica

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

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

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

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

•Simplicidade•Eficiência•Portabilidade•Programas embarcáveis, com baixo custo

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

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

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

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

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;

Page 13: 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.

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;

Page 14: 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.

Valores sendo copiados de uma variável para outra. Cópias costumam ser criadas durante

outras otimizações.

Propagação de Cópia

Page 15: 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.

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;

Page 16: 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.

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;

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

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

Page 18: 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.

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;

Page 19: 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.

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;

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

Cálculo de uma expressão é constante.

Desdobramento de constante

Page 21: 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.

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;

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

Cálculo de uma expressão é constante.

Desdobramento de constante

V = 4/3 * PI * r³ A = 4 * PI * r²

a = 12.5663706;b = 4.1887902;c = raio * raio;d = c * raio;volume = b * d;

area = a * c;

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

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.

Page 24: 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.

Prós:

Muitas oportunidades de implementaçãoMáquina virtual baseada em registradoresApenas 38 instruções

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

Contras:

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

Page 26: 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.

Atual situação da linguagem:

Otimizações já realizadas:◦Desdobramento de constante◦Eliminação de código morto

Page 27: 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.

Características do otimizador:

Linguagem de desenvolvimento CAprox. 3500 linhas de código25 ~ 35 ms no mínimo80 ~ 100 ms para otimizar 200 linhas de código190 ~ 220 ms para otimizar 1000 linhas de códigoOtimizações já implementadas:

◦Eliminação de subexpressões comuns◦Propagação de cópia◦Eliminação de código morto

Page 28: 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.

Otimizando código pré-compilado:

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

Otimizando código pré-compilado:

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

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

Análise de Fluxo de Dados

Percorrer o programa fonte e coletar informações a respeito do seu funcionamentoCódigo dividido em blocos básicos e observado

if (exp){//Bloco básico x

}else{//Bloco básico y

}//Bloco básico z

Page 31: 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.

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.

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

Definições de Alcance

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

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

Definições de Alcance

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

Page 34: 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.

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.

Page 35: 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.

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.

Page 36: 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.

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.

Page 37: 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.

Quais otimizações implementar?

Desdobramento de constante e eliminação de código morto já são realizados na linguagemEliminação de subexpressões comuns e propagação de cópia são úteis em conjuntoAmbas geram código morto

Page 38: 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.

Otimizações implementadas

Eliminação de subexpressões comunsPropagação de cópiaEliminação de código morto gerado acima

Page 39: 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.

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

Page 40: 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.

Eliminação de Subexpressão Comum

Page 41: 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.

Eliminação de Subexpressão Comum

Page 42: 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.

Propagação de Cópia

Eliminação de subexpressão comum gera instruções de cópia que podem ser propagadasPercorre-se o código procurando instruções de cópia

Page 43: 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.

Propagação de Cópia

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

Page 44: 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.

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 removidasPorém, algumas instruções de cópia não podem ser removidas.

Page 45: 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.

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

Page 46: 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.

Eliminação de código morto (cópias inúteis)

Após propagar cada cópia, verificou-se se ela é relevante para alguma instruçãoSe não era relevante para nenhuma instrução, a cópia era removida.

Page 47: 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.

local a, b, c, d, e, f, g, i, n, start, stop, h, j, l;h = 0; j = 0while h < 10 do

start = os.clock()n = 10000000i = 0a = 4b = 3c = math.pid = a / be = d * cwhile i < n do

d = a / be = d * cf = i * if = f * ig = e * fi = i + 1

end stop = os.clock()j = j + stop - starth = h + 1

endj = j/10print("Benchmark: ",j,"segundos.\n")

Page 48: 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.

loadk 11 0 ; 0loadk 12 0 ; 0lt 0 11 257 ; 10, to [5] if truejmp 29 ; to [34]getglobal 14 2 ; osgettable 14 14 259 ; "clock“call 14 1 2 move 9 14 loadk 8 4 ; 10000000loadk 7 0 ; 0loadk 0 5 ; 4loadk 1 6 ; 3getglobal 14 7 ; mathgettable 2 14 264 ; "pi“div 3 0 1 mul 4 3 2 lt 0 7 8 ; to [19] if truejmp 7 ; to [26]div 3 0 1 mul 4 3 2 mul 5 7 7 mul 5 5 7 mul 6 4 5 add 7 7 265 ; 1

jmp -9 ; to [17]

getglobal 14 2 ; os

gettable 14 14 259 ; "clock“

call 14 1 2

move 10 14

add 14 12 10

sub 12 14 9

add 11 11 265 ; 1

jmp -31 ; to [3]

div 12 12 257 ; 10

getglobal 14 10 ; print

loadk 15 11 ;

move 16 12

loadk 17 12 ;

call 14 4 1

return 0 1

Page 49: 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.

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 3 0 1 mul 4 3 2

move 3 3 move 4 4

; instruções; removidas

move 3 3 move 4 4

Page 50: 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.

loadk 11 0 ; 0loadk 12 0 ; 0lt 0 11 257 ; 10, to [5] if truejmp 29 ; to [34]getglobal 14 2 ; osgettable 14 14 259 ; "clock“call 14 1 2 move 9 14 loadk 8 4 ; 10000000loadk 7 0 ; 0loadk 0 5 ; 4loadk 1 6 ; 3getglobal 14 7 ; mathgettable 2 14 264 ; "pi“div 3 0 1 mul 4 3 2 lt 0 7 8 ; to [19] if truejmp 7 ; to [26]mul 5 7 7 mul 5 5 7 mul 6 4 5 add 7 7 265 ; 1

jmp -9 ; to [17]

getglobal 14 2 ; os

gettable 14 14 259 ; "clock“

call 14 1 2

move 10 14

add 14 12 10

sub 12 14 9

add 11 11 265 ; 1

jmp -31 ; to [3]

div 12 12 257 ; 10

getglobal 14 10 ; print

loadk 15 11 ;

move 16 12

loadk 17 12 ;

call 14 4 1

return 0 1

Page 51: 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.

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

1.283 s 0.86 s 0.35 s

Page 52: 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.

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

Page 53: 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.

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

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

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