Advertisement
Guest User

Untitled

a guest
Apr 8th, 2020
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.32 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include "tbb/task_scheduler_init.h"
  4. #include "tbb/tick_count.h"
  5. #include "tbb/task.h"
  6. #include <vector>
  7.  
  8. #define NUM_ROWS 8
  9.  
  10. using namespace tbb;
  11. using namespace std;
  12.  
  13. typedef vector<vector<int>> Matrix;
  14.  
  15. struct DAGTask : public task
  16. {
  17.     vector<DAGTask*> successors;
  18.     vector<int> receive;
  19.     vector<int> data;
  20.     vector<int*> gift;
  21.     DAGTask* final_task; // samo je aktivan u zadnjij iteraciji ostalo nicemu ne sluzi
  22.     int iteration; // po ovome razlikujem iteracije
  23.  
  24.     DAGTask(const vector<DAGTask*>& s, const vector<int>& rec, const vector<int*>& gifts, int it, const vector<int>& y, DAGTask* e = nullptr):
  25.         successors(s),
  26.         receive(NUM_ROWS),
  27.         gift(gifts),
  28.         final_task(e),
  29.         iteration(it)
  30.     {
  31.  
  32.         switch (iteration)
  33.         {
  34.         case 1:
  35.             receive = rec;
  36.             data = y;
  37.             add_successors();
  38.             break;
  39.         case 2:
  40.             data = rec;
  41.             add_successors();
  42.             break;
  43.         case 3:
  44.             data = rec;
  45.             final_task->increment_ref_count();
  46.             break;
  47.         }
  48.     }
  49.  
  50.     void add_successors() {
  51.         for (DAGTask* dt : successors) {
  52.             dt->increment_ref_count();
  53.         }
  54.     }
  55.  
  56.     task* execute()
  57.     {
  58.         int temp_sum = 0;
  59.         switch (iteration)
  60.         {
  61.         case 1:
  62.             for (size_t i = 0; i < NUM_ROWS; i++) { temp_sum += receive[i] * data[i]; }
  63.             for (size_t i = 0; i < gift.size(); i++) { *(gift[i]) = temp_sum; }
  64.             for (auto& a : successors)
  65.             {
  66.                 if (a->decrement_ref_count() == 0) { spawn(*a); }
  67.             }
  68.             break;
  69.         case 2:
  70.             for (size_t i = 0; i < NUM_ROWS; i++) { temp_sum += receive[i] * data[i]; }
  71.             for (size_t i = 0; i < gift.size(); i++) { *(gift[i]) = temp_sum; }
  72.             for (auto& a : successors)
  73.             {
  74.                 if (a->decrement_ref_count() == 0) { spawn(*a); }
  75.             }
  76.             break;
  77.         case 3:
  78.             for (size_t i = 0; i < NUM_ROWS; i++) { receive[i] *= data[i]; }
  79.             for (size_t i = 0; i < NUM_ROWS; i++) { *(gift[i]) = receive[i]; }
  80.             if (final_task->decrement_ref_count() == 0) {
  81.                 spawn(*final_task);
  82.             }
  83.             break;
  84.         }
  85.         return NULL;
  86.     }
  87. };
  88.  
  89.  
  90. void BuildAndEvaluateDAG()
  91. {
  92.     // Inicijalizujem matrice
  93.     vector<vector<int>> LN{ { 0,1,2,2,2,9,9,1 },{ 2,3,2,2,3,9,9,1 } ,{ 1,2,3,4,5,9,9,1 },{ 1,2,3,4,5,9,9,1 },{ 1,2,3,4,5,9,9,1 } ,{ 1,3,4,5,6,7,0,2 },{ 1,3,4,5,6,7,0,2 },{ 1,3,4,5,6,7,0,2 } };
  94.     vector<vector<int>> C{ { 0,1,2,2,2,2,2,2 },{ 2,3,2,2,3,2,2,2 } ,{ 1,2,3,4,5,2,2,2 },{ 1,2,3,4,5,2,2,2 },{ 1,2,3,4,5,2,2,2 },{ 1,3,4,5,6,7,0,2 },{ 1,3,4,5,6,7,0,2 },{ 1,3,4,5,6,7,0,2 } };
  95.     vector<vector<int>> ALPHA{ { 0,1,2,2,2,2,2,2 },{ 2,3,2,2,3,2,2,2 } ,{ 1,2,3,4,5,2,2,2 },{ 1,2,3,4,5,2,2,2 },{ 1,2,3,4,5 ,2,2,2 } ,{ 1,3,4,5,6,7,0,2 },{ 1,3,4,5,6,7,0,2 },{ 1,3,4,5,6,7,0,2 } };
  96.     Matrix result;
  97.     for (size_t i = 0; i < NUM_ROWS; ++i) { //formiram matricu za rezultat
  98.         result.push_back(vector<int>(NUM_ROWS));
  99.     }
  100.     DAGTask* e = (DAGTask*) new(tbb::task::allocate_root()) empty_task();
  101.     vector<DAGTask*> r_tasks;
  102.     vector<DAGTask*> rr_tasks;
  103.     vector<DAGTask*> rrr_tasks;
  104.  
  105.     for (size_t i = 0; i < NUM_ROWS; i++)
  106.     {
  107.         vector<int*> gifts_for_rrr;
  108.         for (size_t j = 0; j < NUM_ROWS; j++)
  109.         {
  110.             gifts_for_rrr.push_back(&result[i][j]);
  111.         }
  112.         rrr_tasks.push_back(new (task::allocate_root()) DAGTask({}, ALPHA[i], move(gifts_for_rrr), 3, {}, e));
  113.  
  114.         for (size_t j = 0; j < NUM_ROWS; j++)
  115.         {
  116.             rr_tasks.push_back(new (task::allocate_root()) DAGTask({ rrr_tasks[i] }, C[j], { &(rrr_tasks[i]->receive[j]) }, 2, {}));
  117.         }
  118.  
  119.         for (size_t j = 0; j < NUM_ROWS; j++)
  120.         {
  121.             vector<int*> gifts_for_rr;
  122.             for (size_t n = i * NUM_ROWS; n < (i + 1) * NUM_ROWS; n++)
  123.             {
  124.                 gifts_for_rr.push_back(&(rr_tasks[n]->receive[j]));
  125.             }
  126.  
  127.             vector<int> whole_col;
  128.  
  129.             for (size_t i = 0; i < NUM_ROWS; i++)
  130.             {
  131.                 whole_col.push_back(C[i][j]);
  132.             }
  133.  
  134.             r_tasks.push_back(new (task::allocate_root()) DAGTask(vector<DAGTask*>(rr_tasks.begin() + i*NUM_ROWS, rr_tasks.begin() + (i + 1)*NUM_ROWS), LN[i], move(gifts_for_rr), 1, whole_col));
  135.         }
  136.     }
  137.  
  138.     e->increment_ref_count();
  139.     for (DAGTask* r : r_tasks) {
  140.         e->spawn(*r);
  141.     }
  142.     e->wait_for_all();
  143.     e->execute();
  144.     delete(e);
  145.  
  146.     for (size_t i = 0; i < NUM_ROWS; ++i)
  147.     {
  148.         for (size_t j = 0; j < NUM_ROWS; ++j) {
  149.             cout << result[i][j] << " ";
  150.         }
  151.         cout << endl;
  152.     }
  153. }
  154.  
  155. int main(int argc, char* argv[])
  156. {
  157.     tick_count begin = tick_count::now();
  158.     BuildAndEvaluateDAG();
  159.     tick_count end = tick_count::now();
  160.     cout << (end - begin).seconds()*1000 << "ms." << endl;
  161.     return 0;
  162. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement