Advertisement
Guest User

Untitled

a guest
Apr 6th, 2020
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.22 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <string>
  4. #include "tbb/task_scheduler_init.h"
  5. #include "tbb/tick_count.h"
  6. #include "tbb/task.h"
  7. #include <vector>
  8.  
  9. using namespace tbb;
  10. using namespace std;
  11.  
  12. const int M = 2, N = 2;
  13.  
  14. class DagTask : public tbb::task {
  15. public:
  16.    
  17.     // input[0] = sum from above, input[1] = sum from left
  18.     vector<int> input;
  19.     vector<int> data;
  20.     string id;
  21.     int type;
  22.     // successor[0] = successor below, successor[1] = successor to right
  23.     vector<DagTask*> successor;
  24.     DagTask(vector<int> _data, vector<int> _input, string _id, int t = 0) :  data(_data), input(_input), id(_id), type(t){}
  25.  
  26.     void add_successor(DagTask* s) {
  27.         successor.push_back(s);
  28.         s->increment_ref_count();
  29.     }
  30.  
  31.     task* execute() {
  32.         __TBB_ASSERT(ref_count() == 0, NULL);
  33.         printf_s("%s %d %d %d %d\n", id.data(), data[0], data[1], input[0], input[1]);
  34.  
  35.         if (type == 1) {
  36.             /*printf_s("%s se sjebo\n", id.data());*/
  37.             for (size_t i = 0; i < input.size(); i++)
  38.             {
  39.                 data[i] *= input[input.size()-1-i];
  40.                 successor[0]->input.push_back(data[i]);
  41.             }
  42.             printf_s("%s %d %d %d %d\n", id.data(), data[0], data[1], input[0], input[1]);
  43.         }
  44.  
  45.         for (int k = 0; k < successor.size(); ++k)
  46.             if (DagTask* t = successor[k]) {
  47.                 t->input.push_back(data[0] * input[1] + data[1] * input[0]);
  48.                 if (t->decrement_ref_count() == 0)
  49.                     spawn(*t);
  50.             }
  51.  
  52.         return NULL;
  53.     }
  54. };
  55.  
  56. void BuildAndEvaluateDAG() {
  57.  
  58.     DagTask* e = (DagTask*) new(tbb::task::allocate_root()) empty_task;
  59.  
  60.     DagTask* rrr1 = new(tbb::task::allocate_root()) DagTask({ 8, 9 }, {}, "rrr1", 1);
  61.     rrr1->add_successor(e);
  62.     DagTask* rrr2 = new(tbb::task::allocate_root()) DagTask({ 10, 11 }, {}, "rrr2", 1);
  63.     rrr2->add_successor(e);
  64.  
  65.     DagTask* rr1 = new(tbb::task::allocate_root()) DagTask({ 4, 5 }, {}, "rr1");
  66.     rr1->add_successor(rrr1);
  67.     DagTask* rr2 = new(tbb::task::allocate_root()) DagTask({ 6, 7 }, {}, "rr2");
  68.     rr2->add_successor(rrr1);
  69.     DagTask* rr3 = new(tbb::task::allocate_root()) DagTask({ 4, 5 }, {}, "rr3");
  70.     rr3->add_successor(rrr2);
  71.     DagTask* rr4 = new(tbb::task::allocate_root()) DagTask({ 6, 7 }, {}, "rr4");
  72.     rr4->add_successor(rrr2);
  73.  
  74.     DagTask* r1 = new(tbb::task::allocate_root()) DagTask({ 0, 1 },  { 6, 4 }, "r1");
  75.     r1->add_successor(rr1);
  76.     r1->add_successor(rr2);
  77.     DagTask* r2 = new(tbb::task::allocate_root()) DagTask({ 0, 1 }, { 7, 5 }, "r2");
  78.     r2->add_successor(rr1);
  79.     r2->add_successor(rr2);
  80.     DagTask* r3 = new(tbb::task::allocate_root()) DagTask({ 2, 3 }, { 6, 4 }, "r3");
  81.     r3->add_successor(rr3);
  82.     r3->add_successor(rr4);
  83.     DagTask* r4 = new(tbb::task::allocate_root()) DagTask({ 2, 3 }, { 7, 5 }, "r4");
  84.     r4->add_successor(rr3);
  85.     r4->add_successor(rr4);
  86.    
  87.  
  88.     e->increment_ref_count();
  89.     e->spawn(*r1);
  90.     e->spawn(*r2);
  91.     e->spawn(*r3);
  92.     e->spawn_and_wait_for_all(*r4);
  93.     cout << "zavrsio" << endl;
  94.     e->execute();
  95.     int result[2][2];
  96.     result[0][0] = e->input[3];
  97.     result[0][1] = e->input[2];
  98.     result[1][0] = e->input[0];
  99.     result[1][1] = e->input[1];
  100.     for (size_t i = 0; i < 2; i++)
  101.     {
  102.         for (size_t j = 0; j < 2; j++)
  103.         {
  104.             cout << result[i][j] << " ";
  105.         }
  106.         cout << endl;
  107.     }
  108.     task::destroy(*e);
  109.  
  110. }
  111.  
  112. int main(int argc, char* argv[])
  113. {
  114.     // build and evaluate DAG
  115.     BuildAndEvaluateDAG();
  116.     return 0;
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement