Advertisement
Guest User

Untitled

a guest
Oct 14th, 2017
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.96 KB | None | 0 0
  1. #include <iostream>
  2. #include <thread>
  3. #include <vector>
  4. #include <chrono>
  5. #include <mutex>
  6. #include <string>
  7.  
  8. #define SUM_THREASHOLD 32
  9.  
  10. static std::mutex mtx;
  11.  
  12. static void sum_krn(int a[], int l, int r, int* res, int thr_i)
  13. {    
  14.     int s = 0;
  15.  
  16.     mtx.lock();
  17.     printf("[sum_krn] thread %d l %d r %d\n", thr_i, l, r);    
  18.     mtx.unlock();
  19.  
  20.     while(l <= r)
  21.         s += a[l++];
  22.        
  23.     *res = s;
  24. }
  25.  
  26. static void parallel_sum(int a[], int size, int* res, int threads)
  27. {
  28.     std::vector<std::thread> workers;
  29.     int n_workers;
  30.     int i = 0, l, r, grain;
  31.  
  32.     if(threads == -1)
  33.         threads = std::thread::hardware_concurrency();
  34.  
  35.     grain = size / threads;
  36.     n_workers = threads - 1;       
  37.  
  38.     printf("[parallel_sum] size %d threads %d grain %d\n",
  39.             size, threads, grain);
  40.  
  41.     // skip if the array is too small
  42.     if(size >= SUM_THREASHOLD)
  43.     {
  44.         for(i = 0; i < n_workers; ++i)
  45.         {
  46.             l = grain * i;
  47.             r = grain * (i + 1);
  48.  
  49.             std::thread thr = std::thread(&sum_krn, a, l, r, res, i);
  50.             workers.push_back(std::move(thr));
  51.         }
  52.     }
  53.  
  54.     sum_krn(a, grain * i, size - 1, res, i);
  55.  
  56.     for(i = 0; i < workers.size(); ++i)
  57.         workers[i].join();
  58. }
  59.  
  60. int main(int argc, char** argv)
  61. {
  62.     int sz;
  63.     int i;
  64.     int sum;
  65.     int threads = -1;
  66.     std::vector<int> a;
  67.  
  68.     if(argc < 2)
  69.     {
  70.         fprintf(stderr, "usage: prog ARRAY_SIZE [N_THREADS]\n");
  71.         return -1;
  72.     }
  73.  
  74.     try {
  75.         sz = std::stoi(argv[1]);
  76.    
  77.         if(argc >= 3)
  78.             threads = std::stoi(argv[2]);
  79.     }
  80.     catch(const std::exception& e)
  81.     {
  82.         fprintf(stderr, "Failed to parse input args: %s\n", e.what());
  83.         return -1;
  84.     }
  85.    
  86.     a.resize(sz);
  87.     for(i = 0; i < sz; i++)
  88.         a[i] = i;
  89.        
  90.     auto tm_start = std::chrono::high_resolution_clock::now();
  91.  
  92.     parallel_sum(&a[0], sz, &sum, threads);
  93.  
  94.     auto tm_end = std::chrono::high_resolution_clock::now();
  95.     std::chrono::duration<double> tm_diff = tm_end - tm_start;
  96.     double elapsed = tm_diff.count();
  97.    
  98.     printf("Elapsed time %f sec.\nSum = %d\n", elapsed, sum);
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement