Witam,
Błąd który masz wynika z faktu, że nie można przerywać pętli OpenMP. Dodatkowo, gdyby twój kod się wykonał, wszystkie rdzenie procesora analizowałyby dokładnie ten sam zbiór wartości, zamiast się nim podzielić.
Możesz to zadanie zrealizować tak:
bool TestPierwsza(long long p)
{
long r = (long)sqrt(p);
bool pierwsza = true;
#pragma omp parallel for
for (long i = 2; i <= r; ++i)
{
if (pierwsza && !(p % i))
pierwsza = false;
}
return pierwsza;
}
Po głębszym namyśle postamowiłem zmienić rodzaj zadania. Teraz mam program, który oblicza interpolację Newtona. Mam nadzieje, że ten będzie bardziej pasował niż obliczanie liczby pierwszej.
Oto kod:
#include <cstdlib>
#include <math.h>
#include <iostream>
#include <omp.h>
using namespace std;
int main(int argc, char *argv[])
{
int n;
cout << "Podaj stopien wielomianu:\n";
do
{
cin >> n;
} while((n<1)||(n>10000));
double x[n]; double c[n];
cout << "Podaj wezly i wartosci:\n";
for(int i=0;i<n;i++)
{
cout << " x" << i << ": "; cin >> x[i];
cout << " y" << i << ": ";
cin >> c[i];
}
#pragma omp parallel
for(int k=1;k<n;k++)
{
for(int i=n;i>k;i--)
{
c[i] = (c[i] - c[i-1])/(x[i]-x[i-k]);//te 2 petle trzeba zamienic }
}
cout << "W(x) = ";
for(int i=0;i<n;i++) {
cout << c[i];
for(int j=0;j<i;j++)
{
cout << "(x"; if(x[j]>0) cout << "-";
else cout << "+";
cout << fabs(x[j]) << ")";
}
if(i!=n-1)cout<<"+"; }
cout<<endl;
}
system("PAUSE");
return 0;
}
Niestety nie wiem, czy w odpowiedni sposób użyłem pragmy. Wiem jak wykonać prosty interfejs, ale niestety nie wiem jak zrobić aby odpowiedni kod z programu zgadzał się z odpowiednimi polani w interfejsie (np. wpisywanie w pole odpowiedniego współczynnika x0 lub okno w którym znajduj się wynik. Nie wiem w jaki sposób można zmodyfikować potrzebne parametry. Czy w podanym poniżej programie jest to w ogóle możliwe do wykonania?
Oto interfejs: