Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ParalellProg_lab.cpp : Defines the entry point for the console application.
- // cv included
- #include "stdafx.h"
- #include <iostream>
- #include <cmath>
- #include <algorithm>
- #include <ctime>
- #include <vector>
- #include <omp.h>
- #include <mpi.h>
- using namespace std;
- #define ll long long
- #define MOD 1000000007 // 10^9+7
- int main(int argc, char* argv[]) {
- int worldSize;
- int worldRank;
- MPI_Init(&argc, &argv);
- MPI_Comm_size(MPI_COMM_WORLD, &worldSize);
- MPI_Comm_rank(MPI_COMM_WORLD, &worldRank);
- MPI_Status status;
- int a1, d, n;
- ll start;
- // cin >> a1 >> d >> n;
- a1 = 1, d = 1, n = 1e10;
- if (worldRank == 0) {
- ///O(1) result
- int an = (1LL * a1 + 1LL * (n - 1) * d) % MOD;
- ll sum1 = (((1ll * (a1 + an) * n) % MOD) * 500000004 % MOD) % MOD; // (2 * 500000004) % MOD = 1
- cout << "O(1) result is: " << sum1 << endl;
- ///
- ///Sequential
- start = clock();
- ll sum2 = a1;
- for (ll i = 1; i < n; ++i) {
- sum2 += (a1 + 1ll * i * d) % MOD;
- sum2 %= MOD;
- }
- cout << "Sequential result: " << sum2 << ", time: " << (1.0 * clock() - start) / CLOCKS_PER_SEC << endl;
- ///
- ///OpenMP
- start = clock();
- ll sum3 = 0;
- #pragma omp parallel
- {
- ll psum = 0;
- #pragma omp for
- for (ll i = 0; i < n; ++i) {
- psum = ((psum % MOD) + ((a1 + 1ll * i * d)) % MOD) % MOD;
- }
- #pragma omp critical
- {
- sum3 = (sum3 % MOD + psum % MOD) % MOD;
- }
- }
- cout << "OpenMP result: " << sum3 << ", time: " << (1.0 * clock() - start) / CLOCKS_PER_SEC << endl;
- ///
- ///MPI
- }
- start = clock();
- ll sum4 = 0;
- for (ll i = worldRank; i < n; i += worldSize) {
- ll cur = (a1 + 1ll * i * d) % MOD;
- sum4 = (sum4 + cur) % MOD;
- }
- if (worldRank != 0) {
- MPI_Send(&sum4, 1, MPI_LONG_LONG_INT, 0, 101, MPI_COMM_WORLD);
- }
- else
- {
- for (int i = 1; i < worldSize; ++i) {
- ll tmp = 0;
- MPI_Recv(&tmp, 1, MPI_LONG_LONG_INT, i, 101, MPI_COMM_WORLD, &status);
- sum4 = (sum4 + tmp) % MOD;
- }
- }
- if (worldRank == 0) {
- cout << "MPI result: " << sum4 << ", time: " << (1.0 * clock() - start) / CLOCKS_PER_SEC << endl;
- }
- MPI_Finalize();
- ///
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement