Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Sprawdzenie poprawności użycia OpenMP przy całkowaniu

Ostatnio zmodyfikowano 2014-03-12 21:27
Autor Wiadomość
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.
C/C++
#include <iomanip>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <omp.h>

using namespace std;

//*******************************
//** Tutaj definiujemy funkcję **
//*******************************

double f( double x, int a, int b, int c )
{
    return( a * pow( x, 2 ) + b * x + c );
}
//********************
//** Program główny **
//********************

int main()
{
    const int N = 1000; //liczba punktów/trapezów podziałowych
    double xp, xk, s, dx;
    int a, b, c, i;
   
   
    cout << setprecision( 3 ) // 3 cyfry po przecinku
    << fixed; // format stałoprzecinkowy
   
    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;
}
P-106145
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 :)
P-106174
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.
P-106225
« 1 »
  Strona 1 z 1