Candidato:
Pedro Miguel dos Santos Pinto
Data, Hora e Local:
15 de julho, às 9:30, na Sala de Atos do DEC (G129), da Faculdade de Engenharia da Universidade do Porto
Presidente do Júri:
Doutor Rui Filipe Lima Maranhão de Abreu, Professor Catedrático da Faculdade de Engenharia da Universidade do Porto
Vogais:
Doutora Diana Gohringer, Professora do Institute of Computer Engineering da Faculty of Computer Science da Technische Universitat Dresden, Alemanha;
Doutor Xavier Martorell Bofill, Professor do Department of Computer Architecture da Universitat Politècnica de Catalunya, Espanha;
Doutor João Alexandre Baptista Vieira Saraiva, Professor Associado com Agregação do Departamento de Informática da Universidade do Minho;
Doutor Pedro Nuno Ferreira da Rosa da Cruz Diniz, Professor Catedrático do Departamento de Engenharia Informática da Faculdade de Engenharia da Universidade do Porto;
Doutor João Manuel Paiva Cardoso, Professor Catedrático do Departamento de Engenharia Informática da Faculdade de Engenharia da Universidade do Porto (Orientador).
Resumo:
No desenvolvimento de software, desde a computação de alto desempenho (HPC) até sistemas de computação embebidos, o desempenho e o consumo de energia são requisitos não funcionais (NFRs) omnipresentes. Para atender a esses requisitos, que muitas vezes são adiados até ao pós desenvolvimento e deixados para programadores especializados, é necessário um conhecimento profundo do problema e da arquitetura alvo, bem como conhecimento sobre modelos de programação, ferramentas e transformações de código. Assim, há uma complexidade de desenvolvimento cada vez mais alta e uma necessidade de engenheiros de desempenho e metodologias de desempenho. Como uma parte substancial do trabalho dos engenheiros de desempenho é realizada manualmente, o que pode ser lento e sujeito a erros, esta tese permite-lhes programar estratégias personalizadas para a análise e transformação de aplicações, separando o código dessas estratégias e o código da aplicação. Estendemos um fluxo típico de engenharia de desempenho, composto por ciclos análise-otimização, para permitir a programação de estratégias de análise e transformação de código-fonte. Essas estratégias, contando com uma compilação robusta source-to-source e bibliotecas fornecidas, podem ser usadas para atender aos requisitos mencionados acima. O fluxo proposto é adequado para programadores de aplicações, que podem usar configurações padrão, e para engenheiros de desempenho, que podem ajustar e afinar a aplicação. Esta tese apresenta dois exemplos concretos desse fluxo. Em primeiro lugar, propomos uma framework para memoization, uma otimização bem conhecida, não presente em compiladores de produção e complementar a outras otimizações. Em segundo lugar, usamos análises de cenário personalizadas para desenvolver código altamente especializado para um sistema de navegação futurista, multicomponente e de larga escala. Como o fluxo de engenharia de desempenho é independente da linguagem de programação alvo, fornecemos uma implementação inicial de um sistema de compilação source-to-source independente de linguagem. A avaliação experimental do nosso sistema de compilação mostra que podemos escrever estratégias de análise e transformação de maneira independente da linguagem e, ao mesmo tempo, colher outros benefícios. As estratégias agnósticas são, em média, mais curtas e não dependem de código nativo explícito, o que as torna menos propensas a erros. Embora as nossas experiências indiquem que as aplicações geralmente têm potencial limitado para memoization, com o nosso fluxo baseado na análise do comportamento da aplicação, podemos avaliar o seu impacto e aplicar a melhor configuração. A avaliação experimental mostra melhorias de tempo de até 1, 55× com configurações mínimas. Ao focar numa parte do código de um sistema de navegação, observamos que o nosso fluxo proporciona benefícios em diferentes etapas do processo de desenvolvimento. Podemos satisfazer os NFRs e, ao mesmo tempo, economizar tempo de programação e ajuste, contribuindo assim para reduções no tempo de entrega de uma solução. Num dos componentes, utilizamos a nossa framework para propor uma versão especializada do código de um processo iterativo que, com base na similaridade dos dados de entrada, reutiliza o resultado da iteração anterior. Com perda mínima de precisão, este esquema atinge uma melhoria de tempo de 1, 32×.