Facebook
From Whipped Partdridge, 3 Years ago, written in Plain Text.
This paste is a reply to Untitled from Putrid Cat - view diff
Embed
Download Paste or View Raw
Hits: 88
  1. #include <iostream>
  2. #include <vector>
  3. #include <thread>
  4. #include <cstdlib>
  5. #include <ctime>
  6.  
  7. using namespace std;
  8. using namespace std::chrono;
  9.  
  10. #define SIZE 2000 //1000 i 2000
  11. #define LICZBA_WATKOW 4 //1, 2 i 4
  12.  
  13. int A[SIZE][SIZE];
  14. int B[SIZE][SIZE];
  15. int Bt[SIZE][SIZE];
  16. int C[SIZE][SIZE];
  17.  
  18. void wyzeruj()
  19. {
  20.         for (int i = 0; i < SIZE; i++)
  21.         {
  22.                 for (int j = 0; j < SIZE; j++)
  23.                 {
  24.                         C[i][j] = 0;
  25.                 }
  26.         }
  27. }
  28.  
  29. void losowe_wartosci()
  30. {
  31.         srand(10);
  32.         for (int i = 0; i < SIZE; i++)
  33.         {
  34.                 for (int j = 0; j < SIZE; j++)
  35.                 {
  36.                         A[i][j] = rand() % 10;
  37.                         B[i][j] = rand() % 10;
  38.                 }
  39.         }
  40. }
  41.  
  42. void transponowanie()
  43. {
  44.         for (int i = 0; i < SIZE; i++)
  45.         {
  46.                 for (int j = 0; j < SIZE; j++)
  47.                 {
  48.                         Bt[i][j] = B[j][i];
  49.                 }
  50.         }
  51. }
  52.  
  53. void pomnoz_macierze(int start, int stop)
  54. {
  55.         for (int i = start; i < stop; i++)
  56.         {
  57.                 for (int j = 0; j < SIZE; j++)
  58.                 {
  59.                         for (int k = 0; k < SIZE; k++)
  60.                         {
  61.                                 C[i][j] += A[i][k] * B[k][j];
  62.                         }
  63.                 }
  64.         }
  65. }
  66.  
  67. void pomnoz_macierze_transpon(int start, int stop)
  68. {
  69.         for (int i = start; i < stop; i++)
  70.         {
  71.                 for (int j = 0; j < SIZE; j++)
  72.                 {
  73.                         for (int k = 0; k < SIZE; k++)
  74.                         {
  75.                                 C[i][j] += A[i][k] * Bt[j][k]; //[j][k] bo transponowane
  76.                         }
  77.                 }
  78.         }
  79. }
  80.  
  81. void sekwencyjnie()
  82. {
  83.         duration<double> elapsed_seconds;
  84.     time_point<system_clock> begin = system_clock::now();
  85.         pomnoz_macierze(0,SIZE);
  86.     elapsed_seconds = system_clock::now() - begin;
  87.     cout << "Czas wykonania: " << elapsed_seconds.count() << " s" << endl;
  88. }
  89.  
  90. void sekwencyjnie_transpon()
  91. {
  92.         transponowanie();
  93.         duration<double> elapsed_seconds;
  94.     time_point<system_clock> begin = system_clock::now();
  95.         pomnoz_macierze_transpon(0,SIZE);
  96.     elapsed_seconds = system_clock::now() - begin;
  97.     cout << "Czas wykonania: " << elapsed_seconds.count() << " s" << endl;
  98. }
  99.  
  100. void watki()
  101. {
  102.         duration<double> elapsed_seconds;
  103.         std::vector<std::thread*> v;
  104.         int rozmiar_paczki = SIZE / LICZBA_WATKOW;
  105.     time_point<system_clock> begin = system_clock::now();
  106.         for (int i = 0; i < LICZBA_WATKOW; i++)
  107.         {
  108.                 if (i == LICZBA_WATKOW - 1) //ostatni watek
  109.                 {
  110.                         v.push_back(new std::thread{ pomnoz_macierze, i * rozmiar_paczki, SIZE });
  111.                 }
  112.                 else
  113.                 {
  114.                         v.push_back(new std::thread{ pomnoz_macierze, i * rozmiar_paczki, i * rozmiar_paczki + rozmiar_paczki });
  115.                 }
  116.         }
  117.         for (int i = 0; i < LICZBA_WATKOW; i++)
  118.         {
  119.                 v[i]->join();
  120.                 delete v[i];
  121.         }
  122.     elapsed_seconds = system_clock::now() - begin;
  123.     cout << "Czas wykonania: " << elapsed_seconds.count() << " s" << endl;
  124. }
  125.  
  126. void watki_transpon()
  127. {
  128.         transponowanie();
  129.         duration<double> elapsed_seconds;
  130.         std::vector<std::thread*> v;
  131.         int rozmiar_paczki = SIZE / LICZBA_WATKOW;
  132.     time_point<system_clock> begin = system_clock::now();
  133.         for (int i = 0; i < LICZBA_WATKOW; i++)
  134.         {
  135.                 if (i == LICZBA_WATKOW - 1) //ostatni watek
  136.                 {
  137.                         v.push_back(new std::thread{ pomnoz_macierze_transpon, i * rozmiar_paczki, SIZE });
  138.                 }
  139.                 else
  140.                 {
  141.                         v.push_back(new std::thread{ pomnoz_macierze_transpon, i * rozmiar_paczki, i * rozmiar_paczki + rozmiar_paczki });
  142.                 }
  143.         }
  144.         for (int i = 0; i < LICZBA_WATKOW; i++)
  145.         {
  146.                 v[i]->join();
  147.                 delete v[i];
  148.         }
  149.     elapsed_seconds = system_clock::now() - begin;
  150.         cout << "Czas wykonania: " << elapsed_seconds.count() << " s" << endl;
  151. }
  152.  
  153. void wyswietl()
  154. {
  155.         std::cout << "Macierz C:" << std::endl;
  156.         for (int i = 0; i < 5; i++)
  157.         {
  158.                 for (int j = 0; j < 5; j++)
  159.                 {
  160.                         std::cout << C[i][j] << "\t";
  161.                 }
  162.                 std::cout << std::endl;
  163.         }
  164. }
  165.  
  166. int main()
  167. {
  168.         losowe_wartosci();
  169.         wyzeruj();
  170.         //sekwencyjnie();
  171.         //sekwencyjnie_transpon();
  172.         //watki();
  173.         watki_transpon();
  174.         wyswietl();
  175.         return 0;
  176. }

Replies to Re: Untitled rss

Title Name Language When
Re: Re: Untitled Little Bison text 3 Years ago.