• Nenhum resultado encontrado

N- S CHEME COM GAUSS-SEIDEL E COM GRADIENTE

4.4.2 Segunda proposta de paralelização: N-Scheme-GC

A diferença significativa para as duas estratégias de implementação está no fato de que, o método modificado possui apenas um loop para os elementos, diferente do método original que precisava de dois loops, um para os nós e outro para os elementos que rodeiam esse nó, a “célula”, como descrito do capítulo 2. Assim, uma nova estratégia de paralelização foi necessária, pois a forma de divisão do problema anteriormente adotado não pôde ser utilizada.

4.4.2.1 Aplicação da programação paralela com MPI

Analisando o algoritmo modificado para uso com GC, percebeu- se que não é necessária uma estratégia de divisão do problema usando a geometria, os nós ou os elementos.

Na construção do algoritmo temos a matriz ktri (Tabela 1) que contém os nós de cada elemento da malha de EF e isso é suficiente para

construir o esquema de paralelização para o N-Scheme modificado. Isto porque o método N-Scheme-GC utiliza apenas um loop para os elementos. Observando o algoritmo (Figura 2), o N-Scheme é aplicado em dois momentos sendo que, o de maior importância computacional está dentro do loop das iterações, e é aqui que se tem interesse em aplicar a paralelização. Assim, como a estrutura depende de um loop para os elementos, e as informações utilizadas no processo de cálculo está na matriz ktri, a ideia foi simplesmente dividir a matriz ktri entre os processos. Para a geração da malha de EF, seguiu-se o princípio de ter um número de elementos que seja divisível pelo número de processadores utilizados, onde cada processador receba partes da matriz ktri de forma equilibrada.

Portanto, seguindo o algoritmo da Figura 2, cada processo escravo recebe uma parcela da matriz ktri, calcula o valor de q referente aos elementos usando o N-Scheme e retorna os resultados para o processo mestre. Como alguns elementos possuem alguns nós em comum, no momento da junção dos resultados de q recebidos de cada escravo, é realizada a soma destes valores pelo mestre. Feito isto, o mestre calcula um novo vetor q, calcula os valores dos potenciais v, calcula o erro e o processo continua até atingir a convergência.

A utilização de MPI em cluster de computadores para a método com GC, aplicada a problemas em 3D, não apresentou resultados satisfatórios quanto ao tempo de processamento. Os tempos em sequencial e em paralelo ficam muito próximos, sendo que o tempo em paralelo não é melhor que o tempo em sequencial. Isso se deve a granularidade do problema (fina) e a comunicação: quanto de transferência de dados (banda e latência) é necessário? Já os valores numéricos dos potenciais correspondem com o esperado.

Os resultados das execuções quanto à solução encontrada em paralelo comparada à solução através do método sequencial, assim como os tempos de execução dos programas serão apresentados e discutidos no capítulo 5.

4.4.2.2 Aplicação da programação paralela Multicore

Como a estratégia de utilizar MPI em cluster de computadores para o método N-Scheme-GC não apresentou resultados satisfatórios quanto ao tempo de processamento, partiu-se para o estudo de uma nova estratégia que envolvesse o paradigma de programação paralela, mas,

com outro foco: em ambientes multiprocessados com memória compartilhada.

Os programas, inicialmente, foram desenvolvidos e simulados utilizando a linguagem de programação FORTRAN 77. Com o impasse de não conseguir os resultados de tempo de processamento em paralelo melhores que no sequencial, optou-se pela implementação do algoritmo em C, o qual não trouxe mudanças significativas.

Iniciaram-se assim, os estudos sobre as formas de programação paralela em ambientes multicore. Aqui, partes da matriz ktri que contém informações dos nós que contribuem em cada elemento da malha (Tabela 1) são acessadas pelos processos criados nas chamadas da função fork ( ), conforme Figura 31.

Figura 31 – Criação de processos com a função fork ( ).

A primeira chamada a função fork ( ) cria dois processos sendo que um ficará aguardando a finalização de todos os demais para dar continuidade ao programa. Cada chamada de fork ( ) cria 2 processos filhos que são cópias do processo pai. Na Figura 31, temos a criação de 8 processos que acessam diferentes posições da matriz ktri. Cada processo aplica o método N-Scheme para calcular os potenciais nos nós incógnitos.

Nestes ambientes (sistemas multicore) é preciso enfrentar alguns desafios nas execuções dos programas, como:

a) o sistema operacional permite que mais de uma atividade ocorra ao mesmo tempo;

b) gerenciar atividades diferentes pode gerar problemas de sincronização, comunicação, balanceamento de carga e escalabilidade.

Assim, como medir esses problemas? A resposta para essa pergunta veio através da análise dos resultados obtidos em várias execuções dos programas, o que levou a melhorias na implementação do código paralelo levando a solucionar os desafios citados acima.

Nesses experimentos atentou-se para:

 Sincronização: como coordenar a atividade de dois ou mais processos;

 Comunicação: quanto de transferência de dados (banda e latência) é necessário;

 Balanceamento de carga: como distribuir o trabalho entre os processos de forma a não deixar nenhum ocioso;

 Escalabilidade: como fazer bom uso dos processos quando o sistema computacional aumentar.

Todas essas questões foram solucionadas utilizando comandos específicos que atendessem a todos os requisitos necessários para um bom desempenho do programa em paralelo. Esta estratégia foi aplicada em problemas em 3D apresentando resultados satisfatórios quanto à solução numérica obtida assim como os tempos de processamento sequencial comparado com o paralelo. Os resultados das execuções dos programas quanto à solução encontrada em paralelo comparada à solução através do código sequencial, assim como os tempos de execução dos programas serão apresentados e discutidos no próximo capítulo.

4.5 CONSIDERAÇÕES SOBRE AS PROPOSTAS DE

Documentos relacionados