Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <boost/timer.hpp>
- #include <math.h>
- #include <omp.h>
- using namespace std;
- double single_thread(double a[], const int &niter)
- {
- double sum = 0.0;
- double x;
- for (int i = 0; i < niter; i++)
- {
- for (int j = 0; j < niter; j++)
- {
- for (int k = 0; k < niter; k++)
- {
- x = sin(a[i]) * cos(a[j]) * sin(a[k]);
- sum += x;
- }
- }
- }
- return sum;
- }
- double omp_reduction(double a[], const int &niter, const int &num_treads)
- {
- double sum = 0;
- double x;
- int i, j, k;
- omp_set_num_threads(num_treads);
- #pragma omp parallel for reduction(+:sum) shared(a) private(x, i, j, k)
- for (i = 0; i < niter; i++)
- {
- for (j = 0; j < niter; j++)
- {
- for (k = 0; k < niter; k++)
- {
- x = sin(a[i]) * cos(a[j]) * sin(a[k]);
- sum = sum + x;
- }
- }
- }
- return sum;
- }
- double omp_sections(double a[], const int &niter)
- {
- double sum1 = 0;
- double sum2 = 0;
- // double x;
- #pragma omp parallel sections num_threads(2)
- {
- #pragma omp section
- {
- for (int i = 0; i < niter / 2; i++)
- {
- for (int j = 0; j < niter; j++)
- {
- for (int k = 0; k < niter; k++)
- {
- double x = sin(a[i]) * cos(a[j]) * sin(a[k]);
- sum1 += x;
- }
- }
- }
- }
- #pragma omp section
- {
- for (int i = niter / 2; i < niter ; i++)
- {
- for (int j = 0; j < niter; j++)
- {
- for (int k = 0; k < niter; k++)
- {
- double x = sin(a[i]) * cos(a[j]) * sin(a[k]);
- sum2 += x;
- }
- }
- }
- }
- }
- return sum1 + sum2;
- }
- int main()
- {
- boost::timer t;
- const int niter = 1000;
- double a [niter];
- double sum = 0;
- for (long i = 0; i < niter; i++)
- {
- a[i] = (double)i / (double)niter;
- }
- t.restart();
- sum = single_thread(a, niter);
- cout << "Serial. Sum: " << sum << " time: " << t.elapsed() << endl;
- t.restart();
- sum = omp_reduction(a, niter, 2);
- cout << "Reduction, 2 threads. Sum: " << sum << " time: " << t.elapsed() << endl;
- t.restart();
- sum = omp_sections(a, niter);
- cout << "Two sections. Sum: " << sum << " time: " << t.elapsed() << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement