cZaJn!k Opublikowano 6 Stycznia 2012 Zgłoś Opublikowano 6 Stycznia 2012 Program o którym mowa w temacie, to nic innego jak C++ z wykorzystaniem bibliotek OpenMP. Ma on za zadanie obliczać miejsce zerowe jakiejkolwiek funkcji (wykorzystałem "wbudowana" w kod programu) wykorzystując jednocześnie *"potencjał" naszego procesora. Głównym zadaniem tego programu jest zmierzenie czasu (w milisekundach), w którym następują obliczenia przy użyciu 1,2,3,4 wątków itd. Ilość wykorzystywanych wątków może być zmieniana bezpośrednio w kodzie programu. Teraz najważniejsze pytanie.. jak to zrobić, żeby działało ok? Posiadam program obliczający miejsce zerowe metodą siecznych. Wykorzystana funkcja ma postać a+sin(bx)+c #include <stdio.h>#include <math.h> //wymagane dla funkcji sin() i M_PI#include <stdlib.h> //wymagane dla funckji atof() float a, b, c, p, k; double f(double z){ return (a*sin(b*z)+c); //funkcja obliczajaca wartosci rownania} double x(double q, double w){ return (w-(f(w)*(w-q))/(f(w)-f(q))); //funkcja obliczajaca xi+1} int isNumber(char *t) //funkcja sprawdzajaca poprawnosc danych{ int tac = 0; while(t[tac] != 0) { if (!(t[tac] == 45 || t[tac] == 46 || ( t[tac] >= 48 && t[tac] <= 57 ))) { return 0; } tac++; } return 1; } int main(){ int n = 1; //numer pierwszej iteracji double xmin, xakt, xplus; //xmin=x0 (xi-1); xakt=x1 (xi); xplus=xi+1; printf ("\nRozwiazywanie rownania a*sin(bx)+c=0. \nPodaj wspolczynniki a, b, c (oddzielone spacjami): "); char ta[128], tb[128], tc[128]; scanf("%s %s %s", ta, tb, tc); //wczytywanie danych do tablic w celu sprawdzenia poprawnosci if (isNumber(ta) != 1 || isNumber(tb) != 1 || isNumber(tc) != 1) //spr. czy dane sa poprawne { printf("\nBlad! Parametr nie jest liczba!\n"); return -1; } a = atof(ta); b = atof(tb); c = atof(tc); //konwersja stringow na floaty printf ("Podaj poczatek i koniec przedzialu (w stopniach, oddzielone spacjami): "); char tp[128], tk[128]; scanf("%s %s", tp, tk); if (isNumber(tp) != 1 || isNumber(tk) != 1) { printf("\nBlad! Przedzial nie jest liczba!\n"); return -1; } p = atof(tp); k = atof(tk); //konwersja stringow na floaty if (p == k) //wtedy w trakcie funkcji x nastepuje dzielenie przez 0 { printf ("\nBlad! p nie moze byc rowne k!\n"); return 1; } if ((a==0 || b==0) && c==0) //wtedy wykres to prosta y = 0 { printf ("\nRownanie jest spelnione dla kazdego rzeczywistego x.\n"); return 2; } if ((a==0 || b==0) && c!=0) //wtedy wykres to prosta y != 0 { printf ("\nRownanie nie jest spelnione dla zadnego x.\n"); return 3; } if ((a>0 & c>0 && c>a) || (a<0 & c>0 && c>-a) || (a>0 & c<0 && -c>a) || (a<0 & c<0 && -c>-a)) // wtedy wykres nie ma przeciec z osia x { printf ("\nRownanie nie jest spelnione dla zadnego x.\n"); return 4; } xmin = p*M_PI/180; xakt = k*M_PI/180; xplus = x(xmin, xakt); //przypisanie x-om odpowiednich wartosci while (fabs(xplus-xakt) > 0.001) { n++; //zwiekszenie numeru iteracji xmin = xakt; xakt = xplus; xplus = x(xmin, xakt); //przejscie do kolejnej iteracji - zmiana wartosci x-ow } printf ("\nRownanie jest spelnione dla x = %lf stopni. Liczba iteracji: %d.\n", xakt*180/M_PI, n); printf ("%lf", f(xakt)); //debug return 0;} Mój problem polega na zastosowaniu bibliotek OpenMP w tym programie.. mówiąc krótko, nie wiem od której strony się za to zabrać i :mur: Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...