Advertisement
Guest User

Untitled

a guest
Jan 18th, 2020
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.08 KB | None | 0 0
  1.  
  2. void TbbZad1()
  3. {
  4.     tbb::tick_count start, end;
  5.  
  6.     std::cout << "SEKWENCYJNIE" << std::endl;
  7.  
  8.     start = tbb::tick_count::now();
  9.     for (int i = 0; i < 16; i++) printf("Hello world %d\n", i);
  10.     end = tbb::tick_count::now();
  11.     printf("Sekwencyjnie time: %12.8f\n\n", (end - start).seconds());
  12.  
  13.  
  14.  
  15.  
  16.     std::cout << "ROWNOLEGLE" << std::endl;
  17.     printf("parallel invoke lambda \n");
  18.     start = tbb::tick_count::now();
  19.     tbb::parallel_invoke(
  20.         []() { for (int i = 0; i < 8; i++) printf("Hello world %d\n", i); },
  21.         []() { for (int i = 0; i < 8; i++) printf("Hello world %d\n", i); }
  22.     );
  23.     end = tbb::tick_count::now();
  24.     printf("Parallel invoke lambda time: %12.8f\n", (end - start).seconds());
  25.  
  26.  
  27.     printf("parallel invoke pointer to function \n");
  28.     start = tbb::tick_count::now();
  29.     tbb::parallel_invoke(
  30.         tbbPrintHello,
  31.         tbbPrintHello
  32.     );
  33.     end = tbb::tick_count::now();
  34.     printf("Parallel invoke pointer to function time: %12.8f\n", (end - start).seconds());
  35.  
  36.     printf("parallel invoke funktor \n");
  37.     FuncClass obj1, obj2;
  38.     start = tbb::tick_count::now();
  39.     tbb::parallel_invoke(
  40.         obj1,
  41.         obj2
  42.     );
  43.     end = tbb::tick_count::now();
  44.     printf("Parallel invoke funktor time: %12.8f\n", (end - start).seconds());
  45.  
  46. }
  47.  
  48. void TbbZad2()
  49. {
  50.     std::vector<int> vecTBB;
  51.     tbb::tick_count start, end;
  52.  
  53.     for (int i = 0; i < 100; i++)
  54.     {
  55.         vecTBB.push_back(rand());
  56.  
  57.     }
  58.     std::cout << "SEKWENCYJNIE" << std::endl;
  59.     start = tbb::tick_count::now();
  60.  
  61.     for (int i = 0; i < 100; i++)
  62.     {
  63.         printf("%d\n", vecTBB[i]);
  64.     }
  65.     end = tbb::tick_count::now();
  66.     printf("Sekwencyjnie time:  %12.8f\n\n", (end - start).seconds());
  67.  
  68.     std::cout << "ROWNOLEGLE" << std::endl;
  69.     start = tbb::tick_count::now();
  70.     tbb::parallel_for_each(vecTBB.begin(), vecTBB.end(), [&](int& v) {printf("%d\n", v); });
  71.     end = tbb::tick_count::now();
  72.     printf("parallel_for_each time:  %12.8f\n", (end - start).seconds());
  73.  
  74. }
  75.  
  76. void TbbZad3()
  77. {
  78.  
  79.     std::vector<int> vecTBB;
  80.  
  81.     tbb::tick_count start, end;
  82.     for (int i = 0; i < 100; i++)
  83.     {
  84.         vecTBB.push_back(i);
  85.     }
  86.  
  87.  
  88.     std::cout << "SEKWENCYJNIE" << std::endl;
  89.  
  90.     start = tbb::tick_count::now();
  91.     for (int i = 0; i < 100; i++)
  92.     {
  93.         if (vecTBB[i] % 2 == 0)
  94.         {
  95.             printf("%d\n", vecTBB[i]);
  96.         }
  97.     }
  98.     end = tbb::tick_count::now();
  99.     printf("Sekwencyjnie time:  %12.8f\n\n", (end - start).seconds());
  100.  
  101.  
  102.  
  103.     std::cout << "ROWNOLEGLE" << std::endl;
  104.     start = tbb::tick_count::now();
  105.     tbb::parallel_for(tbb::blocked_range<int>(0, vecTBB.size()),
  106.         [&](tbb::blocked_range<int> r)
  107.         {
  108.             for (int i = r.begin(); i < r.end(); ++i)
  109.             {
  110.                 if (vecTBB[i] % 2 == 0)
  111.                 {
  112.                     printf("%d \n", vecTBB[i]);
  113.                 }
  114.             }
  115.         });
  116.  
  117.     end = tbb::tick_count::now();
  118.     printf("parallel_for_each time: %g\n", (end - start).seconds());
  119. }
  120.  
  121. bool isPrime(int n)
  122. {
  123.     if (n <= 1)
  124.         return false;
  125.  
  126.     for (int i = 2; i < n; i++)
  127.         if (n % i == 0)
  128.             return false;
  129.  
  130.     return true;
  131. }
  132.  
  133. void TbbZad4()
  134. {
  135.     tbb::tick_count start, end;
  136.     std::vector<int>numbers;
  137.     std::vector<int>primeNumbers;
  138.  
  139.     for (int i = 0; i < 100; i++)
  140.     {
  141.         numbers.push_back(i);
  142.     }
  143.  
  144.     auto isPrime = [&primeNumbers](int& n)
  145.     {
  146.         bool retVaal = true;
  147.         if (n <= 1)
  148.             retVaal = false;
  149.  
  150.         for (int i = 2; i < n; i++)
  151.         {
  152.             if (n % i == 0)
  153.             {
  154.                 retVaal = false;
  155.             }
  156.         }
  157.  
  158.         if (retVaal == true)
  159.         {
  160.             primeNumbers.push_back(n);
  161.         };
  162.     };
  163.  
  164.     std::cout << "SEKWENCYJNIE" << std::endl;
  165.  
  166.     start = tbb::tick_count::now();
  167.     for (int i = 0; i < numbers.size(); i++)
  168.     {
  169.         isPrime(numbers[i]);
  170.     }
  171.     std::sort(primeNumbers.begin(), primeNumbers.end());
  172.     for (int i = 0; i < primeNumbers.size(); i++)
  173.     {
  174.         std::cout << primeNumbers[i] << std::endl;
  175.     }
  176.  
  177.     end = tbb::tick_count::now();
  178.     printf("Sekwencyjnie time:  %12.8f\n\n", (end - start).seconds());
  179.  
  180.  
  181.  
  182.     primeNumbers.clear(); // clear vector xD
  183.  
  184.     numbers[90] = 127;
  185.     std::cout << "ROWNOLEGLE" << std::endl;
  186.  
  187.     start = tbb::tick_count::now();
  188.     tbb::parallel_do(numbers, isPrime);
  189.  
  190.     //  std::sort(primeNumbers.begin(), primeNumbers.end());
  191.     tbb::parallel_sort(primeNumbers.begin(), primeNumbers.end());
  192.  
  193.     for (int i = 0; i < primeNumbers.size(); i++)
  194.     {
  195.         std::cout << primeNumbers[i] << std::endl;
  196.     }
  197.  
  198.     end = tbb::tick_count::now();
  199.     printf("Rownolegle time:  %12.8f\n\n", (end - start).seconds());
  200.  
  201. }
  202.  
  203. void TbbZad5()
  204. {
  205.     std::vector<int> vecTBB;
  206.  
  207.     tbb::tick_count start, end;
  208.     for (int i = 0; i < 100; i++)
  209.     {
  210.         vecTBB.push_back(i);
  211.     }
  212.  
  213.     /* sum */
  214.     std::cout << "SEKWENCYJNIE" << std::endl;
  215.  
  216.     int sum = 0;
  217.     start = tbb::tick_count::now();
  218.     for (int i = 0; i < 100; i++)
  219.     {
  220.         sum += vecTBB[i];
  221.     }
  222.     end = tbb::tick_count::now();
  223.     std::cout << "SUMA: " << sum << std::endl;
  224.  
  225.     printf("Suma sekwencyjnie time: %g\n\n", (end - start).seconds());
  226.  
  227.  
  228.     std::cout << "ROWNOLEGLE" << std::endl;
  229.  
  230.     start = tbb::tick_count::now();
  231.     auto total = tbb::parallel_reduce(
  232.         tbb::blocked_range<int>(0, vecTBB.size()),
  233.         0.0,
  234.         [&](tbb::blocked_range<int> r, double running_total)
  235.         {
  236.             for (int i = r.begin(); i < r.end(); ++i)
  237.             {
  238.                 running_total += vecTBB[i];
  239.             }
  240.  
  241.             return running_total;
  242.         }, std::plus<int>());
  243.     end = tbb::tick_count::now();
  244.  
  245.  
  246.     std::cout << total << std::endl;
  247.     printf("Suma parallel_reduce time: %g\n\n", (end - start).seconds());
  248.  
  249.  
  250.  
  251.     /* max */
  252.     std::cout << "SEKWENCYJNIE" << std::endl;
  253.  
  254.     int max = MININT;
  255.     start = tbb::tick_count::now();
  256.     for (int i = 0; i < 100; i++)
  257.     {
  258.         if (vecTBB[i] > max)
  259.         {
  260.             max = vecTBB[i];
  261.         }
  262.     }
  263.     end = tbb::tick_count::now();
  264.     std::cout << "max: " << max << std::endl;
  265.  
  266.     printf("max sekwencyjnie time: %g\n\n", (end - start).seconds());
  267.  
  268.  
  269.     std::cout << "ROWNOLEGLE" << std::endl;
  270.  
  271.     start = tbb::tick_count::now();
  272.     auto maxx = tbb::parallel_reduce(
  273.         tbb::blocked_range<int>(0, vecTBB.size()),
  274.         0,
  275.         [&](tbb::blocked_range<int> r, int val)
  276.         {
  277.             //printf("Val: %d\n", val);
  278.             for (int i = r.begin(); i < r.end(); ++i)
  279.             {
  280.                 if (vecTBB[i] > val)
  281.                     val = vecTBB[i];
  282.             }
  283.  
  284.             return val;
  285.         },
  286.         [](int a, int b) { return std::max<int>(a, b); });
  287.  
  288.     end = tbb::tick_count::now();
  289.  
  290.  
  291.     std::cout << "max: " << maxx << std::endl;
  292.     printf("Max parallel_reduce time: %g\n\n", (end - start).seconds());
  293.  
  294.  
  295.     /* min */
  296.     std::cout << "SEKWENCYJNIE" << std::endl;
  297.  
  298.     vecTBB[90] = -123;
  299.  
  300.     int min = MAXINT;
  301.     start = tbb::tick_count::now();
  302.     for (int i = 0; i < 100; i++)
  303.     {
  304.         if (vecTBB[i] < min)
  305.         {
  306.             min = vecTBB[i];
  307.         }
  308.     }
  309.     end = tbb::tick_count::now();
  310.     std::cout << "min: " << min << std::endl;
  311.  
  312.     printf("min sekwencyjnie time: %g\n\n", (end - start).seconds());
  313.  
  314.     std::cout << "ROWNOLEGLE" << std::endl;
  315.  
  316.     start = tbb::tick_count::now();
  317.     auto minn = tbb::parallel_reduce(
  318.         tbb::blocked_range<int>(0, vecTBB.size()),
  319.         0,
  320.         [&](tbb::blocked_range<int> r, int val)
  321.         {
  322.             //printf("Val: %d\n", val);
  323.             for (int i = r.begin(); i < r.end(); ++i)
  324.             {
  325.                 if (vecTBB[i] < val)
  326.                     val = vecTBB[i];
  327.             }
  328.  
  329.             return val;
  330.         },
  331.         [](int a, int b) { return std::min<int>(a, b); });
  332.  
  333.     end = tbb::tick_count::now();
  334.  
  335.  
  336.     std::cout << "min: " << minn << std::endl;
  337.     printf("Max parallel_reduce time: %g\n\n", (end - start).seconds());
  338.  
  339.  
  340. }
  341.  
  342. void printMatrix(float** matrix, int rows, int cols)
  343. {
  344.     for (int i = 0; i < rows; i++)
  345.     {
  346.         for (int j = 0; j < cols; j++)
  347.         {
  348.             std::cout << matrix[i][j] << " ";
  349.         }
  350.         std::cout << std::endl;
  351.     }
  352. }
  353.  
  354. bool loadMatrix(float**& matrix, const char* path, int& _rows, int& _cols)
  355. {
  356.     std::ifstream dataFile;
  357.     dataFile.open(path);
  358.     int rows, cols;
  359.  
  360.     if (dataFile.fail())
  361.         return false;
  362.  
  363.     dataFile >> rows;
  364.     dataFile >> cols;
  365.  
  366.     matrix = new float* [rows];
  367.     for (int i = 0; i < rows; i++)
  368.     {
  369.         matrix[i] = new float[cols];
  370.     }
  371.  
  372.     for (int i = 0; i < rows; i++)
  373.     {
  374.         for (int j = 0; j < cols; j++)
  375.         {
  376.             float x;
  377.             dataFile >> x;
  378.  
  379.             matrix[i][j] = x;
  380.         }
  381.     }
  382.  
  383.     _rows = rows;
  384.     _cols = cols;
  385.     dataFile.close();
  386.  
  387.  
  388.     return true;
  389. }
  390.  
  391. void generateMatrix(int rows, int cols, const char* path)
  392. {
  393.     std::ofstream outFile;
  394.     outFile.open(path);
  395.     outFile << rows << " " << cols << std::endl;
  396.  
  397.     for (int i = 0; i < rows; i++)
  398.     {
  399.         for (int j = 0; j < cols; j++)
  400.         {
  401.             outFile << (static_cast <float> (rand()) / static_cast <float> (RAND_MAX)) * 100 << " ";
  402.         }
  403.  
  404.         outFile << std::endl;
  405.     }
  406.     outFile.close();
  407. }
  408.  
  409. void clearMemory(float** matrix, int rows)
  410. {
  411.  
  412.     for (int i = 0; i < rows; i++)
  413.     {
  414.         delete[] matrix[i];
  415.     }
  416.     delete[] matrix;
  417. }
  418.  
  419.  
  420.  
  421. void TbbZad6()
  422. {
  423.     srand(time(NULL));
  424.  
  425.     const char* pathA = "matrixA.txt";
  426.     const char* pathB = "matrixB.txt";
  427.  
  428.     generateMatrix(1000, 500, pathA);
  429.     generateMatrix(500, 1000, pathB);
  430.  
  431.     int rowsA, colsA, rowsB, colsB, rowsC, colsC;
  432.     float** matrixA = nullptr;
  433.     float** matrixB = nullptr;
  434.     float** matrixCS = nullptr;
  435.     float** matrixCR = nullptr;
  436.     loadMatrix(matrixA, pathA, rowsA, colsA);
  437.     loadMatrix(matrixB, pathB, rowsB, colsB);
  438.  
  439.     std::cout << "Macierz A" << std::endl;
  440.     //printMatrix(matrixA, rowsA, colsA);
  441.     std::cout << "\nMacierz B" << std::endl;
  442.     //printMatrix(matrixB, rowsB, colsB);
  443.  
  444.     if (rowsA == colsB && rowsB == colsA)
  445.     {
  446.  
  447.         rowsC = rowsA;
  448.         colsC = colsB;
  449.  
  450.         matrixCS = new float* [rowsC];
  451.         matrixCR = new float* [rowsC];
  452.  
  453.         for (int i = 0; i < rowsC; i++)
  454.         {
  455.             matrixCS[i] = new float[colsC];
  456.             matrixCR[i] = new float[colsC];
  457.         }
  458.  
  459.         for (int i = 0; i < rowsC; i++)
  460.         {
  461.             for (int j = 0; j < colsC; j++)
  462.             {
  463.                 matrixCS[i][j] = 0.0;
  464.                 matrixCR[i][j] = 0.0;
  465.             }
  466.         }
  467.  
  468.  
  469.         /****************************************************************/
  470.         std::cout << "SEKWENCYJNIE" << std::endl;
  471.         tbb::tick_count start, end;
  472.         start = tbb::tick_count::now();
  473.         for (int i = 0; i < rowsA; i++)
  474.         {
  475.             for (int j = 0; j < colsB; j++)
  476.             {
  477.                 for (int k = 0; k < colsA; k++)
  478.                 {
  479.                     matrixCS[i][j] += matrixA[i][k] * matrixB[k][j];
  480.                 }
  481.             }
  482.         }
  483.         end = tbb::tick_count::now();
  484.         printf("Sekwencyjnie time: %g\n\n", (end - start).seconds());
  485.  
  486.  
  487.  
  488.         std::cout << "ROWNOLEGLE" << std::endl;
  489.         //tbb::tick_count start, end;
  490.         start = tbb::tick_count::now();
  491.         tbb::parallel_for(0, rowsA, [&](int i)
  492.             {
  493.  
  494.                 for (int j = 0; j < colsB; j++)
  495.                 {
  496.                     for (int k = 0; k < colsA; k++)
  497.                     {
  498.                         matrixCR[i][j] += matrixA[i][k] * matrixB[k][j];
  499.                     }
  500.                 }
  501.             });
  502.         end = tbb::tick_count::now();
  503.         printf("ROWNOLEGLE time: %g\n\n", (end - start).seconds());
  504.  
  505.         /****************************************************************/
  506.         std::cout << "\nMacierz C" << std::endl;
  507.         //printMatrix(matrixC, rowsC, colsC);
  508.  
  509.  
  510.         std::ofstream outFileS;
  511.         std::ofstream outFileR;
  512.         outFileS.open("macierzCS.txt");
  513.         outFileR.open("macierzCR.txt");
  514.         outFileS << rowsC << " " << colsC << std::endl;
  515.         outFileR << rowsC << " " << colsC << std::endl;
  516.  
  517.         for (int i = 0; i < rowsC; i++)
  518.         {
  519.             for (int j = 0; j < colsC; j++)
  520.             {
  521.                 outFileS << matrixCS[i][j] << " ";
  522.                 outFileR << matrixCR[i][j] << " ";
  523.             }
  524.  
  525.             outFileS << std::endl;
  526.             outFileR << std::endl;
  527.         }
  528.  
  529.         outFileS.close();
  530.         outFileR.close();
  531.         clearMemory(matrixA, rowsA);
  532.         clearMemory(matrixB, rowsB);
  533.         clearMemory(matrixCS, rowsC);
  534.         clearMemory(matrixCR, rowsC);
  535.     }
  536.     else
  537.     {
  538.         std::cout << "Error matrix size not correct!!!" << std::endl;
  539.     }
  540. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement