Advertisement
osipyonok

Untitled

Jun 4th, 2017
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.12 KB | None | 0 0
  1. // ParalellProg_lab.cpp : Defines the entry point for the console application.
  2. // cv included
  3.  
  4. #include "stdafx.h"
  5.  
  6. #include <iostream>
  7. #include <cmath>
  8. #include <algorithm>
  9. #include <ctime>
  10. #include <vector>
  11. #include <omp.h>
  12. #include <mpi.h>
  13.  
  14. using namespace std;
  15.  
  16. #define ll long long
  17. #define MOD 1000000007 // 10^9+7
  18.  
  19.  
  20.  
  21. int main(int argc, char* argv[]) {
  22.     int worldSize;
  23.     int worldRank;
  24.     MPI_Init(&argc, &argv);
  25.     MPI_Comm_size(MPI_COMM_WORLD, &worldSize);
  26.     MPI_Comm_rank(MPI_COMM_WORLD, &worldRank);
  27.     MPI_Status status;
  28.  
  29.     int a1, d, n;
  30.     ll start;
  31. //      cin >> a1 >> d >> n;
  32.     a1 = 1, d = 1, n = 1e10;
  33.     if (worldRank == 0) {
  34.         ///O(1) result
  35.         int an = (1LL * a1 + 1LL * (n - 1) * d) % MOD;
  36.         ll sum1 = (((1ll * (a1 + an) * n) % MOD) * 500000004 % MOD) % MOD; // (2 * 500000004) % MOD = 1
  37.         cout << "O(1) result is: " << sum1 << endl;
  38.         ///
  39.         ///Sequential
  40.         start = clock();
  41.         ll sum2 = a1;
  42.         for (ll i = 1; i < n; ++i) {
  43.             sum2 += (a1 + 1ll * i * d) % MOD;
  44.             sum2 %= MOD;
  45.         }
  46.         cout << "Sequential result: " << sum2 << ", time: " << (1.0 * clock() - start) / CLOCKS_PER_SEC << endl;
  47.         ///
  48.         ///OpenMP
  49.         start = clock();
  50.         ll sum3 = 0;
  51. #pragma omp parallel
  52.         {
  53.             ll psum = 0;
  54. #pragma omp for
  55.             for (ll i = 0; i < n; ++i) {
  56.                 psum = ((psum % MOD) + ((a1 + 1ll * i * d)) % MOD) % MOD;
  57.             }
  58. #pragma omp critical
  59.             {
  60.                 sum3 = (sum3 % MOD + psum % MOD) % MOD;
  61.             }
  62.         }
  63.         cout << "OpenMP result: " << sum3 << ", time: " << (1.0 * clock() - start) / CLOCKS_PER_SEC << endl;
  64.         ///
  65.         ///MPI
  66.     }
  67.     start = clock();
  68.     ll sum4 = 0;
  69.     for (ll i = worldRank; i < n; i += worldSize) {
  70.         ll cur = (a1 + 1ll * i * d) % MOD;
  71.         sum4 = (sum4 + cur) % MOD;
  72.     }
  73.     if (worldRank != 0) {
  74.         MPI_Send(&sum4, 1, MPI_LONG_LONG_INT, 0, 101, MPI_COMM_WORLD);
  75.     }
  76.     else
  77.     {
  78.         for (int i = 1; i < worldSize; ++i) {
  79.             ll tmp = 0;
  80.             MPI_Recv(&tmp, 1, MPI_LONG_LONG_INT, i, 101, MPI_COMM_WORLD, &status);
  81.             sum4 = (sum4 + tmp) % MOD;
  82.         }
  83.     }
  84.    
  85.     if (worldRank == 0) {  
  86.         cout << "MPI result: " << sum4 << ", time: " << (1.0 * clock() - start) / CLOCKS_PER_SEC << endl;
  87.     }
  88.     MPI_Finalize();
  89.     ///
  90.  
  91.     return 0;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement