Advertisement
Guest User

ZidekThreads

a guest
Nov 13th, 2019
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.15 KB | None | 0 0
  1. // Thready2.cpp : This file contains the 'main' function. Program execution begins and ends there.
  2. //
  3.  
  4. #include <iostream>
  5. #include <random>
  6. #include <time.h>
  7. #include <thread>
  8.  
  9. using std::cout;
  10. using std::endl;
  11.  
  12. #define TYPE int
  13. #define LENGTH 100000
  14. #define COUNT 100
  15.  
  16. std::random_device dev;     // rd
  17. std::mt19937 rng(dev());    // eng
  18.  
  19.  
  20. // class for one part of task
  21. class TaskPart
  22. {
  23. public:
  24.     int m_id;                       // user thread identification
  25.     int m_from, m_length, m_to;     // data range
  26.     TYPE* m_data;                   // array
  27.     TYPE m_max;                     // result
  28.  
  29.     TaskPart() {}
  30.  
  31.     TaskPart(int t_myid, int t_from, int t_length, TYPE* t_data) :
  32.         m_id(t_myid), m_from(t_from), m_length(t_length), m_to(t_from + t_length), m_data(t_data) {}
  33.  
  34.     void generate_values() {
  35.         std::uniform_real_distribution<> distr(0, LENGTH); // define the range
  36.         for (int i = m_from; i < m_from + m_length; i++)
  37.             m_data[i] = distr(rng);
  38.     }
  39.  
  40.     void print_all() {
  41.         for (int i = m_from; i < m_from + m_length; i++)
  42.             cout << m_data[i] << ' ';
  43.             cout << endl;
  44.     }
  45.     void bubbleSort() {
  46.         for (int i = m_from; i < m_from + m_length; i++) {
  47.             // Last i elements are already in place  
  48.             for (int j = 0; j < m_from + m_length - i; j++)
  49.                 if (m_data[j] < m_data[j + 1]) {
  50.                     TYPE temp = m_data[j];
  51.                     m_data[j] = m_data[j + 1];
  52.                     m_data[j + 1] = temp;
  53.                 }
  54.         }
  55.     }
  56.  
  57.     void insertionSort() {
  58.         long long i, j;
  59.         TYPE key;
  60.         for (i = 1 + m_from; i < m_from + m_length; i++) {
  61.             key = m_data[i];
  62.             j = i - 1;
  63.             while (j >= 0 && m_data[j] < key) {
  64.                 m_data[j + 1] = m_data[j];
  65.                 j = j - 1;
  66.             }
  67.             m_data[j + 1] = key;
  68.         }
  69.     }
  70.  
  71.     void selectionSort() {
  72.         long long i, j, min_idx;
  73.         for (i = m_from; i < m_from + m_length - 1; i++) {
  74.             min_idx = i;
  75.             for (j = i + 1; j < m_from + m_length; j++)
  76.                 if (m_data[j] > m_data[min_idx])
  77.                     min_idx = j;
  78.  
  79.             TYPE temp = m_data[i];
  80.             m_data[i] = m_data[min_idx];
  81.             m_data[min_idx] = temp;
  82.         }
  83.     }
  84.  
  85. };
  86.  
  87. void print(TYPE* arr, long from, long to) {
  88.     std::cout << "\n";
  89.     for (int i = from; i < to; i++) {
  90.         std::cout << arr[i] << " ";
  91.     }
  92.     std::cout << "\n";
  93. }
  94.  
  95. void ParallelGenerator(TYPE* arr, long length, int threadCount) {
  96.     //cout << "Running generating on " << threadCount << " threads." << std::endl;
  97.     auto startTime = std::chrono::system_clock::now();
  98.  
  99.     std::thread* threads = new std::thread[threadCount];
  100.     TaskPart* parts = new TaskPart[threadCount];
  101.  
  102.     int partLength = length / threadCount;
  103.  
  104.     for (int j = 0; j < threadCount; j++) {
  105.         if (j < (threadCount - 1))
  106.             parts[j] = TaskPart(j, (partLength * j), partLength, arr);
  107.         else
  108.             parts[j] = TaskPart(j, (partLength * j), partLength + (length % threadCount), arr); // add the remaining fields
  109.  
  110.         threads[j] = std::thread(&TaskPart::generate_values, parts[j]);
  111.     }
  112.  
  113.     for (int j = 0; j < threadCount; j++) {
  114.         threads[j].join();
  115.     }
  116.  
  117.     delete[] threads;
  118.     delete[] parts;
  119.  
  120.     auto endTime = std::chrono::system_clock::now();
  121.     long dur = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count();
  122.     std::cout << "Iteration done. (" << dur << " ms)" << std::endl << std::endl;
  123. }
  124.  
  125. // zatial len selection funguje dobre
  126. void ParallelSort(TYPE* arr, long length, int threadCount) {
  127.     std::cout << "Running selection sort on " << threadCount << " threads." << std::endl;
  128.     auto startTime = std::chrono::system_clock::now();
  129.  
  130.     std::thread* threads = new std::thread[threadCount];
  131.     TaskPart* parts = new TaskPart[threadCount];
  132.  
  133.     int partLength = length / threadCount;
  134.  
  135.     for (int j = 0; j < threadCount; j++) {
  136.         if (j < (threadCount - 1))
  137.             parts[j] = TaskPart(j, (partLength * j), partLength, arr);
  138.         else
  139.             parts[j] = TaskPart(j, (partLength * j), partLength + (length % threadCount), arr); // add the remaining fields
  140.         //std::cout << "Generating thread " << j << ", sorting from index " << parts[j].m_from << " to " << parts[j].m_length + parts[j].m_from-1 << std::endl;
  141.         threads[j] = std::thread(&TaskPart::selectionSort, parts[j]);
  142.     }
  143.  
  144.     for (int j = 0; j < threadCount; j++) {
  145.         threads[j].join();
  146.     }
  147.     delete[] threads;
  148.     delete[] parts;
  149.  
  150.     auto endTime = std::chrono::system_clock::now();
  151.     long dur = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count();
  152.     std::cout << "Iteration done. (" << dur << " ms)" << std::endl << std::endl;
  153.  
  154. }
  155.  
  156. void ArraysMerge(TYPE*& l_my_array, TYPE*& buffer, long start, long firstpartsize, long secondpartsize, long threads) { //DEPRECATED
  157.         //auto startTime = std::chrono::system_clock::now();
  158.  
  159.     int secondstart = firstpartsize + start;
  160.  
  161.  
  162.     int i = start, j = secondstart, k = start;
  163.  
  164.     // Traverse both array
  165.     while (i < start + firstpartsize && j < secondstart + secondpartsize)
  166.     {
  167.         // Check if current element of first
  168.         // array is smaller than current element
  169.         // of second array. If yes, store first
  170.         // array element and increment first array
  171.         // index. Otherwise do same with second array
  172.         if (l_my_array[i] > l_my_array[j])
  173.             buffer[k++] = l_my_array[i++];
  174.         else
  175.             buffer[k++] = l_my_array[j++];
  176.     }
  177.  
  178.     // Store remaining elements of first array
  179.     while (i < start + firstpartsize)
  180.         buffer[k++] = l_my_array[i++];
  181.  
  182.     // Store remaining elements of second array
  183.     while (j < secondstart + secondpartsize)
  184.         buffer[k++] = l_my_array[j++];
  185.     //print(buffer, start, end);
  186.     //delete l_my_array;
  187.     for (int i = start; i < start + firstpartsize + secondpartsize; i++)
  188.         l_my_array[i] = buffer[i];
  189.     //l_my_sorted_array = nullptr;
  190.  
  191.     //auto endTime = std::chrono::system_clock::now();
  192.     //long dur = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count();
  193.     //std::cout << "Iteration done. (" << dur << " ms)" << std::endl << std::endl;
  194. }
  195.  
  196. void bigMerge(TYPE*& l_my_array, long length, int threads) { //DEPRECATED
  197.     std::cout << "Running merging " << threads << " arrays." << std::endl;
  198.     auto startTime = std::chrono::system_clock::now();
  199.     TYPE* buffer = new TYPE[length];
  200.     int partLength = length / threads;
  201.     for (int i = 0; i < partLength; i++)
  202.     {
  203.         buffer[i] = l_my_array[i];
  204.     }
  205.     for (int i = partLength; i < length - partLength + 1; i += partLength)
  206.     {
  207.         int from = i;
  208.         int to = i + partLength;
  209.         if (length - to < partLength)
  210.             to = length;
  211.  
  212.         ArraysMerge(l_my_array, buffer, 0, i, to - from, 2);
  213.     }
  214.  
  215.     auto endTime = std::chrono::system_clock::now();
  216.     long dur = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count();
  217.     std::cout << "Iteration done. (" << dur << " ms)" << std::endl << std::endl;
  218. }
  219.  
  220. void mergeAll(TYPE*& arr, long length, int threadCount) {
  221.     std::cout << "Running merging " << threadCount << " arrays." << std::endl;
  222.     auto startTime = std::chrono::system_clock::now();
  223.     TYPE* out = new TYPE[length];
  224.     TaskPart* parts = new TaskPart[threadCount];
  225.  
  226.     int partLength = length / threadCount;
  227.  
  228.     for (int j = 0; j < threadCount; j++) {
  229.         if (j < (threadCount - 1))
  230.             parts[j] = TaskPart(j, (partLength * j), partLength, arr);
  231.         else
  232.             parts[j] = TaskPart(j, (partLength * j), partLength + (length % threadCount), arr); // add the remaining fields
  233.     }
  234.  
  235.     unsigned j = 0;
  236.     unsigned flag = 0;
  237.     while (j < length)
  238.     {
  239.         TYPE min = INT64_MIN;
  240.         for (unsigned i = 0; i < threadCount; i++)
  241.         {
  242.             if (arr[parts[i].m_from] > min&& parts[i].m_from < parts[i].m_to)
  243.             {
  244.                 min = arr[parts[i].m_from];
  245.                 flag = i;
  246.             }
  247.         }
  248.         out[j] = min;
  249.         parts[flag].m_from += 1;
  250.         j++;
  251.     }
  252.     delete arr;
  253.     arr = out;
  254.     auto endTime = std::chrono::system_clock::now();
  255.     long dur = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count();
  256.     std::cout << "Iteration done. (" << dur << " ms)" << std::endl << std::endl;
  257. }
  258.  
  259. bool validateSortedArray(TYPE* l_my_array, long l_my_length) {
  260.     for (int i = 0; i < l_my_length - 1; i++)
  261.     {
  262.         if (l_my_array[i] < l_my_array[i + 1])
  263.             return false;
  264.     }
  265.     return true;
  266. }
  267.  
  268. int main() {
  269.     TYPE* array = new TYPE[LENGTH];
  270.  
  271.     ParallelGenerator(array, LENGTH, COUNT);
  272.  
  273.     //print(array, 0, LENGTH);
  274.  
  275.     ParallelSort(array, LENGTH, COUNT);
  276.  
  277.     //print(array, 0, LENGTH);
  278.  
  279.     mergeAll(array, LENGTH, COUNT);
  280.  
  281.     //print(array, 0, LENGTH);
  282.  
  283.     std::cout << std::boolalpha << "Sorted: " << validateSortedArray(array, LENGTH) << std::endl;
  284. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement