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.