Advertisement
Guest User

Untitled

a guest
Dec 12th, 2019
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.03 KB | None | 0 0
  1. #include "pch.h"
  2. #include <iostream>
  3. #include <future>
  4. #include <chrono>
  5. #include <algorithm>
  6. #include <utility>
  7. #include <vector>
  8. #include <random>
  9. using namespace std;
  10.  
  11. // functions' declaration
  12. pair<int, int> extremaElemIndexes(vector<int> subArray);
  13. int inputArraySize();
  14. vector<int> createArray(int arraySize);
  15. vector<future<pair<int, int>>> createAsyncArray(vector<int> array, int numberOfTasks);
  16. pair<pair<int, int>, pair<int, int>> getAsyncResults(
  17. vector<int> array, vector<future<pair<int, int>>> &asyncArray, int numberOfTasks
  18. );
  19. void printResults(pair<pair<int, int>, pair<int, int>> valuesAndIndexes);
  20.  
  21. // main
  22. int main()
  23. {
  24. vector<int> array = createArray(inputArraySize());
  25.  
  26. pair<int, int> values = make_pair(INT32_MAX, INT32_MIN);
  27. pair<int, int> indexes;
  28. pair<pair<int, int>, pair<int, int>> valuesAndIndexes;
  29.  
  30. for (int numberOfTasks = 2; numberOfTasks <= 16; numberOfTasks *= 2) {
  31. chrono::high_resolution_clock::time_point timeStart = chrono::high_resolution_clock::now();
  32.  
  33. vector<future<pair<int, int>>> asyncArray = createAsyncArray(array, numberOfTasks);
  34. valuesAndIndexes = getAsyncResults(array, asyncArray, numberOfTasks);
  35.  
  36. chrono::high_resolution_clock::time_point timeFinish = chrono::high_resolution_clock::now();
  37. cout << "time spent for " << numberOfTasks << " tasks: " <<
  38. chrono::duration_cast<chrono::milliseconds>(timeFinish - timeStart).count() << "ms\n\n";
  39. }
  40.  
  41. printResults(valuesAndIndexes);
  42.  
  43. return 0;
  44. }
  45.  
  46. // other functions
  47.  
  48. pair<int, int> extremaElemIndexes(vector<int> subArray) {
  49. return make_pair(distance(subArray.begin(), min_element(subArray.begin(), subArray.end())),
  50. distance(subArray.begin(), max_element(subArray.begin(), subArray.end())));
  51. }
  52.  
  53. int inputArraySize() {
  54. int size;
  55. cin >> size;
  56.  
  57. if (size > 100000) {
  58. cout << "\n";
  59. return size;
  60. }
  61.  
  62. return inputArraySize();
  63. }
  64.  
  65. vector<int> createArray(int arraySize) {
  66. random_device rd;
  67. default_random_engine generator(rd());
  68. uniform_int_distribution<int> distribution(INT32_MIN, INT32_MAX);
  69.  
  70. vector<int> array(arraySize);
  71.  
  72. for (int i = 0; i < array.size(); i++) {
  73. array[i] = distribution(generator);
  74. }
  75. cout << "\n";
  76.  
  77. return array;
  78. }
  79.  
  80. vector<future<pair<int, int>>> createAsyncArray(vector<int> array, int numberOfTasks) {
  81. vector<future<pair<int, int>>> asyncArray(numberOfTasks);
  82.  
  83. for (int i = 0; i < asyncArray.size(); i++) {
  84. vector<int>::iterator sliceBegin = array.begin() + array.size() / numberOfTasks * i;
  85. vector<int>::iterator sliceEnd = i != asyncArray.size() - 1 ?
  86. array.begin() + array.size() / numberOfTasks * (i + 1) :
  87. array.end();
  88.  
  89. asyncArray[i] = async(
  90. launch::async,
  91. extremaElemIndexes,
  92. vector<int>(sliceBegin, sliceEnd)
  93. );
  94. }
  95.  
  96. return asyncArray;
  97. }
  98.  
  99. pair<pair<int, int>, pair<int, int>> getAsyncResults(
  100. vector<int> array, vector<future<pair<int, int>>> &asyncArray, int numberOfTasks
  101. ) {
  102. int valueToCompare;
  103. pair<int, int> currentIndexes;
  104. pair<pair<int, int>, pair<int, int>> valuesAndIndexes;
  105.  
  106. for (int i = 0; i < asyncArray.size(); i++) {
  107. currentIndexes = asyncArray[i].get();
  108.  
  109. valueToCompare = *(array.begin() + array.size() / numberOfTasks * i + currentIndexes.first);
  110. if (valueToCompare < valuesAndIndexes.first.first) {
  111. valuesAndIndexes.first.first = valueToCompare;
  112. valuesAndIndexes.second.first = array.size() / numberOfTasks * i + currentIndexes.first;
  113. }
  114.  
  115. valueToCompare = *(array.begin() + array.size() / numberOfTasks * i + currentIndexes.second);
  116. if (valueToCompare > valuesAndIndexes.first.second) {
  117. valuesAndIndexes.first.second = valueToCompare;
  118. valuesAndIndexes.second.second = array.size() / numberOfTasks * i + currentIndexes.second;
  119. }
  120. }
  121.  
  122. return valuesAndIndexes;
  123. }
  124.  
  125. void printResults(pair<pair<int, int>, pair<int, int>> valuesAndIndexes) {
  126. cout << "min value: " << valuesAndIndexes.first.first <<
  127. " at index " << valuesAndIndexes.second.first << "\n";
  128. cout << "max value: " << valuesAndIndexes.first.second <<
  129. " at index " << valuesAndIndexes.second.second << "\n";
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement