Advertisement
kernel_memory_dump

Untitled

Jun 4th, 2015
280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.50 KB | None | 0 0
  1.  
  2. #include <iostream>
  3. #include "tbb/task_scheduler_init.h"
  4. #include "tbb/tick_count.h"
  5. #include "tbb/task.h"
  6. #include <fstream>
  7. #include <string>
  8.  
  9.  
  10. using namespace std;
  11. using namespace tbb;
  12.  
  13. #define GRAINSIZE  40
  14.  
  15.  
  16. class Matrix {
  17. private:
  18.  
  19.  
  20.  
  21. public:
  22.    
  23.     int n;
  24.     int m;
  25.  
  26.     int ** podaci;
  27.  
  28.     /**
  29.         "desc: ova metoda mnozi deo matrica a i b i smesta ih u deo matrice C (trenutni objekat nad kojim je pozvana ova metoda)
  30.         *pocetna kolona - odakle poceti deo sa mnozenjem
  31.         *krajnja  kolona - dokle ici po kolonama
  32.         *krajnja vrsta q- dokle vrsta
  33.         *a - referenca na matricu a
  34.         *b - referenca na matricu b
  35.     **/
  36.     void multiplyRegion(int pocetnaKlolona, int krajnaKolona, int pocetnaVrsta, int krajnjaVrsta,  Matrix &a,Matrix &b){
  37.  
  38.  
  39.             for (int i = pocetnaKlolona; i < krajnaKolona; i ++)
  40.             {
  41.                 for (int j = pocetnaVrsta; j < krajnjaVrsta; j++)
  42.                 {
  43.                     for (int k = 0; k < m; k ++){
  44.                         podaci[i][j] += a.podaci[i][k] * b.podaci[k][j];
  45.                     }
  46.                 }
  47.             }
  48.     }
  49.     int izracunaj(int i , int j , Matrix &a ,Matrix &b,Matrix &c){
  50.         for (int k = 0; k < m; k ++) //m je unutrasnja dimenzija dva vektora koja se mnoze
  51.     {
  52.        
  53.         }
  54.     }
  55.  
  56.        
  57.  
  58.     Matrix (int n , int m ){  
  59.         this->m = m;
  60.         this->n = n;
  61.  
  62.         podaci = new int*[n];
  63.         for(int i = 0; i < n ; i++){
  64.             podaci[i] =  new int[m];
  65.             for(int j = 0; j < m; j++){
  66.                 podaci[i][j] = 0;
  67.             }
  68.         }
  69.    
  70.     }
  71.  
  72. };
  73.  
  74. class CetvrtinaMatrice: public tbb::task
  75. {
  76. public:
  77.     int pocetnaKolona, krajnjaKolona, pocetnaVrsta, krajnjaVrsta ;
  78.  
  79.  
  80.     Matrix &a , &b ,&c;
  81.  
  82.  
  83.     CetvrtinaMatrice(int pocetnaKolona_, int krajnjaKolona_, int pocetnaVrsta_, int krajnjaVrsta_, Matrix &a_, Matrix &b_, Matrix &c_) :
  84.          pocetnaKolona( pocetnaKolona_), pocetnaVrsta(pocetnaVrsta_),krajnjaKolona(krajnjaKolona_), krajnjaVrsta(krajnjaVrsta_),  a(a_), b(b_), c(c_){}
  85.     tbb::task* execute()////// za svaku malu cetvrtinu
  86.     {
  87.         if ((pocetnaKolona-krajnjaKolona)* (pocetnaVrsta - krajnjaVrsta) < GRAINSIZE)
  88.         {
  89.             c.multiplyRegion ( pocetnaKolona, krajnjaKolona,  pocetnaVrsta,  krajnjaVrsta,   a, b);
  90.         } else {
  91.             CetvrtinaMatrice& l1 = *new (allocate_child()) CetvrtinaMatrice(pocetnaKolona, (pocetnaKolona +krajnjaKolona)/2, pocetnaVrsta, (pocetnaVrsta +krajnjaVrsta)/2,  a,b,c);
  92.             CetvrtinaMatrice& l2 = *new (allocate_child()) CetvrtinaMatrice(pocetnaKolona, (pocetnaKolona + krajnjaKolona)/2, (krajnjaVrsta + pocetnaVrsta)/2, krajnjaVrsta,a,b,c);
  93.             CetvrtinaMatrice& l3 = *new (allocate_child()) CetvrtinaMatrice((pocetnaKolona + krajnjaKolona)/2, krajnjaKolona, pocetnaVrsta, (pocetnaVrsta + krajnjaVrsta)/2, a,b,c);
  94.             CetvrtinaMatrice& l4 = *new (allocate_child()) CetvrtinaMatrice((pocetnaKolona + krajnjaKolona)/2, krajnjaKolona, (pocetnaVrsta + krajnjaVrsta)/2, krajnjaVrsta,a,b,c);
  95.             set_ref_count(5);
  96.             spawn(l1);
  97.             spawn(l2);
  98.             spawn(l3);
  99.             spawn_and_wait_for_all(l4);
  100.         }
  101.         return NULL;
  102.     }
  103. };
  104.  
  105.     class ParalelnoMnozenje: public tbb::task //// celu veuki na 4 dela
  106. {
  107. public:
  108.     int pocetnaKolona, krajnjaKolona, pocetnaVrsta, krajnjaVrsta;
  109.     ParalelnoMnozenje( Matrix &a_, Matrix&b_, Matrix& c_) : a(a_), b(b_), c(c_) {}
  110.     Matrix &a , &b ,&c;
  111.  
  112.     tbb::task* execute()
  113.     {
  114.         if (a.m * b.n < GRAINSIZE)
  115.         {
  116.             c.multiplyRegion ( pocetnaKolona, krajnjaKolona,  pocetnaVrsta,  krajnjaVrsta,   a, b);
  117.         } else
  118.         {
  119.             CetvrtinaMatrice& l1 = *new (allocate_child()) CetvrtinaMatrice(0, a.m/2, 0,  b.n/2, a,b,c);
  120.             CetvrtinaMatrice& l2 = *new (allocate_child()) CetvrtinaMatrice(0, a.m/2,  b.n/2, b.n,a,b,c);
  121.             CetvrtinaMatrice& l3 = *new (allocate_child()) CetvrtinaMatrice(a.m/2, a.m, 0, b.n/2,  a,b,c);
  122.             CetvrtinaMatrice& l4 = *new (allocate_child()) CetvrtinaMatrice(a.m/2, a.m,  b.n/2,  b.n,  a,b,c);
  123.             set_ref_count(5);
  124.             spawn(l1);
  125.             spawn(l2);
  126.             spawn(l3);
  127.             spawn_and_wait_for_all(l4);
  128.         }
  129.         return NULL;
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137.     }
  138. };
  139.     // poziva root task
  140.     /**
  141.      *desc:
  142.      */
  143.     void izracunajParalelno(Matrix &a, Matrix &b ,Matrix &c ){
  144.         if ( a.n != b.m){
  145.        
  146.             cout <<"Neodgovarajuce mnozenje matrica"<<endl;
  147.  
  148.         }else{
  149.             ParalelnoMnozenje& parMno = *new (tbb::task::allocate_root()) ParalelnoMnozenje(a,b,c);
  150.             tbb::task::spawn_root_and_wait(parMno);
  151.  
  152.  
  153.         }
  154.     }
  155.    
  156.     void proveraIspravnosti(Matrix &cser,Matrix &cpar){
  157.    
  158.         for (int i = 0 ; i < cser.n; i++){
  159.        
  160.             for (int j =0 ; j< cser.m; j++){
  161.            
  162.                 if (cser.podaci[i][j] != cpar.podaci[i][j]){
  163.                     cout << "jkgjhki  " << endl;
  164.                     system("pause");
  165.                     exit(EXIT_FAILURE);
  166.                 }
  167.             }
  168.        
  169.         }
  170.  
  171.         cout<<"matrice se podudaraju"<<endl;
  172.    
  173.    
  174.     }
  175.  
  176. int main(){
  177.  
  178.    
  179.     ///////////////////////////////////////////////
  180.     ifstream myfile;
  181.     string imePrvogFala;
  182.     string imeDrugogFala;
  183.     int nPrvog;
  184.     int nDrugog;
  185.     /*
  186.     myfile.open("MatricaDim.txt");
  187.  
  188.     myfile >> imePrvogFala;
  189.     myfile >> nPrvog;
  190.     myfile >> imeDrugogFala;
  191.     myfile >> nDrugog;
  192.  
  193.     myfile.close();
  194.     */
  195.     nPrvog = 4000;
  196.     nDrugog = 4000;
  197.  
  198.     Matrix a(nPrvog, nPrvog);
  199.     Matrix b(nDrugog, nDrugog);
  200.     Matrix cser(nDrugog, nDrugog);
  201.     Matrix cpar(nDrugog,nDrugog);
  202.  
  203. /*
  204.  
  205.     ifstream prviFajl(imePrvogFala);
  206.     for(int i  = 0; i < nPrvog; i++){
  207.         for(int j = 0; j < nPrvog; j++){
  208.             prviFajl >> a.podaci[i][j];
  209.         }
  210.     }
  211.  
  212.     prviFajl.close();
  213.  
  214.     ifstream drugiFajl(imeDrugogFala);
  215.     for(int i  = 0; i < nDrugog; i++){
  216.         for(int j = 0; j < nDrugog; j++){
  217.             drugiFajl >> b.podaci[i][j];
  218.         }
  219.     }
  220.  
  221.     drugiFajl.close();
  222.  
  223.     */
  224.  
  225.     //izracunajParalelno(a,b,c);
  226.     tbb::tick_count t0 = tbb::tick_count::now();
  227.     cser.multiplyRegion(0,a.m, 0, b.m, a,b);
  228.     tbb::tick_count t1 = tbb::tick_count::now();
  229.     double serTime = (t1 - t0).seconds();
  230.     cout << "C serijski: " << "potrebno vreme: " << serTime* 1000 << " ms " << endl << "=========================================" << endl;
  231.     t0 = tbb::tick_count::now();
  232.     izracunajParalelno(a,b,cpar);
  233.     t1 = tbb::tick_count::now();
  234.     double parTime = (t1 - t0).seconds();
  235.     cout << "C paralelno: " << "potrebno vreme: " << (t1-t0).seconds()*1000 << " ms" << endl << "=========================================" << endl;
  236.    
  237.     cout << "S : " << '\t' << serTime*1000 << '\t' << "P : " << '\t' << parTime* 1000 << endl;
  238.     proveraIspravnosti( cser, cpar);
  239.    
  240.  
  241.     ofstream cSerijsko("Serijski_ti_izadjem.txt");
  242.     for(int i  = 0; i < nDrugog; i++){
  243.         for(int j = 0; j < nDrugog; j++){
  244.             cSerijsko << cser.podaci[i][j] << " ";
  245.         }
  246.         cSerijsko << endl;
  247.     }
  248.  
  249.     cSerijsko.close();
  250.  
  251.     ofstream cParalelno("Paralelno_ti_izadjem.txt");
  252.     for(int i  = 0; i < nDrugog; i++){
  253.         for(int j = 0; j < nDrugog; j++){
  254.             cParalelno << cpar.podaci[i][j] << " ";
  255.         }
  256.         cParalelno << endl;
  257.     }
  258.     cParalelno.close();
  259.  
  260.     system("pause");
  261. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement