Integração numerica utilizando threads
VITÓRIA DA CONQUISTA – BA
Integração Númerica utilizando Threads
VITÓRIA DA CONQUISTA – BA
SETEMBRO/2010
I) Estrategia para Solução Paralela Utilizar as bibliotecas pthreads e omp para parelizar o calculo, principalmente quando os valores são altos, na tentativa de obter um melhor desempenho.
II) Objetivo Realizar o calculo da área de trapézio por meio de integração utilizando threads, com a finalidade de entender o seu funcionamento e medir o desempenho entre ambas as bibiotecas
III) Algoritmo Seqüencial
Double fleft = f(a), fright, area = 0.0; double width = (b-a) / intervals; for [ x = ( a + width ) to b by width]{ fright = f(x); area = area + ( fleft + fright) * width / 2; fleft = fright;
}
III.b) Algoritmo Paralelo Double fleft = f(a), fright, area = 0.0; double width = (b-a) / intervals; co{ for [ x = ( a + width ) to b by width]{ fright = f(x); area = area + ( fleft + fright) * width / 2; fleft = fright;
}
oc
}
V) Testes Realizados Para a realização deste trabalho, foram usadas as linguagens, C/C++, usando as bibliotecas Omp e Pthreads.
a | b | n | Omp | Pthread | 1 | 20.000.000 | 50.000.000 | 47,116s | 46,385s | 1 | 15.000.000 | 40.000.000 | 37,196s | 38,862s | 1 | 5.000.000 | 25.000.000 | 25,212s | 31,306s |
Pode-se observar que o para valores menores o omp é mais rápido como nas duas primeiras execuções.
VI) Referencias
Livro Erad 2001 – 2002; Escola Regional de Alto Desempenho
VII) Apêndice
Código Fonte em C++, método seqüencial:
#include <iostream>
#include <cmath>
using namespace std;
double f(double x); int i; double sum;
void calcula(double a, double b, double n)
{
// Calcular dimensão de cada partição. double h = (b - a) / (n - 1); // Inicializar x. double x = a; // Ciclo de cálculo. for (i = 1; i <= n - 1; i++) { sum = sum + f(x) + f(x + h); x = x +