Advertisement
overwater

Untitled

Feb 26th, 2016
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.39 KB | None | 0 0
  1. #include <iostream>
  2. #include <omp.h>
  3. #include <vector>
  4. #include <cmath>
  5. using namespace std;
  6.  
  7. const int N = 200000000;
  8. const double step = 1 / N;
  9. const double a = 0;
  10. const double b = 4 * 3.14159265359;
  11.  
  12. double func(double x) {
  13.     return sin(x);
  14. }
  15.  
  16. double get_area(double left) {
  17.     return (func(left + step) - func(left)) * step;
  18. }
  19.  
  20. double get_integral(double a, double b, int points, int num_threads) {
  21.     double integral = 0;
  22.     #pragma omp parallel num_threads(num_threads) reduction(+:integral)
  23.     {
  24.     #pragma omp for
  25.         for (long long j = 0; j < N; ++j)
  26.             integral = get_area(a + (b - a) * j * 1. / N);
  27.     }
  28.     return integral;
  29. }
  30.  
  31. double get_time(double start_time) {
  32.     return omp_get_wtime() - start_time;
  33. }
  34.  
  35. int main() {
  36.     double integral = 0;
  37.  
  38.     cout << "Function f(x) = sin x, interval [0; 4*pi].\n\n";
  39.  
  40.     double time = 0;
  41.     vector <double> diff(8);
  42.  
  43.     double start_time = omp_get_wtime();
  44.     get_integral(a, b, N, 1);
  45.     diff[0] = get_time(start_time);
  46.     cout << 1 << " threads, integral = " << integral << ", time: " << get_time(start_time) <<
  47.         ", speed up : " << diff[0] / get_time(start_time) << endl;
  48.  
  49.     for (int i = 2; i <= 8; ++i) {
  50.         start_time = omp_get_wtime();
  51.         integral = get_integral(a, b, N, i);
  52.         cout << i << " threads, integral = " << integral << ", time: " << get_time(start_time) <<
  53.             ", speed up : " << diff[0] / get_time(start_time) << endl;
  54.     }
  55.    
  56.     return 0;
  57. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement