PARALELIZAÇÃO DE CÁLCULOS NUMÉRICOS DE REAÇÕES NUCLEARES DE PRÉ-EQUILÍBRIO
Maykon Lorencini Bergamaschi
Instituto Tecnológico de Aeronáutica H8C, apto. 325, CTA12228-462 – São José dos Campos/SP Bolsista PIBIC-CNPq
maykonlb@gmail.com
Brett Vern Carlson
Instituto Tecnológico de Aeronáutica Departamento de Física
Praça Marechal Eduardo Gomes, 50 12228-900 – São José dos Campos/SP brett@ita.br
Resumo: O objetivo deste trabalho é a obtenção de um ganho de desempenho no processamento de cálculos numéricos relacionados a reações de pré-equilíbrio por meio da paralelização desses cálculos, isto é, a distribuição do processamento em vários núcleos, com um aproveitamento melhor dos recursos dos cada vez mais difundidos processadores multi-core. Para isso, o ponto de partida foi o estudo do Fortran, linguagem em que estava escrito o programa. Em seguida, foram estudados os padrões de comunicação para programação paralela OpenMP e MPI. A expectativa era de que, ao término das atividades, estivesse desenvolvido o programa que realiza esses cálculos nos dois padrões para efetuar testes de desempenho. Após a realização dos testes, a versão OpenMP foi selecionada, por apresentar maior eficiência.
Palavras-chave: processamento paralelo, reações de pré-equilíbrio, OpenMP, MPI, Fortran.
1. Introdução
Normalmente, cálculos numéricos de reações nucleares consomem grandes períodos de tempo para serem processados. Um modo de reduzir esse tempo é utilizar clusters, agrupamentos de vários computadores que operam como uma única máquina com grande capacidade de processamento. Outra possibilidade é a utilização de processadores com múltiplos núcleos, os modelos multi-core, que têm se popularizado nos últimos anos. Os dois sistemas propostos constituem exemplos de processamento distribuído ou paralelo, no qual várias instruções são processadas de modo simultâneo.
Entretanto, é importante ressaltar que o ganho de desempenho com esses sistemas acontece somente com uma otimização das aplicações que antes eram executadas em um único processador com um núcleo. Geralmente tal otimização não é simples, pois não são todos os pontos de um código que podem ser processados paralelamente.
O código que foi otimizado realiza cálculos numéricos de reações nucleares de pré-equilíbrio. São cálculos que requerem grandes períodos de tempo para serem efetuados. Esses cálculos podem ser processados de modo mais eficiente por meio do processamento paralelo, que distribui os cálculos em fios para cada um dos processadores. A atuação simultânea dos processadores é que promove o ganho de desempenho.
O projeto foi desenvolvido com o propósito de distribuir o processamento do código e selecionar por meio de testes a versão cuja performance seja a mais eficiente.
2. Diferentes versões do código paralelizado
No início dos trabalhos, estava disponível uma versão do código que realiza cálculos numéricos de reações nucleares de pré-equilíbrio no padrão MPI. A linguagem em que o código estava escrito era Fortran 77. O código não resultava um ganho de desempenho satisfatório, acreditava-se que a capacidade de processamento das máquinas estava sendo subutilizada.
Foi proposta a alteração do padrão do código de MPI para OpenMP, com o objetivo de tornar a performance do programa mais eficiente. Houve, entretanto, grandes dificuldades técnicas na realização dessa atividade.
Como se tornou disponível uma versão desse código para processamento em série, isto é, em máquinas com somente um processador, a tarefa foi modificada: passou a ser a paralelização dessa versão para o padrão OpenMP.
Após o término dessa tarefa, notou-se que os resultados encontrados apresentavam certa discrepância com o que se esperava inicialmente, por motivos até então desconhecidos.
Após estudos mais aprofundados acerca do padrão OpenMP, descobriu-se que os problemas encontrados estavam
relacionados ao fato de o Método de Monte Carlo, utilizado amplamente no código em questão, ser um algoritmo
computacional baseado em repetida amostragem de números aleatórios para obter seus resultados. No padrão OpenMP, uma seqüência de números pseudo-aleatórios gerada por meio de repetidas chamadas da função random_number() não possui grau de aleatoriedade necessário para o processamento dos cálculos. Isso ocorria porque todos os processadores realizavam os cálculos empregando a mesma semente de geração dos números pseudo-aleatórios, e, dessa forma, era gerada a mesma seqüência de pseudo-aleatórios em cada processador.
2.1. Encontrando um novo gerador de números pseudo-aleatórios
Dessa forma, foi necessário buscar uma outra maneira de gerar a seqüência de números pseudo-aleatórios.
Encontrou-se uma solução para esse problema, um código gerador de números pseudo-aleatórios baseado no método de Ziggurat. O código, no padrão OpenMP, foi apresentado por G. Marsaglia e W. W. Tsang no artigo The Ziggurat
method for generating random variables, publicado em Journal of Statistical Software, vol. 5, n.º 8 e traduzido para alinguagem Fortran por Alan J. Miller, consultor estatístico da CSIRO (Commonwealth Scientific and Industrial Research Organization, Austrália).
Para essa atividade, houve primeiramente a necessidade de adaptar o gerador de pseudo-aleatórios baseado no método de Ziggurat, que se encontrava em Fortran 90, para Fortran 77. Convém lembrar que Fortran 77 é uma versão mais antiga e limitada que a 90: não estão disponíveis recursos como alocação dinâmica, processo muito conhecido por programadores que consiste em solicitar (e utilizar) uma quantidade de memória conhecida apenas em tempo de execução.
Feito isso, o novo gerador de pseudo-aleatórios foi incluído na versão OpenMP do código do cálculo que emprega o Método de Monte Carlo nos cálculos numéricos de reações nucleares de pré-equilíbrio.
2.2. Fase de testes das diferentes versões do código
Foram realizados diversos testes para verificar a aleatoriedade dos números gerados. Na tabela a seguir, está mostrado o resultado para um teste de geração de 10
9números pseudo-aleatórios entre 0 e 1. Verifica-se que foram encontrados resultados totalmente coerentes com o grau de aleatoriedade esperado.
Tabela 1. Resultados dos testes do novo gerador de pseudo-aleatórios.
Valor esperado Valor encontrado Média aritmética 0,500000 0,499998 Desvio padrão 0,288675 0,288671
Concomitantemente à programação relacionada à paralelização do código, foram estudadas algumas características do processamento distribuído. Alguns conceitos relacionados a esse tema foram pesquisados. O linear speedup, por exemplo, corresponde ao número de vezes o processamento distribuído é mais rápido que o não-distribuído.
Analisando os períodos de tempo despendidos pelos processamentos distribuído e não-distribuído à luz do conceito de linear speedup, constata-se que os ganhos de desempenho são consideráveis com o padrão OpenMP nessa atividade, como se pode ver na tabela abaixo. Os testes foram realizados com 10
8iterações em uma máquina com quatro processadores. Cada forma de processamento foi testada três vezes. O processamento não-distribuído empregou somente um dos processadores da máquina.
Tabela 2. Análise dos ganhos de desempenho com o processamento paralelo para o código que utiliza o Método de Monte Carlo.
Forma de Processamento Tempo / min
Linear speedupNão-distribuído 142 ± 1 -
Com 4 processadores em padrão MPI 148 ± 2 1,0 ± 0,1 Com 4 processadores em padrão OpenMP 80 ± 4 1,8 ± 0,1
Observe que o linear speedup da paralelização com MPI é próximo de 1,0, logo essa forma de processamento não traz ganhos significativos. Esperava-se um resultado diferente, com um ganho de desempenho apreciável. São necessários mais testes para validar o que foi encontrado.
Já o padrão OpenMP apresenta maior eficiência no processamento, conforme revela o valor de seu linear speedup.
Portanto, o código em OpenMP construído neste projeto é o mais adequado para o cálculo que utiliza o Método de Monte Carlo.
Outro teste que foi realizado foi a comparação da utilização de diferentes números de processadores para atuar
sobre o código no padrão OpenMP gerado. Os testes foram efetuados com 10
8iterações. Foram realizados três testes
para cada número de processadores. A seguir, está mostrado um gráfico com os resultados.
0 50 100 150 200
1 2 4
Núme ro de proce ssadore s Tempo para processamento/min