Advertisement
Guest User

sample openMP

a guest
Dec 10th, 2012
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.64 KB | None | 0 0
  1. #include <iostream>
  2. #include <boost/timer.hpp>
  3. #include <math.h>
  4. #include <omp.h>
  5.  
  6. using namespace std;
  7.  
  8. double single_thread(double a[], const int &niter)
  9. {
  10.     double sum = 0.0;
  11.     double x;
  12.     for (int i = 0; i < niter; i++)
  13.     {
  14.         for (int j = 0; j < niter; j++)
  15.         {
  16.             for (int k = 0; k < niter; k++)
  17.             {
  18.                 x = sin(a[i]) * cos(a[j]) * sin(a[k]);
  19.                 sum += x;
  20.             }
  21.         }
  22.     }
  23.     return sum;
  24. }
  25.  
  26. double omp_reduction(double a[], const int &niter, const int &num_treads)
  27. {
  28.     double sum = 0;
  29.     double x;
  30.     int i, j, k;
  31.     omp_set_num_threads(num_treads);
  32.  
  33. #pragma omp parallel for reduction(+:sum) shared(a) private(x, i, j, k)
  34.     for (i = 0; i < niter; i++)
  35.     {
  36.         for (j = 0; j < niter; j++)
  37.         {
  38.             for (k = 0; k < niter; k++)
  39.             {
  40.                 x = sin(a[i]) * cos(a[j]) * sin(a[k]);
  41.                 sum = sum + x;
  42.             }
  43.         }
  44.     }
  45.     return sum;
  46. }
  47.  
  48. double omp_sections(double a[], const int &niter)
  49. {
  50.     double sum1 = 0;
  51.     double sum2 = 0;
  52.     //    double x;
  53.  
  54. #pragma omp parallel sections num_threads(2)
  55.     {
  56. #pragma omp section
  57.         {
  58.             for (int i = 0; i < niter / 2; i++)
  59.             {
  60.                 for (int j = 0; j < niter; j++)
  61.                 {
  62.                     for (int k = 0; k < niter; k++)
  63.                     {
  64.                         double x = sin(a[i]) * cos(a[j]) * sin(a[k]);
  65.                         sum1 += x;
  66.                     }
  67.                 }
  68.             }
  69.         }
  70. #pragma omp section
  71.         {
  72.             for (int i = niter / 2; i < niter ; i++)
  73.             {
  74.                 for (int j = 0; j < niter; j++)
  75.                 {
  76.                     for (int k = 0; k < niter; k++)
  77.                     {
  78.                         double x = sin(a[i]) * cos(a[j]) * sin(a[k]);
  79.                         sum2 += x;
  80.                     }
  81.                 }
  82.             }
  83.         }
  84.     }
  85.     return sum1 + sum2;
  86. }
  87.  
  88. int main()
  89. {
  90.     boost::timer t;
  91.     const int niter = 1000;
  92.     double a [niter];
  93.     double sum = 0;
  94.     for (long i = 0; i < niter; i++)
  95.     {
  96.         a[i] = (double)i / (double)niter;
  97.     }
  98.  
  99.     t.restart();
  100.     sum = single_thread(a, niter);
  101.     cout << "Serial. Sum: " << sum << " time: " << t.elapsed() << endl;
  102.  
  103.     t.restart();
  104.     sum = omp_reduction(a, niter, 2);
  105.     cout << "Reduction, 2 threads. Sum: " << sum << " time: " << t.elapsed() << endl;
  106.  
  107.     t.restart();
  108.     sum = omp_sections(a, niter);
  109.     cout << "Two sections. Sum: " << sum << " time: " << t.elapsed() << endl;
  110.  
  111.     return 0;
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement