[C++] Sprawdzenie poprawności użycia OpenMP przy całkowaniu
Ostatnio zmodyfikowano 2014-03-12 21:27
przemeks91 Temat założony przez niniejszego użytkownika |
[C++] Sprawdzenie poprawności użycia OpenMP przy całkowaniu » 2014-03-11 22:59:25 Witam, muszę stworzyć program w C++, który z wykorzystaniem OpenMP obliczy wartość całki ax^2+bx+c metodą trapezów. Napisany program uruchamia się poprawnie, tylko że całka obliczana jest kilkakrotnie (brak jednej linijki z wynikiem, tylko kilka znajdujących się jedna pod drugą) i jej wynik jest źle zaokrąglony (o 2 miejsca po przecinku do przodu). Sam program całkujący bez omp działa prawidłowo. Bardzo prosiłbym o sprawdzenie kodu oraz czy w programie została użyta prawidłowa pragma. Pozdrawiam. #include <iomanip> #include <iostream> #include <cstdlib> #include <cmath> #include <omp.h>
using namespace std;
double f( double x, int a, int b, int c ) { return( a * pow( x, 2 ) + b * x + c ); }
int main() { const int N = 1000; double xp, xk, s, dx; int a, b, c, i; cout << setprecision( 3 ) << fixed; cout << "Podaj wartosc a \n"; cin >> a; cout << "Podaj wartosc b \n"; cin >> b; cout << "Podaj wartosc c \n"; cin >> c; cout << "f(x) = a * x * x + b * x + c x" << endl << "Podaj poczatek przedzialu calkowania" << endl << "xp = "; cin >> xp; cout << "Podaj koniec przedzialu calkowania" << endl << "xk = "; cin >> xk; #pragma omp parallel firstprivate(xk, xp) private (dx, i, a, b, c) shared (s) { s = 0; dx =( xk - xp ) / N; #pragma omp for reduction (+:s) for( i = 1; i < N; i++ ) { s += f( xp + i * dx, a, b, c ); s *= dx; cout << "Wartosc calki wynosi : " << setw( 8 ) << s << endl << endl; } } system( "pause" ); return 0; } |
|
DejaVu |
» 2014-03-12 16:24:54 Uruchom obliczenia na jednym wątku (bez poleceń OpenMP), a potem na wielu wątkach (z polecaniami OpenMP). Jeżeli wyniki są takie same i używanych jest N-procesorów w menedżerze zadań to znaczy, że poprawnie zastosowałeś OpenMP :) |
|
przemeks91 Temat założony przez niniejszego użytkownika |
» 2014-03-12 21:27:17 Niestety, jak już pisałem wcześniej w programie z OpenMP całka obliczana jest kilkakrotnie (brak jednej linijki z wynikiem, tylko kilka znajdujących się jedna pod drugą) i jej wynik jest źle zaokrąglony (o 2 miejsca po przecinku do przodu), a program bez OpenMP działa prawidłowo. |
|
« 1 » |