Optimização do Desempenho: Técnicas Independentes da Máquina Arquitectura de Computadores Lic. em Engenharia Informática Luís Paulo Santos.

Slides:



Advertisements
Apresentações semelhantes
Técnicas de Otimização I
Advertisements

gerador de código intermediário
V Procedimentos – são estruturas que agrupam um conjunto de comandos, que são executados quando o procedimento é chamado. v Funções – são procedimentos.
Medição do desempenho Computacional
Programação de Computadores I Prof. Eduardo 2011
Tipos de dados, Variáveis, Expressões e Operadores
Aula 4 – Sumário Linguagem assembly do MAC-1 A pilha
Ciclos, Vectores e Gráficos Simulação da Queda de Corpos II
ARQUITETURAS RISC E CISC
Recursividade Prof. Alex F. V. Machado
Prof. Heloise Manica Paris Teixeira
CISC e RISC.
Automato de Pilha.
Recursividade Conceitos e Aplicações.
AULA – Linguagem C – Vetores, Ponteiros Estruturas
Estruturas de Controle
Construção de Compiladores
Complexidade de Algoritmos
Arquitetura de Computadores
Linguagens de Programação
Avaliação do desempenho
Programação em Assembly Optimização do código
Avaliação do Desempenho
Arquitectura de Computadores Lic. em Engenharia de Sistema e Informática 2008/09 Luís Paulo Santos.
Revisão da Linguagem C.
Professor Fernando Luís
Prof.° Jean Daniel Henri Merlin Andreazza Estrutura de Dados
Introdução a Computação e Cálculo Numérico
Gerenciando Grandes Modelos (aula 10)
1 Funções (versão C/C++) Em C++ existe uma opção intermédia entre a função e uma macro. Uma função pode ser declarada inline. Nesse caso as funções têm.
Conceitos de Linguagem de Programação
CADEIA DE CARACTERES (Strings)
Algoritmos Recursivos Klauko Mota. Conceito de Recursividade Um programa recursivo é um programa que chama a si mesmo, direta ou indiretamente Conceito.
Tópicos em redes e sistemas distribuídos Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação
Arquitetura de computadores
PROGRAMAÇÃO ESTRUTURADA (MODULARIZAÇÃO/SUBPROGRAMAÇÃO)
Sistemas Operacionais I
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Prof. Ricardo Santos PONTEIROS
Aveiro, 28 de Abril de Arquitectura de Computadores II Ano lectivo 2003/2004 Nuno
Java Bytecode Software Básico Mitsuo Takaki.
Técnicas de Desenvolvimento de Programas
Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014.
Geração de Código aula-12-geração-de-código.pdf.
Capítulo VIII Ambientes de Execução
Algoritmos e Estruturas de Dados RECURSIVIDADE. O que é recursividade? Recursividade significa algo ser definido em termos de sí próprio. Em termos de.
Introdução à Linguagem C
Processos.
Arquiteturas RISC x CISC
Back-End Compilação aula-11-back-end.pdf.
8088 Assembly Software Básico Mitsuo Takaki.
Recursividade Bruno Silva.
Registradores.
Bruno Iran Ferreira Maciel
Algoritmos e Programação MC102 Prof. Paulo Miranda IC-UNICAMP Aula 15 Ponteiros.
Analise de Algoritmos e Notação Assintótica
Algoritmos e Programação MC102
Norma 3GPP TS V6.0.0 ( ). Codificador AMR de 8 débitos diferentes desde 4.75 a 12.2 kbit/s. Incorpora: codificador de voz de débitos múltiplos;
Programação Computacional Aula 9: Meu primeiro programa em C
Sistemas Operativos.
Linguagens de Programação Pedro Lopes MÓDULO 4- Subprogramas (Procedimentos e Funções) 2010/2011.
PCI- Funções e Procedimentos Profa. Mercedes Gonzales Márquez.
Influencias sobre o Projeto da Linguagem
Linguagem de Programação
LÓGICA DE PROGRAMAÇÃO Curso: Técnico em Informática Professor: Ronaldo Disciplina: Lógica de Programação.
Módulo I Capítulo 7: Funções e Procedimentos William Ivanski Curso de Programação C#
 Evolução constante das linguagens de programação de alto nível (LAN) desde o Fortran (primeira LAN)  Surgimento de novos paradigmas como a OO, Orientação.
EA869 Modos de Endereçamento Faculdade de Engenharia Elétrica e de Computação (FEEC) Universidade Estadual de Campinas (UNICAMP) Prof. Levy Boccato 1.
FUNÇÕES Dilvan Moreira (baseado em material de Z. Liang)
Transcrição da apresentação:

Optimização do Desempenho: Técnicas Independentes da Máquina Arquitectura de Computadores Lic. em Engenharia Informática Luís Paulo Santos

Optimização: Independência do Processador 2 Conteúdos 10 – Optimização do Desempenho 10.1 – Capacidades e Limitações dos Compiladores C – Técnicas Independentes do Processador: optimização de ciclos, invocação de procedimentos e acessos a memória C1 Resultados de Aprendizagem R10.1 – Descrever, aplicar e avaliar técnicas de optimização de desempenho C1

AC - Optimizações independentes da máquina3 Optimização do desempenho A optimização decorre ao longo de 2 eixos: escolha cuidada dos algoritmos e estruturas de dados (responsabilidade do programador) geração de código optimizado (responsabilidade do compilador … … com a ajuda do programador) OPTIMIZAÇÃO = COMPROMISSO Aumento do desempenho... mas... aumento do tempo de desenvolvimento código mais ilegível diminuição da modularidade eventual perca de portabilidade

Optimização do desempenho 4 Optimizações independentes da máquina Aplicáveis em qualquer plataforma alvo. Exemplos: movimentação de código (code motion) redução de acessos à memória redução das invocações de procedimentos Optimizações dependentes da máquina Requerem um modelo da organização e temporização da máquina alvo Exemplos: utilização de instruções mais rápidas cálculo eficiente de expressões e endereços exploração de múltiplas unidades funcionais (loop unrolling) exploração do pipeline (loop splitting) AC - Optimizações independentes da máquina

Optimização: limitações dos compiladores 5AC - Optimizações independentes da máquina Limitação Fundamental: –Não podem, em nenhuma circunstância, causar alterações do comportamento do programa –Frequentemente, isto impede a aplicação de optimizações que apenas afectariam o comportamento em condições patológicas. Conhecimento limitado do contexto do programa: Análise feita maioritariamente dentro de um procedimento (método ou função) –Análise de todo o programa impossível ou demasiado morosa na maior parte dos casos Análise baseada maioritariamente em informação estática –O compilador não pode antecipar o valor de dados em tempo de execução A compilação deve terminar em tempo útil

Bloqueadores de Optimização 6 Memory aliasing – os cálculos realizados usando apontadores podem ter resultados inesperados se estes referirem a mesma zona de memória. func1 (int *xp, int *yp) { *xp += *yp; } func2 (int *xp, int *yp) { *xp += 2*(*yp); } ??... mas se xp==yp então func1() calcula *xp*4, enquanto func2() calcula *xp*3 AC - Optimizações independentes da máquina

Bloqueadores de Optimização 7 Efeitos colaterais – Se uma função altera variáveis globais, então a sua invocação não pode ser substituída por outra operação mais eficiente int func1 (int x) { return f(x) + f(x) + f(x); } int func2 (int x) { return 3*f(x); } ??... mas se f() altera o estado então … int counter = 0; int f(int p) { return(counter++); } AC - Optimizações independentes da máquina

Movimentação de código 8 –Reduzir o número de vezes que um cálculo é feito Se, e só se, produz sempre o mesmo resultado Em particular, mover expressões para fora dos ciclos for (i = 0; i < n; i++) for (j = 0; j < n; j++) a[n*i + j] = b[j]; for (i = 0; i < n; i++) { int ni = n*i; for (j = 0; j < n; j++) a[ni + j] = b[j]; } AC - Optimizações independentes da máquina

Movimentação de código 9 O cálculo de strlen(s) pode ser movido para fora do ciclo, mas: o compilador tem dificuldade em determinar que o corpo do ciclo não altera o resultado do cálculo de strlen(s) o compilador não consegue determinar se strlen() tem efeitos colaterais, tais como alterar alguma variável global. func (char *s) { int i; for (i=0 ; i<strlen(s); i++) s[i] += 10; } func (char *s) { int i, l; l = strlen(s); for (i=0 ; i<l; i++) s[i] += 10; } AC - Optimizações independentes da máquina

Redução de acessos à memória 10 AC - Optimizações independentes da máquina func (int *s, int *acc) { int i; *acc=0; for (i=0 ; i<10; i++) *acc +=s[i]; } movl 12(%ebp), %esi #%esi = acc movl $0, 0(%esi) # *acc=0 movl $0, -4(%ebp)# i=0 Ciclo: cmpl $10, -4(%ebp)# i<10 ?? jge fim movl –4(%ebp), %eax sall $2, %eax addl 8(%ebp), %eax movl (%eax), %edx # %edx=s[i] addl %edx, 0(%esi) # *acc+=s[i] incl –4(%ebp)# i++ jmp Ciclo Compilador não pode evitar acessos a *acc na memória com receio de memory aliasing Poderia no entanto evitar colocar i em memória

Redução de acessos à memória 11 movl $0, %ebx # t=0 movl $0, %ecx # i=0 Ciclo: cmpl $10, %ecx# i<10 ?? jge fim movl %ecx, %eax sall $2, %eax addl 8(%ebp), %eax movl (%eax), %edx # %edx=s[i] addl %edx, %ebx # t+=s[i] incl %ecx# i++ jmp Ciclo Fim: movl 12(%ebp), %esi movl %ebx, 0(%esi) func (int *s, int *acc) { int i, t; t=0; for (i=0 ; i<10; i++) t +=s[i]; *acc = t; } Compilador pode evitar acessos a *acc na memória pois não há hipótese de memory aliasing AC - Optimizações independentes da máquina

Métrica: Ciclos por Elemento (CPE) 12 –Exprimir o desempenho de operadores que processam vectores ou listas –Comprimento = n (nº de elementos no vector) –T = CPE*n + Custo_Inicial Declive = CPE = 4.0 Declive = CPE = 3.5 AC - Optimizações independentes da máquina

Exemplo de Optimização 13 –Calcula a soma de todos os elementos do vector –Guarda o resultado no parâmetro de referência dest Pentium II/III CPE: (-g)31.25 (-O2) void combine1(vec_ptr v, int *dest) { int i; *dest = 0; for (i = 0; i < vec_length(v); i++) { int val; get_vec_element(v, i, &val); *dest += val; } AC - Optimizações independentes da máquina

Exemplo de Optimização: Code Motion 14 –Mover vec_length() para fora do ciclo mais aninhado –CPE: (Compiled -O2) void combine2(vec_ptr v, int *dest) { int i; int length = vec_length(v); *dest = 0; for (i = 0; i < length; i++) { int val; get_vec_element(v, i, &val); *dest += val; } AC - Optimizações independentes da máquina

Exemplo de Optimização: Invocação de funções 15 –Evitar função para aceder aos elementos de v Ler apontador para início do vector fora do ciclo –CPE: 6.00 (Compiled -O2) Invocação de funções podem ser dispendiosas void combine3(vec_ptr v, int *dest) { int i; int length = vec_length(v); int *data = get_vec_start(v); *dest = 0; for (i = 0; i < length; i++) { *dest += data[i]; } AC - Optimizações independentes da máquina

Exemplo de Optimização: Acessos à Memória 16 –Resultado só é armazenado no destino no fim –Variável local sum armazenada em registo –Evita 1 leitura e 1 escrita na memória por iteração –CPE: 2.00 (Compiled -O2) Acessos à memória podem ser dispendiosos void combine4(vec_ptr v, int *dest) { int i; int length = vec_length(v); int *data = get_vec_start(v); int sum = 0; for (i = 0; i < length; i++) sum += data[i]; *dest = sum; } AC - Optimizações independentes da máquina