Verificador de Números Mutuamente Amigos - multithread - OpenMP
Por: Evandro.2016 • 29/12/2017 • 834 Palavras (4 Páginas) • 355 Visualizações
...
Nesta função existe um loop que para cada número ele compara com todo o array (em outro loop) razões iguais, se em ambas as colunas os números(dividendo e divisor) forem iguais então os números são mutuamente amigos, para evitar que números iguais apareçam no printf, coloquei a condição I!=f ou seja o número que esta sendo testado não pode ser igual a ele mesmo, e para evitar repetições coloquei f > I, ou seja enquanto o número testado for menor que a lista de números que esta sendo comparada ele pode printar, evitando assim repetições em ordem inversa.
Deste modo percorremos todo o array de n casas, n vezes a fim de comparar todos os números. E após a comparação printamos na tela todos os números mutuamente amigos.
Solução Paralela.
Para a solução paralela foi utilizada o modelo de programação OpenMP.
O programa é básicamente dividido em 2 grandes funções, acharar as razões e comparar os vetores, a primeira necessita ser finalizada antes de iniciada a segunda, portanto ambas não podem ser executadas em paralelo, sendo assim podemos somar todos os esforços para fazer uma e depois fazer a outra.
Começando pela função acharRazoes;
[pic 6]
Usei a diretiva #pragma omp parallel for schedule(guided) num_threads(nthreads).
#pragma omp parallel define a área da região paralela.
O “for” após esta diretiva permite paralelizar loops de maneira automática, as iterações são distribuídas e executadas em paralelo pelas threads da região paralela.
O schedule(guided) reduz os tamanhos dos blocos de forma exponecial toda vez que o bloco é dado para uma thread, deste modo as diferentes threads conseguem terminar de executar o processamento em tempo parecido, independente do número de threads.
O num_threads(nthreads) é o número de threads que esta região paralela irá utilizar para realizar o processamento.
Utilizamos esta estratégia na função de compararVetores também.
[pic 7]
Resultados:
Foi utilizado um processador intel Core i5, portátil, 2 core, 1,15GHZ.
Trabalho3a → Sequencial;
[pic 8][pic 9][pic 10]
Trabalho3b → Paralelo;
[pic 11][pic 12][pic 13]
Desempenho:
Sequencial
Paralela[pic 14]
[pic 15][pic 16][pic 17]
...