Advertisement
CaseRuten

omp_1

Feb 26th, 2020
412
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.48 KB | None | 0 0
  1. #include <omp.h>
  2. #include <iostream>
  3. #include <cmath>
  4. #include <ctime>
  5. #include <chrono>
  6. #include <iomanip>
  7. #include <algorithm>
  8. #include <tuple>
  9.  
  10. using namespace std;
  11.  
  12. const double PI = 3.1415926535897932384626433832795;
  13.  
  14. double f(double x) {
  15.     return 1 / (sqrt(x - x * x));
  16. }
  17.  
  18. double integral(double a, double b, double h) {
  19.  
  20.     int n = (b - a) / h;
  21.  
  22.     double sum = 0.0;
  23.  
  24.     for (int i = 0; i < n; i++)
  25.     {
  26.         double x = a + i * h + h / 2;
  27.         sum += f(x) * h;
  28.     }
  29.  
  30.     return sum;
  31. }
  32.  
  33. double integral_parallel(double a, double b, double h) {
  34.  
  35.     int n = (b - a) / h;
  36.  
  37.     double sum = 0.0;
  38.  
  39.     #pragma omp parallel for reduction(+: sum)
  40.     for (int i = 0; i < n; i++)
  41.     {
  42.         double x = a + i * h + h / 2;
  43.         sum += f(x) * h;
  44.     }
  45.  
  46.     return sum;
  47. }
  48.  
  49. double integral_simpson(double a, double b, double n) {
  50.  
  51.     double h = (b - a) / 2.0 / n;
  52.  
  53.     double sum1 = 0.0;
  54.  
  55.     for (int k = 1; k <= (int)n; k++)
  56.     {
  57.         sum1 += f(a + (2 * k - 1) * h);
  58.     }
  59.  
  60.     double sum2 = 0.0;
  61.  
  62.     for (int k = 1; k <= (int)n - 1; ++k) {
  63.         sum2 += f(a + 2 * k * h);
  64.     }
  65.  
  66.     double res = h / 3 * (f(a) + f(b) + 4 * sum1 + 2 * sum2);
  67.  
  68.     return res;
  69. }
  70.  
  71. double integral_simpson_parallel(double a, double b, double n) {
  72.  
  73.     double h = (b - a) / 2.0 / n;
  74.  
  75.     double sum1 = 0.0;
  76.  
  77.  
  78.     #pragma omp parallel for reduction(+: sum1)
  79.     for (int k = 1; k <= (int)n; k++)
  80.     {
  81.         sum1 += f(a + (2 * k - 1) * h);
  82.     }
  83.  
  84.     double sum2 = 0.0;
  85.  
  86.     #pragma omp parallel for reduction(+: sum2)
  87.     for (int k = 1; k <= (int)n - 1; k++) {
  88.         sum2 += f(a + 2 * k * h);
  89.     }
  90.  
  91.     double res = h / 3 * (f(a) + f(b) + 4 * sum1 + 2 * sum2);
  92.  
  93.     return res;
  94. }
  95.  
  96. tuple<int, int, double> experiment(double a, double b, double h, double (*calc)(double, double, double), int n) {
  97.  
  98.     chrono::time_point<chrono::system_clock> start, end;
  99.  
  100.     int min_time, max_time;
  101.     int sum = 0;
  102.     bool first = true;
  103.  
  104.     for (int i = 0; i < n; ++i) {
  105.         start = chrono::system_clock::now();
  106.         calc(a, b, h);
  107.         end = chrono::system_clock::now();
  108.  
  109.         int elapsed_nanoseconds = chrono::duration_cast<chrono::nanoseconds> (end - start).count();
  110.  
  111.         if (first) {
  112.             min_time = elapsed_nanoseconds;
  113.             max_time = elapsed_nanoseconds;
  114.             first = false;
  115.         }
  116.  
  117.         min_time = min(min_time, elapsed_nanoseconds);
  118.         max_time = max(max_time, elapsed_nanoseconds);
  119.  
  120.         sum += elapsed_nanoseconds;
  121.  
  122.     }
  123.  
  124.     double avg_time = (double) sum / n;
  125.  
  126.     return { min_time, max_time, avg_time };
  127. }
  128.  
  129. //3
  130. int main() {
  131.  
  132.     double a = 1.0 / 2;
  133.     double b = 3.0 / 4;
  134.     double h = 0.00001;
  135.     int N = 1000;
  136.  
  137.     cout << "Naive:" << endl;
  138.  
  139.     cout << setprecision(15) << fixed;
  140.     cout << "Consistently:" << endl;
  141.     cout << "Expected value: " << PI / 6 << endl;
  142.     cout << "Current value: " << integral(a, b, h) << endl;
  143.     auto res_c = experiment(a, b, h, integral, N);
  144.     cout << "Min time: " << get<0>(res_c) << endl;
  145.     cout << "Max time: " << get<1>(res_c) << endl;
  146.     cout << "Avg time: " << get<2>(res_c) << endl;
  147.     cout << endl;
  148.  
  149.     cout << "Parallel:" << endl;
  150.     cout << "Expected value: " << PI / 6 << endl;
  151.     cout << "Current value: " << integral(a, b, h) << endl;
  152.     auto res_p = experiment(a, b, h, integral_parallel, N);
  153.     cout << "Min time: " << get<0>(res_p) << endl;
  154.     cout << "Max time: " << get<1>(res_p) << endl;
  155.     cout << "Avg time: " << get<2>(res_p) << endl;
  156.     cout << endl;
  157.  
  158.     int n = 10000;
  159.  
  160.     cout << "Simpson's Formula" << endl;
  161.     cout << "Consistently:" << endl;
  162.     cout << "Expected value: " << PI / 6 << endl;
  163.     cout << "Current value: " << integral_simpson(a, b, n) << endl;
  164.     auto res_s = experiment(a, b, h, integral_simpson, N);
  165.     cout << "Min time: " << get<0>(res_s) << endl;
  166.     cout << "Max time: " << get<1>(res_s) << endl;
  167.     cout << "Avg time: " << get<2>(res_s) << endl;
  168.     cout << endl;
  169.  
  170.     cout << "Simpson's Formula Parallel:" << endl;
  171.     cout << "Expected value: " << PI / 6 << endl;
  172.     cout << "Current value: " << integral_simpson_parallel(a, b, n) << endl;
  173.     auto res_s_p = experiment(a, b, h, integral_simpson_parallel, N);
  174.     cout << "Min time: " << get<0>(res_s_p) << endl;
  175.     cout << "Max time: " << get<1>(res_s_p) << endl;
  176.     cout << "Avg time: " << get<2>(res_s_p) << endl;
  177.     cout << endl;
  178.  
  179.  
  180.     system("pause");
  181.     return 0;
  182.  
  183. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement