Całka - liczenie pól trapezów wielowątkowo

0

Cześć, mam do napisania wielowątkowy program, który oblicza całkę numeryczną za pomocą metody trapezów. Napisałem program ale bez użycia wielowątkowości.

#include <iostream>
#include <cmath>

using namespace std;

int numberOfIterations;
double s;
double dx;

double fun(double x){
    return sin(x)*cos(x);
}

double trapezoidField(double xp,int i, double dx){
    return fun(xp+i*dx);
}

double integral(double xp, double xk){
    dx = (xk - xp)/numberOfIterations;
    for (int i = 1; i < numberOfIterations; i++) {
        s+=trapezoidField(xp,i,dx);
    }
    return s = (s+(fun(xp)+fun(xk))*0.5)*dx;
}

int main() {
    numberOfIterations = 50;
    double xp=5,xk=10;
    cout << "Wartosc calki wynosi : "  << integral(xp,xk) << endl;
    return 0;
}

Napisałem funkcję, która liczy jedno pole trapezu z zamiarem napisania, że jeden wątek liczy jeden trapez, tylko na tym się zatrzymałem i nie wiem za bardzo jak dalej to ugryźć.

0

Myślałem nad użyciem Win32 oraz mutexów

2

Dlaczego nie <thread>?

3
basted napisał(a):

Napisałem funkcję, która liczy jedno pole trapezu z zamiarem napisania, że jeden wątek liczy jeden trapez, tylko na tym się zatrzymałem i nie wiem za bardzo jak dalej to ugryźć.

Jeżeli **jeden wątek liczy jeden trapez** to będzie znacznie wolniej niż w przypadku jednego wątku.
Wyznacz ilość wątków i niech każdy wątek liczy sumę trapezów dla swojej części, np przy ilości wątków 3 wątek numer 2 będzie liczył trapezy z numerami:
2, 5, 8, 11, 14, 17, ...
Czyli każdy wątek liczy sumę dla trapezów z numerami:
T(0)=numer wątku
T(n+1)=T(n)+ilości wątków

2

Bierz od uwagę czas obsługi wątku vs czas działania. U ciebie funkcja licząca pole trapezu jest bardzo prosta, dosłownie kilka instrukcji asemblera, w efekcie robienie nowego wątku dla każdego takiego wywołania tylko wszystko spowolni.

2

Dopiero zauważyłem:

basted napisał(a):
double fun(double x){
    return sin(x)*cos(x);
}

Po raz pierwszy widzę użycie funkcji trygonometrycznych do obliczenia powierzchni trapezu.
Proponuję jako kandydata do perełek.

Wg mnie strasznie to przekombinowane, może coś w stylu:

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;

typedef double examined(double x);

double trapez(examined *exam,double a,double b) { return 0.5*(b-a)*(exam(a)+exam(b)); }

double integral(examined *exam,double a,double b,size_t parts,size_t start=0,size_t step=1)
{
	double sum=0;
	for(size_t i=0;i<parts;i+=step) sum+=trapez(exam,a+(b-a)*(i+0)/parts,a+(b-a)*(i+1)/parts);
	return sum;
}

int main()
{
	const size_t parts=10000000LL;
	double rangeA=0,rangeB=3;
	examined *exam=[](double x){ return sin(x)*cos(x); };
	cout.setf(ios::fixed);
	cout<<"1 thread: "<<integral(exam,rangeA,rangeB,parts)<<endl;
	for(size_t threads=2;threads<8;++threads)
	{
		double sum=0;
		for(size_t i=0;i<threads;++i) sum+=integral(exam,rangeA,rangeB,parts,i,threads);
		cout<<threads<<" thread: "<<sum<<endl;
	}
    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1