Advertisement
Guest User

Untitled

a guest
Jun 24th, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.72 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <tbb/tick_count.h>
  3.  
  4. using namespace std;
  5.  
  6. const int N = 4e6;
  7. double x[2*N], y[2*N];
  8.  
  9. void saxpy(double a) {
  10.         for (int i = 0 ; i < 2*N-1 ; i+=2)
  11.                 y[i] = a * y[i+1] + y[i];
  12. }
  13.  
  14. void saxpy_parallel(double a, int kParallelism) {
  15.   auto fun = [=](double a, int st, int en) {
  16.     for (int i = st; i < en; i+=2)
  17.       y[i] = a * y[i+1] * y[i];
  18.   };
  19.   {
  20.     auto parallelizer = [=](decltype(fun) func, int st, int en) {
  21.       std::thread bmvm_threads[kParallelism - 1];
  22.       int tasksize = en - st;
  23.       int batchsize = tasksize / kParallelism;
  24.       for (int i = 0; i < kParallelism - 1; i++)
  25.         bmvm_threads[i] =
  26.             std::thread(func, a, st + i * batchsize, st + (i + 1) * batchsize);
  27.       func(a, st + (kParallelism - 1) * batchsize, en);
  28.       for (int i = 0; i < kParallelism - 1; i++)
  29.         bmvm_threads[i].join();
  30.     };
  31.     parallelizer(fun, 0, 2*N-1);
  32.   }
  33.  
  34. }
  35.  
  36. int main() {
  37.         std::uniform_real_distribution<double> unif(0, N);
  38.         std::default_random_engine re;
  39.         for (int i = 0 ; i < N ; i++)
  40.                 y[i] = unif(re), x[i] = unif(re);
  41.         std::chrono::time_point<std::chrono::high_resolution_clock> start;
  42.         start = std::chrono::high_resolution_clock::now();
  43.         saxpy(4.0);
  44.         std::chrono::duration<double> time_taken =
  45.                 std::chrono::high_resolution_clock::now() - start;
  46.         cout << "Serial Time: " << time_taken.count() << endl;
  47.         start = std::chrono::high_resolution_clock::now();
  48.         saxpy_parallel(4.0, 2);
  49.         time_taken = std::chrono::high_resolution_clock::now() - start;
  50.         cout << "Parallel Time: " << time_taken.count() << endl;
  51.         return 0;
  52. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement