Proposta Técnica de Projeto: Avaliação, Otimização e Expansão de Compilador Portátil para HPF

Suporte à Predição de Desempenho

        Uma das etapas mais críticas no processo de otimização de um programa paralelo é a identificação de seus gargalos de desempenho, os quais acarretam em significativa perda de eficiência durante a execução. Além disso, é altamente desejável que se disponha de mecanismos para prever em quais trechos do código-fonte tais gargalos irão ocorrer para a execução de um dado programa utilizando-se um certo número de processadores (P) e tamanho de problema (N). Com isto, torna-se possível concentrar corretamente os esforços de otimização naqueles trechos onde os benefícios, em termos de desempenho, serão máximos.

        Já foi demonstrado [4] que é possível obter tais predições estaticamente, sem a execução do programa, tanto para o programa completo como para cada uma de suas seções, durante o próprio processo de compilação do código-fonte HPF. Utilizando-se apropriadamente as estruturas de dados normalmente mantidas pelo compilador, é possível derivar um modelo do custo de cada seção, em termos do seu tempo de execução previsto, como função de N e P. Uma vez derivado tal modelo, representado por uma expressão simbólica, é possível obter a predição do tempo de execução para um certo par (N0,P0) através da simples avaliação do modelo para tais valores.

        Deve ser sempre ressaltado que, ao invés de uma máxima precisão nas predições calculadas, estamos mais interessados em saber como os tempos de duração das várias seções do programa devem variar em função de N e P. Com esta abordagem, deve ser possível comparar entre si as predições para os tempos das seções do programa, identificando-se aquela que for mais crítica, a qual seria alvo natural para uma primeira tentativa de otimização do código pelo programador.
 

        Concretamente, propomos expandir o compilador, interfaceando-o com ferramentas que permitam a predição de desempenho (vide [4]). Tais ferramentas seriam utilizadas por meio de chaves de compilação. Estas ferramentas permitem que o usuário teste, sem executar, diversas estratégias de paralelização de seu programa.